먼저 알아둘 용어
SPI(Serial Peripheral Interface)·SCK(Serial Clock)·MOSI(Master Out, Slave In)·MISO(Master In, Slave Out) — SPI는 클록(clock)과 데이터선을 사용하는 동기식 통신입니다. SCK는 클록, MOSI는 통상 제어기에서 주변장치로 가는 데이터, MISO는 반대 방향 데이터입니다.
CS(Chip Select)·CPOL(Clock Polarity) — CS는 통신할 장치를 선택하는 신호입니다. 활성 극성은 장치마다 확인합니다. CPOL은 클록이 쉬는 동안의 HIGH 또는 LOW 상태를 정하는 설정입니다.
고임피던스·바이어스(bias) — 고임피던스는 핀이 HIGH나 LOW를 강하게 구동하지 않는 상태입니다. 바이어스 저항은 이때 입력이 정해진 상태를 보도록 돕습니다. 능동적으로 반대 상태를 구동할 때의 전류도 검토해야 합니다.
데이지체인(daisy chain) — 장치의 데이터 출력을 다음 장치의 입력으로 잇는 연결입니다. 초기화 전에 앞 장치 출력이 고임피던스이면 다음 입력의 상태도 따로 정해야 할 수 있습니다.

코드가 핀을 설정하기 전에도 상대 장치는 켜져 있습니다
리셋(reset) 중 MCU 핀이 고임피던스가 되면 상대 장치의 입력이 떠 있을 수 있습니다. 그렇다고 모든 SPI 선에 같은 10 kΩ 풀업(pull-up)을 다는 것은 아닙니다. 신호의 방향, 비활성 상태, 내부 저항, 다른 핀 기능과 전원 순서가 다르기 때문입니다.
전원 투입, MCU 리셋, 핀 초기화, 첫 데이터 전송, 정상 운전의 다섯 구간을 나눕니다. 각 구간에서 누가 신호를 구동하는지 표로 적습니다. 상대 장치가 켜져 있는데 MCU 핀이 고임피던스라면 입력이 어떤 상태를 보게 되는지 확인합니다. 클록의 정지 상태는 CPOL과 맞아야 하고, 선택되지 않은 장치의 출력은 공유 선을 방해하지 않아야 합니다.
CS가 비활성인 상태를 리셋 중에도 유지해야 하는 장치라면 필요한 내부·외부 바이어스를 정합니다. 이미 내부 저항이 있는 핀, 부팅 설정 등 다른 기능을 겸하는 핀도 확인합니다. 초기화 코드에서 뒤늦게 출력값을 쓰는 것만으로 전원 투입 직후부터 초기화 코드가 실행되기 전까지의 핀 상태가 정해지지는 않습니다. 출력 값과 출력 모드의 설정 순서가 불필요한 클록이나 선택 펄스를 만들지 않는지도 확인합니다.
데이지체인 기능을 켜기 전 데이터 출력이 고임피던스인 장치에서는 다음 입력이 보는 상태를 정의하는 풀업·풀다운(pull-down)이 필요할 수 있습니다. 이는 특정 초기 상태를 해결하기 위한 선택이며 모든 MISO에 풀업이 필요하다는 규칙은 아닙니다. 전원이 꺼진 입력으로 저항이나 다른 출력이 전류를 주입하지 않는지도 확인합니다.
| 시간 구간 | 확인할 대상 |
|---|---|
| 전원 투입·MCU 리셋 | CS의 비활성 상태, 입력 바이어스, 전원 순서 |
| 핀 초기화 | 출력 값 설정 순서와 클록의 불필요한 에지(edge) |
| 첫 데이터 전송 | 모드·선택·초기 데이터 상태 |
| 정상 운전·재시작 | 선택되지 않은 출력, 재현되는 오류 |
전체 전원을 다시 넣는 조건과 주변장치 전원은 둔 채 MCU만 재시작하는 조건을 각각 반복합니다. CS 비활성 상태, 불필요한 SCK 에지, 첫 데이터, 공유 출력 충돌 여부를 기록합니다. 첫 데이터 전송뿐 아니라 리셋 전후의 상태가 반복 가능해야 초기화 문제를 해결했다고 판단할 수 있습니다.