SPI (Serial Peripheral Interface; 직렬 주변기기 인터페이스) 에 대한 이해

Posted on

최근 4주간 공부에 임할 의지가 발동하고 글의 의미를 알 수 있는 모드가 이어져서 공부를 이어가고 있습니다. 매형과 매형 친구분들이 조건 형성을 해주시니 이해를 해서 이행안함 상태에서 나와서 IT 공부가 이어집니다. 최근 사흘간은 생계지속용 플러터 소스코드 작성을 했는데 SPI에 대해서도 이해가 되어 글 올립니다. 전번에 질문드린 글에서 시도님께서 추천해주신 SPI에 대한 이해의 심도 형성과 잉크킹님께서 말씀하신 소프트웨어와 하드웨어 사이의 표준과 응용도 자연스럽게 이해하고 있습니다. 저도 토론에서 말씀해주신 것을 이해할 수 있으니 말씀주시면 이해에 조력이 되어주실 것입니다 ^^

SPI는 동기화된 통신이 되는 인터페이스의 하나로, 1979년에 모토롤라에서 발표한 통신 인터페이스입니다. 보통 4개의 와이어로 연결해서 마스터, 슬레이브를 연결하며 콘트롤러가 마스터, 주변기기가 슬레이브입니다.

SPI 버스는 다음과 같은 네개의 라인으로 주고 받습니다. (시도님께서 필수로 알아야 한다고 정성들여 써주셔서 동기 부여가 강하게 되었습니다^^ 감사합니다)

SCLK: 직렬 클락 (마스터로부터 클락 신호가 출력)
MOSI: Master Out Slave In (데이터 신호가 마스터로부터 출력)
MISO: Master In Slave Out (데이터 신호가 슬레이브로부터 출력)
CS / SS: Chip Select, Slave Select (어느 슬레이브에 보낼 것인가 결정)

SCLK는 시스템 클락을 신호로 보냅니다
MOSI는 슬레이브로 신호를 보내는 라인이고 MISO는 마스터로 보내는 라인입니다
슬레이브 선택은 chip select 라인에 의해 됩니다
슬레이브밖에 없는 장치는 MOSI가 SDI (Serial Data In), MISO가 SDO (Serial Data Out) 으로 표기되기도 합니다.

각각의 라인별 기능을 지시하는 다른 약호들은

SCLK = SCK, CLK, SCL
MOSI = SIMO, MTSR, SDI, DI ,DIN, SI
MISO = SOMI, MRST, SDO, DO, DOUT, SO
SS = SSEL, NSS, CS, CSN, CE

입니다.

SPI 통신에 의한 데이터 송수신은 두개의 시프트 레지스터를 통해 환형 버퍼로 이루어집니다. 마스터와 슬레이브가 각각 신호를 8비트로 구성해서 주고받습니다. 이 경우 총 16비트가 쓰입니다. 이 비트들이 시프트되어가면서 전송이 이루어집니다. 비트수는 경우에 따라 달라지기도 합니다.

때로는 Dual SPI인 경우, 전송 비트는 3비트로 된다고도 하는데 전에 소스코드 보던 당시의 의문이 풀렸습니다. 그러나 3비트가 마스터/슬레이브 통신 16비트의 일부분일뿐인지 아니면 전체를 의미하는지는 미상입니다. 지금 공부하려는 LCD의 SPI가 Dual SPI나 Quad SPI가 아니라면, 제가 쓰려고 한 Pico-LCD-1.44 제어와는 상관이 있는지 확인해봐야 합니다. 잉크킹님께서 HW와 SW 구현이 서로 다르다는 것과 관련이 있는 것 같습니다. 저도 눈치를 챘었는데 그 사례가 Dual SPI와 Quad SPI에서 있는 것 같습니다.

신호를 주고 받을때의 동기화는 생성된 클락 라인의 high와 low를 검사해서 데이터 라인에서 값을 읽습니다. 클락을 생성하면 좋은 장점은 클락 배분에 의해 동기화가 된다는 것입니다. 클락 라인을 생성하는 장치는 마스터, 나머지 참여한 기기는 슬레이브 입니다. 클락 신호는 마스터에서만 보내며 마스터에서 데이터 신호를 전송하는 경우 SCLK, MOSI, 데이터 라인을 쓰며 슬레이브에서 전송하는 경우 MISO를 씁니다. SS는 별도의 신호 선을 연결하는 라인인데, 마스터에서 슬레이브로 연결하여 칩에서 어느 슬레이브와 통신할지 결정하는 역할을 합니다.

슬레이브 연결은 SS 마스터 단에 여러개 두고 여러개의 슬레이브를 연결하는 방법도 있고, 이와 다르게 각각의 마스터 단에 하나의 SS만 두고 여러개의 선으로 여러개의 슬레이브에 연결하기도 합니다. 이로부터 1:N 연결이 성립합니다.

응용마다 다르지만 보통 전이중 모드와 4개 와이어로 동기 전송, 프로그래밍 가능한 clock polarity, clock phase를 갖습니다.

때로는 와이어가 3개이기도 하고 여러 기능이 분기됩니다. GPIO에 분배된 기능을 잘보고 케이블을 연결하면 되고, GPIO 익스텐더를 쓰면 일부러 공들여 분별하지 않아도 통신이 가능할 것 같습니다.

아래와 같은 신호 파형 분석과 모드 번호로 상태를 알아볼 수 있습니다.

  • 전이중 통신 = 양방향 동시 송수신 가능 (전화받으면서 듣기와 말하기가 동시에 된다)
  • 반이중 통신 = 단방향 송수신만 가능

일단 인터넷 문서들만 참조해서 기록에 남깁니다.

https://en.wikipedia.org/wiki/Serial_Peripheral_Interface
https://twinw.tistory.com/149
https://gudgud.tistory.com/30
https://www.hardcopyworld.com/?p=2778
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all
https://www.analog.com/en/analog-dialogue/articles/introduction-to-spi-interface.html

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다