본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 20강. SPI통신 제대로 배워보자!

by 덤더리덤떰 2025. 1. 25.

1. SPI(Serial Peripheral Interface)

  • 근거리에서 많이 사용하는 통신
  • 전압차 이용하여 2가닥 통해 데이터 주고받음 

 

1-1. Timebase (RS485, RS232 ...)

: 내가 보낼 데이터를 서로 약속한 시간으로 쪼개서 보냄 

ex) bps 9600 (1초를 9600개로 나눔) 

: 1초마다 내가 보낸 데이터를 9600개로 나누어서 1/0으로 구분 

 

1-2. 클럭 

: LOW에서 시작하면 HIGH -> LOW가 하나의 주기 

: 클럭 기준으로 데이터가 HIGH이면 1, LOW면 0으로 구분 

=> SPI는 클럭을 이용

클럭 한 주기

 

=> 따라서, SPI통신은 데이터 선과 클럭 선이 반드시 존재 해야함 

 

2. SPI통신의 데이터 주고받는 방식 

 

2-1. 1:1

  • 데이터 주고 받는 선이 1개인 경우 (반이중 방식)
    : A가 데이터 선으로 전압을 내보낼 때 B는 아무것도 하면 안됨 
  • 데이터 주고 받는 선이 2개인 경우 (전이중 방식)
    : A와 B가 각각 말하는 전용 선이 존재하고 클럭 선이 연결
    : A는 A의 전용선을 통해, B는 B의 전용선을 통해 데이터 전송 (이때 클럭선 하나)
    => SPI통신은 이 방식을 많이 사용 

 

2-2. 1:다

  • 1 : A가 말하는 전용선
  • 2,3,4 : A-B,A-C,A-D가 통신하는 선으로 각각 B,C,D가 말하는 전용선
    => 이때 A입장에서는 본인 선까지 4개이므로 B,C,D가 말하는 전용선을 묶어놓음 

 

 

(1) 문제점 

  • A가 말하면 B,C,D 모두가 듣게됨 (B,C,D 모두 A의 전압을 체크 가능) 
    => A가 보낸 걸 아는 상황에서는 누구한테 말한거지? 
    => 실질적으론 누가 보냈는지 모름

1) "실질적으로 누가 보냈느냐?" 의 해결방법 

  • Master / Slave 관계 정의 
  • 기계를 만들 때 SPI통신에서의 SLAVE / MASTER 기계로 만든다 
  • Slave : 말하는 권한 X
    => 무조건 말을 듣고 응답만 하는 역할
    ex) B,C,D는 A가 말하는지는 모르지만 일단 무조건 주인이 어떤 말을 하는구나 라고 생각하고 동작 
  • Master : 말하는 권한 ㅇ
    => 반드시 1:다에서 Master는 1개 

2) "마스터가 말하는 건진 알겠는데 마스터가 누구에게 말하는 건가?" 의 해결방법

  • CS 선 추가 (Chip Select) 
    => GPIO선으로 많이 이용
  • 평상시엔 High로 있다가 A가 B,C,D에게 데이터를 보내고 싶은 경우 B의 GPIO선의 전압을 LOW로 낮춰줌
  • A가 B와 D의 CS 선의 GPIO를 LOW로 떨어트리고 데이터를 전송하면 B와 D가 동시에 듣게 됨 

 

3. SPI통신의 기본 뼈대 

: 말하는 전용선 , 듣는 전용선, 클럭선, CS(Chip Select) 선 존재 

cf. I2C : Data / Clk 선 2개 존재 ( 반이중 방식 )

=> 이때 1:다를 SW적으로 해결(주소 이용)

 

4. STM의 SPI통신 지원

  • 총 2개 지원 
  • MOSI : Master가 말하는 전용 선 이름 (Master Out Slave In : Master는 말하고 Slave는 듣는다)
  • MISO : Master가 듣는 전용 선 이름 (Master In Slave Out : Master는 듣고 Slave가 말한다)
  • SCK : 클럭
  • NSS : HW로 CS 조절 
  • Slave 입장에서 SI(Slave in : 듣는 선)/SO(Slave out : 말하는 선)이라고도 표기 

 

4-1. SPI통신의 Mode (CS 선 사용안하는 경우 존재)

  • Full Duplex : 전이중
    => A - B 사이에 데이터 선 2개 존재하기에 CLK까지 총 3개의 선 존재 
  • Half Duplex : 반이중
    => A - B 사이에 데이터 선 1개 존재하기에 CLK까지 총 2개의 선 존재
  • Receive Only : 수신 전용
    => A - B 사이에 데이터 선 1개 존재하기에 CLK까지 총 2개의 선 존재 
  • Transmit Only : 송신 전용
    => A - B 사이에 데이터 선 1개 존재하기에 CLK까지 총 2개의 선 존재 

4-2. SPI통신의 HW NSS Signal (CS를 어떻게 컨트롤?)

=> 자동으로 CS를 LOW로 떨어트려서 데이터 전송

=> HW적으로 CS 제어하는 것은 내가 통신할 상대가 한개인 경우에만 사용해야함 

=> 따라서 GPIO로 여러 개 제어하는 경우가 많기에 보통 HW NSS Signal은 Disable 

 

4-3. SPI통신의 Option

  • Frame Format : Motorola 
    => SPI 통신 최초 설계하여 만든 곳으로 여기서 설계한 방식의 클럭 포맷
  • Data Size : 8 /16 bits
    => 한 번 데이터를 전송할 때 8bit/ 16bit 씩 보낸다
    => 데이터 시트에 따라 bit수 정함  
  • First Bit : MSB/LSB First
    => 내가 보내고 싶은 숫자가 52일 경우 52 = 0011 0100인데, 왼쪽/오른쪽에서부터 결정 
    => 데이터 시트에 따라 결정됨 
  • Prescaler(for Baud Rate) : 원래 클럭이 있는데 얼마나 나눌지 결정
  • Clock Polarity : 클럭이 평상시에 LOW/HIGH ? 결정 
    => 데이터 시트 보고 결정
  • Clock Phase : 1 / 2 Edge
    => 어느 시점에 데이터를 어떻게 보느냐에 대한 설정
    => 데이터 시트 보고 결정 
    ex) 한 클럭 내에 보낸 데이터가 0인지 1인지 애매한 경우 사용

  • NSS Signal Type : HW NSS Signal이 Disable이면 SW, Disable 아니라면 HW
    => SW라는 건 GPIO 이용하겠다는 것 

cf. 만약 1:1인 경우

: cs선을 아예 LOW로 묶어서 Slave가 항상 듣는 상태로 만든다