전자회로 실무 / 통신·신호

SPI(Serial Peripheral Interface) 디코더(decoder)를 맞추기 전에 실제 샘플링(sampling) 에지(edge)를 확인합니다

SPI(Serial Peripheral Interface)는 데이터가 바뀌는 순간과 읽는 순간이 맞지 않으면 배선이 정상이어도 틀린 값을 받습니다. CS(Chip Select)와 클록(clock)의 실제 파형을 보고 첫 비트(bit)를 언제 읽는지부터 설정과 비교해 보겠습니다.

먼저 알아둘 용어

SPI(Serial Peripheral Interface)·CS(Chip Select)·SCK(Serial Clock) — SPI는 클록에 맞추어 데이터를 주고받는 통신입니다. CS는 장치 선택 신호, SCK는 클록입니다. 선택된 구간의 어떤 에지(edge)에서 값을 읽는지 맞아야 합니다.

MOSI(Master Out, Slave In)·MISO(Master In, Slave Out) — 통상 MOSI는 제어기에서 주변장치로, MISO는 주변장치에서 제어기로 가는 데이터입니다. 동시에 선이 움직여도 모든 수신 비트(bit)가 즉시 유효하다는 뜻은 아닙니다.

CPOL(Clock Polarity)·CPHA(Clock Phase)·디코더(decoder) — CPOL은 유휴 클록 레벨이고 CPHA는 첫째 또는 둘째 에지의 샘플링(sampling) 관계를 정합니다. 디코더는 파형을 바이트(byte)로 해석하는 도구이며 장치 설정과 다르면 그럴듯한 오답을 보여 줄 수 있습니다.

시간이 흐르면서 파형이 진행되는 모습을 보여 줍니다. 흐린 선은 전체 파형이며 진한 선은 현재까지의 구간입니다. 재생 속도와 움직임의 크기는 설명을 위한 것입니다.
정지 그림 확대
시간이 흐르면서 파형이 진행되는 모습을 보여 줍니다. 흐린 선은 전체 파형이며 진한 선은 현재까지의 구간입니다. 재생 속도와 움직임의 크기는 설명을 위한 것입니다. · 그림을 클릭하면 확대됩니다.

작동 원리

CPOL은 클록의 유휴 레벨을, CPHA는 첫 번째 또는 두 번째 에지 중 어디에서 샘플링하는지 정합니다. 송신기가 데이터를 바꾸는 순간과 수신기가 읽는 순간이 맞지 않으면, 배선 도통과 클록 주파수가 정상이어도 비트가 틀릴 수 있습니다. 분석기의 모드 설정이 틀려도 화면에는 그럴듯한 잘못된 바이트가 나타납니다. 하드웨어 오류와 디코더 해석 오류를 분리하는 것이 요령입니다.

여덟 클록이 지났다고 해서 명령까지 완료된 것은 아닙니다

일반적인 4선식 SPI에서는 제어기가 클록을 만들고, 송신선 MOSI와 수신선 MISO에서 비트를 동시에 이동시킵니다. 시프트 레지스터(shift register)는 클록에 맞춰 저장된 비트를 한 칸씩 옮기는 회로입니다. 양쪽이 8비트 단위로 동작하면 여덟 클록 동안 각 방향으로 1바이트를 옮길 수 있습니다. 그러나 한쪽 데이터가 더미이거나 명령 단계일 수 있으므로 유효 응답 1바이트가 항상 동시에 나오는 것은 아닙니다.

SPI에는 UART처럼 매 바이트에 붙이는 시작·정지 비트가 보통 없습니다. 대신 칩 선택 CS(chip select)와 장치별 명령 형식으로 경계를 정합니다. 여러 기기를 연결할 때에는 흔히 CS를 각각 두며, 선택되지 않은 기기가 공유 MISO를 구동하지 않는지 확인합니다. 장치 내부의 레지스터 주소, 명령 바이트와 대기 클록은 여전히 필요할 수 있습니다. 따라서 SCK 주파수만으로 실제 데이터 처리량을 계산하지 말고 한 명령에 드는 모든 클록과 CS 사이의 대기 시간을 셉니다.

적용 순서

  1. 주변장치 데이터시트(datasheet)에서 SCK 유휴 상태, 데이터 출력 변경 에지, 입력 샘플 에지, CS 극성과 타이밍(timing)을 먼저 찾습니다. 모드 번호만 보지 말고 실제 타이밍 그림과 MCU(Microcontroller Unit) 레지스터(register) 의미를 맞춥니다. 제조사마다 위상 비트 이름이나 반전 의미가 다를 수 있습니다.
  1. CS·SCK·MOSI·MISO의 실제 파형을 디코딩 전에 한 화면에 함께 표시합니다. CS가 활성화되기 전 클록 상태와 첫 번째 유효 에지를 표시합니다. 샘플 지점의 앞뒤로 데이터가 안정적인지 확인합니다.
  1. 데이터를 바꾸는 클록 에지와 읽는 에지를 장치 문서에서 확인한 뒤, 분석기의 모드와 비트 순서, 워드 길이를 맞춥니다. CPHA=0이면 첫 샘플 에지 전에 첫 비트가 준비되어야 합니다. 받은 값이 한 비트씩 밀려 보이면 모드·CS 경계·첫 비트를 함께 확인합니다.
  1. SPI에는 모든 장치가 바이트마다 돌려주는 공통 수신 확인(acknowledgment, ACK)이 없습니다. 장치 문서에서 안전한 읽기 전용 ID·상태 레지스터 또는 알려진 패턴을 골라 응답이 기대값과 맞는지 검증합니다. 낮은 클록에서 시작해 요구 속도까지 올리며 데이터와 타이밍 여유를 비교합니다. 디코더의 모드만 바꿔 숫자가 맞았다는 이유로 MCU와 주변장치의 설정이 맞다고 결론내리지 않습니다.

계산과 판단 예시

일반적인 모드CPOLCPHA샘플 에지
000상승
101하강
210하강
311상승

보통 반대 에지에서 데이터를 변경하지만 실제 소자의 출력 지연·설정 시간·CS 요구가 우선입니다. CPHA=0에서는 첫 샘플 전에 첫 비트가 준비되어야 합니다. 모드 번호와 실제 타이밍 그림을 함께 맞춥니다.

적용 조건과 한계

모드가 맞더라도 전압 레벨, 접지, MISO 충돌, 비트 순서, 명령 길이가 틀리면 실패합니다. 모든 SPI 통신에서 첫 클록부터 유효한 수신 데이터를 주는 것은 아닙니다. 명령·주소·더미 클록은 부품 프로토콜에서 확인합니다. 무작위 쓰기 명령을 보내 시험하지 않습니다.

확인과 기록

원시 파형의 샘플 위치, MCU 설정, 디코더 설정, 알려진 응답이 일치하는지 확인합니다. 모든 비트가 같은 0x00·0xFF만으로 순서나 한 비트 밀림까지 검증하지 않습니다.

작업 순서를 다시 확인합니다

SPI 디코더를 맞추기 전에 실제 샘플링 에지를 확인합니다 — 설명용 도해
SPI 디코더를 맞추기 전에 실제 샘플링 에지를 확인합니다 — 설명용 도해 · 클릭하면 확대됩니다.

0xFF: 유효 데이터와 미구동 버스를 구별하기

0xFF만 보고 주변장치가 응답하지 않았다고 단정하지 않습니다. Microchip SST25PF020B 데이터시트 §5.1·5.9의 예에서는 지워진 메모리의 비트가 모두 1이므로 정상 READ도 FFH를 반환할 수 있습니다. 반대로 SO/MISO가 high-Z인 구간에 풀업이 있으면 수신기는 1을 읽을 수 있습니다. 이 예시는 이미 지워진 데이터의 의미이며 진단을 위해 지우기를 실행하라는 지시가 아닙니다.

읽기 전용 ID·상태의 예상값, opcode·주소·dummy clock, CS 극성·유지 시간을 부품 사양에서 정한 뒤 실제 CS·SCK·MOSI·MISO 파형에서 해당 바이트의 위치를 표시합니다. 디지털 분석기의 high 표시만으로 구동된 high와 풀업된 high-Z를 확정하지 않습니다. 전압 임계값, 전원·enable, 핀 매핑과 드라이버의 명령 구성도 조사 범위에 둡니다. Linux SPI 문서의 기본 CS는 active-low지만 SPI_CS_HIGH 구성도 있으므로 모든 장치에서 LOW만 정답이라고 쓰지 않습니다.

저장된 Harshith Kolur의 점검표에서 받은 질문을 데이터시트로 좁힌 설명입니다. 원그림을 복제하지 않았으며 실제 회로 파형이나 드라이버 결함의 발생 빈도를 측정한 결과가 아닙니다.

English summary. FFH can be valid erased-flash data or a sampled high level on an undriven line. Check the protocol phase and electrical conditions. A decoded byte or digital high alone does not identify the cause.