클럭 선을 함께 보내는 동기식 4선 시리얼 통신(Serial Peripheral Interface).
신호선
SCLK — 클럭 (마스터가 생성)
MOSI — Master Out Slave In (마스터 → 슬레이브)
MISO — Master In Slave Out (슬레이브 → 마스터)
CS/SS — Chip Select (슬레이브마다 하나씩, Active Low)
최신 문서는 COPI/CIPO 또는 SDO/SDI라는 명칭을 쓰기도 한다.
동작 — 시프트 레지스터 교환
마스터 [10110010] ──MOSI──► 슬레이브
◄──MISO── [01001101]
클럭 한 번에 1비트씩, 양방향으로 동시에 교환된다
8클럭 후 두 레지스터의 내용이 서로 바뀌어 있다
전이중(full-duplex)이며, 송신과 수신이 항상 동시에 일어난다. 읽기만 하고 싶어도 무언가(더미 바이트)를 보내야 한다.
// 읽기만 할 때도 더미를 보낸다
HAL_SPI_TransmitReceive(&hspi, dummy, rx, len, TIMEOUT);
I2C·UART와의 비교
| SPI | I2C | UART | |
|---|---|---|---|
| 선 수 | 4 + 슬레이브당 CS | 2 | 2 |
| 속도 | 매우 빠름 (수십 MHz) | 100k~3.4M | 보통 ~1M |
| 클럭 | 있음 | 있음 | 없음 |
| 다중 슬레이브 | CS로 (선이 늘어남) | 주소로 (선 그대로) | 1:1 |
| 전이중 | ○ | ✗ | ○ |
| ACK | 없음 | 있음 | 없음 |
| 거리 | 짧다 (보드 내) | 짧다 | 길다 |
SPI에는 ACK가 없다. 슬레이브가 응답했는지 알 방법이 프로토콜에 없어, 데이터 자체에 검증을 넣어야 한다.
왜 빠른가
- ① 클럭을 함께 보내므로 타이밍 오차 문제가 없다
- ② 푸시풀 출력이라 신호 에지가 가파르다 (I2C는 오픈드레인이라 느리다)
- ③ ACK나 주소 같은 오버헤드가 없다 — 순수 데이터만
수십 MHz가 가능해 SD 카드, 플래시 메모리, 디스플레이처럼 대량 데이터를 다루는 장치에 쓰인다.
다중 슬레이브 연결
① 독립 CS (일반적)
마스터 ─┬─ SCLK/MOSI/MISO ─┬─ 슬레이브1 ── CS1
│ ├─ 슬레이브2 ── CS2
└──────────────────┴─ 슬레이브3 ── CS3
슬레이브가 늘어날수록 CS 핀이 필요하다
② 데이지 체인 마스터 MOSI → S1 MOSI, S1 MISO → S2 MOSI, S2 MISO → 마스터 MISO CS는 공유. 데이터가 사슬처럼 흘러간다
- 핀은 절약되지만 지연이 누적되고 모든 슬레이브가 지원해야 한다
실무 주의점
① CS 타이밍
CS_LOW();
HAL_SPI_Transmit(&hspi, data, len, TIMEOUT);
CS_HIGH(); // ★ 전송이 완전히 끝난 뒤에 올려야 한다
HAL 함수가 반환됐어도 마지막 비트가 아직 시프트 중일 수 있다. DMA를 쓸 때 특히 문제가 되어, 완료 콜백에서 CS를 올려야 한다.
② MISO는 슬레이브가 비활성일 때 하이임피던스여야 한다
CS가 비활성인 슬레이브가 MISO를 계속 구동하면 버스가 충돌한다. 일부 저가 부품은 이것을 지키지 않아 버퍼나 별도 버스가 필요하다.
③ 클럭 속도 한계
슬레이브의 최대 클럭을 데이터시트에서 확인 배선이 길면 신호 무결성 때문에 더 낮춰야 한다 "가끔 데이터가 깨진다"면 클럭을 절반으로 낮춰 본다.
④ 모드 불일치
CPOL/CPHA가 다르면 완전히 엉뚱한 값이 읽힌다. 데이터시트에서 슬레이브가 요구하는 모드를 반드시 확인한다.
QSPI / Dual SPI
- 표준 SPI : 데이터 선 1개 → 클럭당 1비트
- Dual — : 2개 → 2비트
- Quad — : 4개 → 4비트 ← 플래시 메모리에 널리 사용
- Octal — : 8개
외부 플래시에서 코드를 직접 실행(XIP) 하려면 대역폭이 필요해 QSPI를 쓴다. 메모리 맵에 매핑되어 일반 포인터로 접근 가능해진다.
디버깅
로직 애널라이저가 가장 효과적 — 4선을 함께 보면 원인이 바로 보인다 ✓ CS가 제대로 내려가는가 ✓ 클럭 개수가 맞는가 (8의 배수) ✓ 데이터가 클럭의 어느 에지에 바뀌는가 → 모드 확인 ✓ MISO가 항상 High/Low면 → 슬레이브 미응답 (전원, CS, 모드 확인)