개발/아두이노-Arduino

SPI 통신

어중E 2022. 9. 25. 20:07

SPI 통신

SPI 통신은 Serial Peripheral Interface의 약자로 시리얼 통신 중 하나입니다. 이 SPI은 여러 가지가 있지만 기본적인 연결은 다음과 같습니다.

 

마스터 기기와 슬레이브 기기간의 통신의 연결입니다. 여기에 사용되는 MISO, MOSI, SCK, CS 핀은 기기나 제조사에 따라 다른 이름으로 불립니다. 이는 헷갈리기 쉽기 때문에 정리해둔 글을 참조해주시면 좋습니다. 일단 많이 사용되는 이름인 위 이름을 사용하겠습니다. 

 

간단하게 핀을 알아보면 다음과 같습니다.

  • MOSI (Master Out, Slave In) : 데이터를 슬레이브에서 받고, 마스터에서 나가는 핀
  • MISO (Master In, Slave Out) : 데이터를 마스터에서 받고, 슬레이브에서 나가는 핀
  • CS (Chip Select) : 데이터를 전송보낼 칩(슬레이브)을 선택하는 핀, 이 핀이 활성화되어야 통신할 수 있다.
  • SCK (Serial Clock) : 클럭 핀, 주기적으로 High 와 Low를 반복합니다. CS 핀이 활성화되고, 클럭이 생성된다.

SPI 모드

SPI 모드라는 것이 있습니다. SPI 통신을 적용할 때에 어떤 디바이스나 마스터가 특정 모드만 지원한다면, 해당 모드에 맞춰서 디바이스들을 통일시킬 필요가 있습니다.

 

그럼 모드라는 것은 어떤 것인가? 그림으로 쉽게 나타내겠습니다.

출처 : www.corelis.com

SCK 핀은 클럭 핀을 지칭한다고 했습니다. 그럼 이 핀은 클럭을 발생시킬겁니다. 위 그림에서 보시면 SS(CS와 동일) 핀이 LOW로 되었을 때 SCK 핀들이 클럭을 발생시킵니다. IO는 데이터라고 보시면 됩니다.

 

하지만 클럭이 발생하는 것들이 다 다릅니다. 이는 클럭이 발생할 때 상승(Low -> High)에 데이터를 읽을지 저장할지 하강(High -> Low)에 데이터를 읽을지 저장할지를 결정합니다. 아두이노 프레임워크에서는 SPI.h에 모드 설정 함수가 포함되어 있습니다.

  • CPOL은 Clock Polarity 이며, 이 값이 0일 경우 클럭을 생성하지 않을 때 LOW, 이 값이 1일 경우 HIGH입니다.
  • CPHA는 Clock Phase이며, 이 값이 0일 경우 상승일 때 데이터를 읽고, 이 값이 1일 경우 하강일 때 데이터를 읽습니다.

물론 이런 모드 결정은 디바이스를 제공하는 업체나 제조사에서 라이브러리를 제공한다면, 해당 라이브러리에서 처리되기에 라이브러리 사용법만 알고 있으면 크게 생각하지 않아도 됩니다. 

 

SPI 핀 설정 종류

아래는 SPI 방식으로 많이 사용되는 디스플레이 ST7789의 데이터 시트 중 일부분입니다.

ST7789 데이터중 일부

기본적으로 설명했던 것이 표 3번째에 있는 3-Line serial interface입니다. CS핀과 클럭 핀(DC), SDA와 SDO핀이 있습니다. 이는 기본적인 방식이지만 다른 방식으로도 통신할 수 있습니다. 해당 방식에 따른 통신 방법만 적용하면 됩니다. 이런 복잡함을 피하려면, 해당 부품의 라이브러리가 있는지 확인하고, 라이브러리를 적극 활용합니다.

 

데이터 스트림

SPI 데이터 스트림의 구조는 정해진 게 없습니다. 어떻게 정할지는 설계자에 따라 달려있지만, 보통은 어느 정도 형태를 맞춥니다. 위의 예시인 ST7789 데이터 시트에서 3-Line serial interface 방식을 사용할 때 어떤 데이터 스트림(구조)을 띄는지 아래의 그림에 나와있습니다.

 

ST7789 데이터중 일부

SDA를 데이터라고 보면, 해당 각 데이터들을 클럭에 맞추어 어떻게 보내는지 확인합니다. 이는 예시의 일부이며 데이터 스트림 방식도 여러 가지가 있습니다. 이는 데이터 시트를 확인하여야 합니다. 모드와 핀 설정에 따라 종류별로 다르게 설명되어 있습니다.