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

2026. 4. 26. 19:15·Embedded

SPI 통신이란

diagram_01_timebase_vs_clock

SPI(Serial Peripheral Interface)는 칩과 칩, 모듈과 모듈 간의 근거리 통신에 사용되는 시리얼 통신 방식이다. I2C와 함께 임베디드 개발에서 가장 많이 사용되며, 플래시 메모리 데이터 기록 등 다양한 분야에서 활용된다.

 

이전 글("printf도 쉽지 않다구")에서 다룬 UART는 시간을 쪼개는 타임베이스 방식(비동기)이었다. 예를 들어 9600 bps면 1초를 9600개로 나눠서 각 구간의 전압이 High인지 Low인지로 0과 1을 구분했다.

 

SPI는 타임베이스가 아니라 클럭 선을 이용하는 방식(동기)이다. 클럭 주기에 맞춰 데이터 선의 High/Low를 읽어 0과 1을 구분한다. 클럭에 제약이 없으므로 이론상 속도 제한이 없다는 것이 SPI의 큰 장점이다.

데이터 통신의 기본

통신은 두 개 이상의 장치(A와 B) 사이에서 이루어진다. 데이터를 주고받으려면 전압 차이를 이용한 데이터 선이 필요하며, High = 1, Low = 0으로 데이터를 표현한다.

 

SPI 통신에는 최소한 데이터 선과 클럭 선이 필요하다. 클럭이 한 주기 동작할 때(LOW → HIGH → LOW) 데이터 선의 전압을 읽어서 해당 비트가 0인지 1인지 판단한다.

1:1 통신 — 반이중 vs 전이중

A와 B 사이에 데이터 선이 1개면 반이중(Half Duplex) 방식이다. A가 데이터를 보내는 동안 B는 아무것도 할 수 없고, 번갈아가며 통신한다.

 

데이터 선이 2개면 전이중(Full Duplex) 방식이다. A가 말하는 전용선과 B가 말하는 전용선이 각각 있어서 동시에 양방향 통신이 가능하다. SPI는 기본적으로 이 전이중 방식을 사용한다.

1:다 통신의 두 가지 문제

A가 여러 장치(B, C, D)와 통신할 때 두 가지 문제가 생긴다.

문제 1: 누가 말하는가?

A가 데이터를 보내면 B, C, D 모두가 듣게 된다. 반대로 B, C, D가 동시에 데이터를 보내면 누가 보낸 건지 구분할 수 없다.

해결: Master / Slave 관계 정의

 

SPI는 Master와 Slave라는 명확한 역할을 정한다. Master는 통신을 시작하고 명령을 내리는 주체이고, Slave는 말하는 권한이 없고 Master의 명령에 응답만 한다. Master는 반드시 1개다.

문제 2: 누구에게 말하는가?

Master가 말하는 건 알겠는데, B, C, D 중 누구에게 말하는 건지 Slave들이 알 수 없다.

해결: CS(Chip Select) 선 추가

 

각 Slave에 독립적으로 CS 선을 연결한다. 평상시에는 CS가 High 상태이고, 특정 Slave와 통신하고 싶으면 해당 CS 선만 Low로 떨어뜨려서 그 칩을 활성화한다. CS가 Low인 Slave만 Master의 데이터를 수신한다.

 

1:1 통신일 때는 상대가 하나뿐이므로 CS를 아예 Low로 묶어버려서 Slave가 항상 듣는 상태로 만들 수 있다. 이전 글("FND 제어")에서 FND 모듈에 CS 핀이 없었던 이유가 이것이다.

diagram_02_spi_master_slave

SPI의 기본 뼈대 — 4개의 선

선 이름 의미 역할
MOSI Master Out Slave In Master가 말하는 전용선
MISO Master In Slave Out Slave가 말하는 전용선 (Master가 듣는 선)
SCLK Serial Clock 클럭 신호
SS (CS) Slave Select (Chip Select) 통신 대상 선택

Slave 입장에서는 MOSI를 SI(Slave In), MISO를 SO(Slave Out)라고 표기하기도 한다. 이전 글들에서 접했던 SPI 관련 핀 이름들이 이 구조에서 나온 것이다.

 

이전 글("데이터시트 보는 꼼수")에서 STB/CLK/DIO로 설명했던 것, 이전 글("멀티미터기 사용방법")에서 클럭+데이터 파형을 오실로스코프로 관찰했던 것, 이전 글("FND 제어")에서 SCLK/RCLK/DIO로 GPIO를 직접 제어했던 것이 모두 이 SPI 통신의 구현이었다.

STM32 SPI 설정 옵션

STM32는 SPI 통신을 하드웨어적으로 지원한다. STM32CubeIDE에서 SPI를 활성화하면 다양한 옵션을 설정할 수 있다.

STM32CubeIDE SPI 설정 화면

Mode

  • Full Duplex: 전이중. 데이터 선 2개 + 클럭 = 3선
  • Half Duplex: 반이중. 데이터 선 1개 + 클럭 = 2선
  • Receive Only: 수신 전용. 데이터 선 1개 + 클럭 = 2선
  • Transmit Only: 송신 전용. 데이터 선 1개 + 클럭 = 2선

칩의 용도에 따라 선택한다. 예를 들어 온도 센서처럼 데이터를 보내기만 하는 장치는 Transmit Only로 충분하다.

Master / Slave

칩의 역할에 따라 선택한다. 메인 MCU는 보통 Master, 주변 모듈은 Slave로 설정한다.

HW NSS Signal

CS를 하드웨어적으로 자동 제어할지 여부다. HW로 설정하면 SPI 통신 시 자동으로 CS를 Low로 떨어뜨리지만, 통신 대상이 1개일 때만 사용 가능하다. 여러 Slave를 제어해야 하면 GPIO로 직접 CS를 제어해야 하므로 보통 Disable(SW 방식)로 설정한다.

Data Size

한 번에 전송하는 데이터 단위. 8비트 또는 16비트를 선택할 수 있다. 데이터시트에 따라 결정한다.

First Bit

데이터를 보낼 때 MSB(최상위 비트)부터 보낼지 LSB(최하위 비트)부터 보낼지 결정한다. 예를 들어 52(= 0011 0100)를 보낼 때, MSB First면 왼쪽부터, LSB First면 오른쪽부터 보낸다. 데이터시트에 따라 결정한다.

Prescaler (for Baud Rate)

MCU의 기본 클럭을 얼마나 나눌지 결정하여 SPI 통신 속도를 설정한다.

Clock Polarity (CPOL)

클럭이 평상시에 Low인지 High인지 결정한다. 데이터시트를 보고 결정한다.

Clock Phase (CPHA)

클럭의 1st Edge에서 데이터를 읽을지, 2nd Edge에서 읽을지 결정한다. 한 클럭 내에서 데이터가 0인지 1인지 판단하는 시점을 정하는 설정이다. 데이터시트를 보고 결정한다.

이 옵션들은 모두 데이터시트를 보고 결정해야 한다. SPI 통신이 지원된다고 해서 모든 칩이 호환되는 것이 아니며, 이 옵션들이 정확히 맞아야 통신이 가능하다.

SPI vs I2C

비교 항목 SPI I2C
선 개수 4개 (MOSI, MISO, SCLK, CS) 2개 (SDA, SCL)
통신 방식 전이중 가능 반이중만
칩 선택 방식 CS 선 (HW적, 각 Slave마다 별도 선) 주소 (SW적, 데이터에 주소 포함)
속도 이론상 제한 없음 프로토콜에 의한 속도 제한
선 수 증가 Slave 수만큼 CS 선 추가 Slave 수 늘어도 선 2개 유지

SPI는 빠르고 전이중이 가능하지만 선이 많고, I2C는 선이 적지만 느리고 반이중이다. 용도에 따라 선택한다.

'Embedded' 카테고리의 다른 글

[오제이 튜브 임베디드 강의] 22. STM32에서는 SPI 기능을 제공한다구  (0) 2026.04.26
[오제이 튜브 임베디드 강의] 21. FND 제어 소스 분석  (0) 2026.04.26
[오제이 튜브 임베디드 강의] 19. FND 제어  (0) 2026.04.26
[오제이 튜브 임베디드 강의] 18. 내 힘으로 스위치회로 만들기  (0) 2026.04.26
[오제이 튜브 임베디드 강의] 17. 내 힘으로 LED회로 만들어서 제어하기  (0) 2026.04.26
'Embedded' 카테고리의 다른 글
  • [오제이 튜브 임베디드 강의] 22. STM32에서는 SPI 기능을 제공한다구
  • [오제이 튜브 임베디드 강의] 21. FND 제어 소스 분석
  • [오제이 튜브 임베디드 강의] 19. FND 제어
  • [오제이 튜브 임베디드 강의] 18. 내 힘으로 스위치회로 만들기
onebrotravel
onebrotravel
  • onebrotravel
    매일을 여행처럼
    onebrotravel
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Embedded N
      • OS
      • DSA
      • DevTools
      • Infra
      • Projects
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
onebrotravel
[오제이 튜브 임베디드 강의] 20. SPI통신 제대로 배워보자
상단으로

티스토리툴바