그라운드 임베디드 EN 유튜브 구독

노트 / 통신 프로토콜

SPI: 클럭에 맞춰 동시에 주고받기

SCK, MOSI, MISO, CS 네 선으로 빠르게 통신합니다. 네 가지 모드, 여러 슬레이브 연결, 실전 디버깅 포인트.

GROUND EMBEDDED · 정리 노트통신 04SPI 1uint8_t spi_read_reg(uint8_t reg) { 2 uint8_t v; 3 CS_LOW(); 4 spi_xfer(reg | 0x80);// 최상위 비트 …

선 네 개

마스터SCK클럭MOSI마스터 → 슬레이브MISO슬레이브 → 마스터CSLOW일 때 선택
SPI의 네 선. 클럭과 칩 선택은 마스터가 내고, 데이터는 양쪽으로 동시에 흐릅니다.
선 방향 역할
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)

CSSCKMOSIb7=1b6=0b5=1b4=0b3=0b2=1b1=0b0=1
CS가 내려가면 시작합니다. 클럭이 올라갈 때마다 양쪽이 한 비트씩 읽습니다. 여기서는 마스터가 0xA5를 보냅니다.

SPI는 두 개의 시프트 레지스터가 고리로 이어진 구조입니다. 마스터가 한 비트를 내보내는 바로 그 클럭에 슬레이브도 한 비트를 내보냅니다. 그래서 읽기만 하고 싶어도 마스터는 무언가(보통 0x00이나 0xFF)를 보내야 합니다.

네 가지 모드

모드 CPOL (쉴 때 클럭) CPHA (읽는 시점)
0 LOW 첫 번째 에지(상승)
1 LOW 두 번째 에지(하강)
2 HIGH 첫 번째 에지(하강)
3 HIGH 두 번째 에지(상승)

모드가 맞지 않으면 통신이 아예 안 되는 것이 아니라 값이 한 비트씩 밀려 읽힙니다. 0xA5를 보냈는데 0x52나 0xD2가 읽힌다면 모드를 의심합니다. 칩 데이터시트의 타이밍 그림에서 "쉴 때 클럭이 어느 쪽인지", "어느 에지에서 데이터가 안정한지"를 직접 확인합니다.

3D 실험실여기까지 읽은 내용을 직접 돌려 볼 수 있습니다→

센서 레지스터 읽기

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개를 달려면 마스터의 핀이 몇 개 필요할까요?
  • 읽기 전용 동작에서도 마스터가 더미 바이트를 보내야 하는 이유는 무엇일까요?
3D 실험실에서 직접 돌려 보기값을 바꾸며 이 노트의 원리를 확인합니다→영상으로 이어 보기통신 시리즈 13편UART 통신 완벽정리 | 전기전자, 전자과, 임베디드 개발자 필수 시청PROJECT COURSEI2C로 MPU6050을, UART로 블루투스 모듈을 직접 붙여 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →