본문 바로가기

프로젝트/임베디드

[이론] SPI 통신

반응형

직렬 주변장치 인터페이스(SPI, Serial Peripheral Interface)

SPI는 마스터/슬레이브 통신을 기반으로 하는 통신 방식이다. 이름에서 알 수 있듯이 주변 장치를 제어하기 위하여 설계되었다.

마스터에 의해 여러 슬레이브가 제어되며, 하나의 버스를 여러 주변 장치들이 공유하며 통신할 수 있다. 단 이 경우에는 매체 별로 접근 방법과 제어선이 사전에 구비되어 있어야 한다. 전이중 핀 환경설정과 동기화된 클록 덕분에 UART 통신에 비해서 클록 뒤틀림에 더욱 강건하고, 더 빠른 속도로 통신할 수도 있다.

 

장점 : 고속 데이터 송수신, 단순한 하드웨어 구성, full duplex, 멀티 슬레이브 지원, 버스 충돌 없음

단점 : 슬레이브 장치에 비례하는 핀 수 증가, 거리 제한, 표준화의 부재, 에러 검출 기능의 부족

 

항목 SPI I2C UART
통신 방식 동기식(풀 듀플렉스) 동기식(하프 듀플렉스) 비동기식(하프 듀플렉스)
데이터 속도 매우 빠름 (최대 수십 MHz) 중간 (수백 kbps~수 Mbps) 비교적 느림 (수십 kbps~수 Mbps)
핀 수 많음 (4개 + 슬레이브 수 만큼) 적음 (2개: SDA, SCL) 적음 (2개: TX, RX)
슬레이브 주소 없음 (CS 핀으로 선택) 7bit 또는 10bit 주소 사용 없음
거리 짧음 (수 미터 이내) 중간 (수 미터) 상대적으로 김 (수십 미터 이상 가능)

 

핀 구성

  • SCLK : 클럭 신호(마스터 => 슬레이)
  • MOSI : Mater에서 나와서 Slave로 데이터가 들어간다.
  • MISO : Slave에서 나와서 Master로 데이터가 들어간다.
  • CS : 특정 슬레이브를 선택한다.(Active low)

프로토콜 상세

1. 마스터의 CS 핀 활성화

2. 클럭 생성(SCLK) 

3. 데이터 송수신 - 상승 에지 또는 하강 에지에 통신

4. 전송 종료 및 CS 비활성화

 

프로그래밍 하는 입장에서는 결국 레지스터 설정 함수(RCC, GPIO, SPI_CR etc) => char 단위 read(), write() => string 단위 read(), write()로 통신 함수를 구현할 것이다. UART 때와 마찬가지로 CMSIS 라이브러리와 C 라이브러리만을 사용하여 구현할 것이다. 

 

SPI 블록 다이어그램(STM32F103RBT6)

 

프로그래밍 메뉴얼에 통신에 대한 내용이 자세히 설명되어 있다. 간단하게 설명하자 마스터로부터 생성된 클럭 신호에 맞추어 데이터를 송신하거나 수신하는 것이다. 어느 슬레이브에서 데이터를 받았는지는 SS 핀을 사용하여 구분한다.

관여하는 레지스터

레지스터 주요 기능
SPI_CR1 동작 모드, 클럭 설정, 데이터 길이, CRC 활성화
SPI_CR2 인터럽트, DMA 설정, 프레임 포맷
SPI_SR 상태 확인(버퍼 상태, 오류 상태)
SPI_DR 데이터 송수신 버퍼
SPI_CRCPR CRC 폴리노미얼 설정
SPI_RXCRCR/TXCRCR 수신/송신 CRC 결과 저장

자세한 내용은 프로그래밍 메뉴얼 참조

 

데이터 시트

https://www.keil.com/dd/docs/datashts/st/stm32f10xxx.pdf

 

반응형

'프로젝트 > 임베디드' 카테고리의 다른 글