SPI: 클럭에 맞춰 동시에 주고받기
SCK, MOSI, MISO, CS 네 선으로 빠르게 통신합니다. 네 가지 모드, 여러 슬레이브 연결, 실전 디버깅 포인트.
선 네 개
| 선 | 방향 | 역할 |
|---|---|---|
| SCK | 마스터 → 슬레이브 | 클럭 |
| MOSI (COPI) | 마스터 → 슬레이브 | 데이터 |
| MISO (CIPO) | 슬레이브 → 마스터 | 데이터 |
| CS (NSS) | 마스터 → 슬레이브 | 칩 선택, LOW일 때 활성 |
클럭 한 번에 양쪽이 1비트씩 동시에 주고받습니다. 읽기만 하고 싶어도 마스터는 더미 바이트를 보내야 클럭이 나갑니다.
네 가지 모드
| 모드 | CPOL (쉴 때 클럭) | CPHA (샘플링 에지) |
|---|---|---|
| 0 | LOW | 첫 번째 에지 |
| 1 | LOW | 두 번째 에지 |
| 2 | HIGH | 첫 번째 에지 |
| 3 | HIGH | 두 번째 에지 |
슬레이브 칩 데이터시트의 타이밍 그림을 보고 맞춥니다. 모드가 틀리면 값이 한 비트씩 밀리거나 엉망이 됩니다.
여러 슬레이브
SCK, MOSI, MISO는 공유하고 CS를 칩마다 따로 둡니다. 선택되지 않은 칩은 MISO를 놓아(하이 임피던스) 충돌하지 않습니다.
실전 포인트
- CS를 소프트웨어 GPIO로 제어하는 경우가 많습니다. 전송이 완전히 끝난 뒤(BSY 플래그) CS를 올립니다.
- 수 MHz 이상이면 배선 길이와 링잉을 봅니다. 클럭 출력에 직렬 저항이 도움이 됩니다.
- 시프트 레지스터, 디스플레이, 외부 Flash, 고속 ADC가 대표 사용처입니다.
그림으로 보기: 한 바이트가 오가는 과정 (모드 0)
SPI는 두 개의 시프트 레지스터가 고리로 이어진 구조입니다. 마스터가 한 비트를 내보내는 바로 그 클럭에 슬레이브도 한 비트를 내보냅니다. 그래서 읽기만 하고 싶어도 마스터는 무언가(보통 0x00이나 0xFF)를 보내야 합니다.
네 가지 모드
| 모드 | CPOL (쉴 때 클럭) | CPHA (읽는 시점) |
|---|---|---|
| 0 | LOW | 첫 번째 에지(상승) |
| 1 | LOW | 두 번째 에지(하강) |
| 2 | HIGH | 첫 번째 에지(하강) |
| 3 | HIGH | 두 번째 에지(상승) |
모드가 맞지 않으면 통신이 아예 안 되는 것이 아니라 값이 한 비트씩 밀려 읽힙니다. 0xA5를 보냈는데 0x52나 0xD2가 읽힌다면 모드를 의심합니다. 칩 데이터시트의 타이밍 그림에서 "쉴 때 클럭이 어느 쪽인지", "어느 에지에서 데이터가 안정한지"를 직접 확인합니다.
센서 레지스터 읽기
uint8_t spi_read_reg(uint8_t reg) {
uint8_t v;
CS_LOW();
spi_xfer(reg | 0x80); // 최상위 비트 1 = 읽기 (칩마다 다름)
v = spi_xfer(0x00); // 더미를 보내며 응답 받기
CS_HIGH();
return v;
}
CS를 한 번 내린 동안이 하나의 거래입니다. 주소와 데이터 사이에 CS가 올라갔다 내려오면 칩은 새 명령으로 받아들입니다.
UART, I2C와 비교
| SPI | I2C | UART | |
|---|---|---|---|
| 선 수 | 4 (장치마다 CS 추가) | 2 | 2 |
| 속도 | 수십 MHz | 100 k~3.4 Mbps | 보통 수 Mbps 이하 |
| 주소 | 없음 (CS로 선택) | 7비트 주소 | 없음 (1:1) |
| 응답 확인 | 없음 | ACK | 없음 |
| 쓰임 | 플래시, 디스플레이, 빠른 ADC | 센서, EEPROM | PC, 모듈 |
현업에서 자주 터지는 문제
- CS를 너무 빨리 올림: 마지막 비트가 다 나가기 전에 CS를 올리면 마지막 바이트가 깨집니다. 전송 완료 플래그(BSY)가 꺼진 뒤에 올립니다.
- 선이 길 때 속도: 10 cm를 넘는 점퍼 선에서 10 MHz는 무리입니다. 속도를 낮추면 바로 나아지는지 확인합니다.
- MISO 공유: 선택되지 않은 슬레이브는 MISO를 놓아야 합니다. 그렇지 않은 모듈을 한 버스에 달면 서로 충돌합니다.
- 비트 순서: 대부분 MSB부터지만 LSB부터 보내는 칩도 있습니다.
- 3.3 V와 5 V: 전압이 다른 칩을 직접 연결하면 입력이 손상될 수 있습니다.
스스로 확인
- 슬레이브 3개를 달려면 마스터의 핀이 몇 개 필요할까요?
- 읽기 전용 동작에서도 마스터가 더미 바이트를 보내야 하는 이유는 무엇일까요?
영상으로 이어 보기통신 시리즈 13편UART 통신 완벽정리 | 전기전자, 전자과, 임베디드 개발자 필수 시청PROJECT COURSEI2C로 MPU6050을, UART로 블루투스 모듈을 직접 붙여 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →