LabHub
배우기 러닝패스 코스

센서는 멀쩡한데 보드가 못 알아듣는다 · 클럭이 함께 오는 SPI · 이론

배선은 맞는데 값만 두 배다

LabHub 에서 이어서 보기

한 줄 요약

SPI 에는 클럭 선이 있어서 속도 문제가 없습니다. 대신 어느 모서리에서 읽느냐가 설정으로 남아 있고, 그 설정이 어긋나면 한 비트씩 밀린 값이 나옵니다.

왜 이게 필요했나

새 플래시 칩에서 제조사 ID 를 읽었는데 엉뚱한 값이 나옵니다. 배선을 세 번 확인했고, 클럭도 들어가고, 칩은 응답합니다. 값만 이상합니다. 이런 모양은 대개 배선이 아니라 모드입니다. 그리고 모드는 데이터시트의 표 한 칸에만 적혀 있어서 눈으로 지나치기 쉽습니다.

SPI 는 규격서가 없는 사실상의 표준이라 용어도 제조사마다 조금씩 다릅니다. 그래서 더더욱 "문서에 뭐라고 적혀 있나" 보다 "파형이 뭐라고 말하나" 가 빠릅니다. 다행히 SPI 파형은 모드를 스스로 말해 줍니다.

어떻게 동작하나

선은 넷입니다. 선택선(CS 또는 SS), 클럭(SCLK), 마스터가 보내는 MOSI, 슬레이브가 보내는 MISO. 선택선이 낮은 동안만 전송이고, 클럭 모서리마다 비트 하나가 오갑니다. 양방향이 동시에 일어나므로 읽기 명령을 보낼 때도 MOSI 에는 무언가가 실려 있어야 합니다.

설정은 두 개뿐입니다. CPOL 은 쉬고 있을 때 클럭이 높은지 낮은지이고, CPHA 는 앞 모서리에서 읽을지 뒤 모서리에서 읽을지입니다. 둘을 묶어 모드 0부터 3까지로 부릅니다. TI 의 SPI 사용자 안내서도 이 두 값을 별개의 설정으로 두고 있습니다([SPRUGP2](https://www.ti.com/lit/pdf/sprugp2)). sigrok 의 SPI 해독기가 받는 설정도 cs_polarity, cpol, cpha, bitorder, wordsize 다섯 개입니다([문서](https://sigrok.org/wiki/Protocol_decoder:Spi)) — 파형만으로는 정할 수 없는 것들이 무엇인지 이 목록이 말해 줍니다.

CPOL=0 CPHA=0 (모드 0)            CPOL=1 CPHA=1 (모드 3)SCLK  __/‾\_/‾\_/‾\__            SCLK  ‾‾\_/‾\_/‾\_/‾‾읽는 곳  ^   ^   ^                읽는 곳   ^   ^   ^         상승 모서리                        상승 모서리

여기에 초보자를 걸려 넘어뜨리는 사실이 하나 있습니다. 모드 0과 모드 3은 같은 모서리에서 읽습니다. 위 그림에서 둘 다 상승 모서리입니다. 모드 1과 모드 2도 마찬가지로 서로 같은 모서리(하강)를 씁니다. 그래서 클럭 모서리만 보고는 네 모드를 구별할 수 없습니다. 나머지 절반의 정보는 쉬고 있을 때 클럭이 어디 있는가, 곧 CPOL 입니다. 파형에서 모드를 정하려면 두 가지를 따로 봐야 합니다.

CPHA 를 정하는 방법은 더 재미있습니다. 실제 소자는 클럭 모서리에서 곧바로 데이터를 바꾸지 않고 출력 유효 지연 뒤에 바꿉니다. 그래서 파형에서 MOSI 가 움직이는 시각 바로 앞의 클럭 모서리를 찾으면, 그 모서리는 읽는 모서리가 아닌 쪽입니다. 읽는 모서리는 반대쪽이고, 그것이 유휴에서 벗어나는 앞 모서리면 CPHA=0, 아니면 CPHA=1 입니다. 데이터가 바뀌는 모서리에서 읽으면 직전 비트를 집어 오기 때문에 전체가 한 칸 밀린 값이 나옵니다 — 앞서 말한 "엉뚱한 ID" 의 정체입니다.

선택선의 타이밍도 조용한 고장을 만듭니다. CS 가 첫 클럭 모서리보다 늦게 내려가면 그 모서리는 전송에 포함되지 않습니다. 슬레이브는 첫 비트를 못 받았는데 마스터는 보냈다고 믿습니다. 파형에서는 CS 가 낮은 동안의 표본 모서리 수가 8의 배수가 아닌 것으로 드러납니다. 이 코스의 포착에서는 24개여야 할 모서리가 23개이고, 7비트가 남습니다. 남는 비트가 있다는 것은 바이트 경계가 어긋났다는 뜻이고, 값이 아니라 개수가 먼저 말해 줍니다.

바이트 순서도 확인 대상입니다. 대부분은 높은 자리부터 보내지만 낮은 자리부터 보내는 소자가 있고, 파형만으로는 어느 쪽인지 알 수 없습니다. 이건 문서를 봐야 하는 항목입니다.

마지막으로 클럭 주파수는 고장의 원인이 잘 되지 않습니다. SPI 는 클럭 선을 함께 보내므로 마스터가 느리게 흔들면 슬레이브도 느리게 따라옵니다. UART 와 달리 "속도가 안 맞는다" 는 말이 성립하지 않고, 대신 소자가 감당할 수 있는 최대 주파수만 데이터시트에 적혀 있습니다. 그래서 SPI 에서 값이 이상하면 속도보다 모서리와 선택선을 먼저 봅니다.

현장에서 만나는 모습

가장 흔한 신고는 "읽은 값이 두 배거나 절반" 입니다. 한 비트 밀린 값은 십육진수로 보면 딱 그렇게 보입니다. 0x9F 를 한 칸 왼쪽으로 밀면 0x3E, 오른쪽으로 밀면 0x4F 입니다. 값을 보고 "두 배쯤 되는데" 라는 느낌이 들면 모드부터 의심하는 편이 빠릅니다.

여러 슬레이브가 한 버스를 나눠 쓰는 보드에서는 모드가 섞이는 사고가 납니다. 각 슬레이브는 자기 모드를 요구하는데 드라이버가 전송마다 모드를 바꿔 주지 않으면, 어떤 칩은 읽히고 어떤 칩은 안 읽힙니다. "이 센서만 안 된다" 는 신고의 상당수가 여기입니다.

다음 퀴즈에서 확인할 것

CPOL 과 CPHA 가 각각 무엇을 정하는지, 왜 모서리만 보고는 네 모드를 가릴 수 없는지, 데이터가 바뀌는 모서리로 CPHA 를 어떻게 정하는지, 선택선이 늦었을 때 파형의 어느 숫자가 먼저 이상해지는지를 묻습니다.