SPI Mode 계산기
SPI 모드 번호와 CPOL/CPHA를 상호 변환하고, 클럭 유휴 레벨과 샘플링 엣지를 확인하며, Arduino·STM32 HAL·Linux spidev의 대응 명칭을 함께 확인하세요.
플랫폼별 SPI 모드 참조표
모드 번호는 모든 플랫폼에서 동일한 표준 공식을 따릅니다: mode = (CPOL << 1) | CPHA. 이 표로 사용 중인 라이브러리의 명칭을 데이터시트가 명시한 CPOL/CPHA와 대응시켜 보세요.
| Mode | CPOL/CPHA | Arduino SPI | STM32 HAL | Linux spidev |
|---|---|---|---|---|
| 0 | 0 / 0 | SPI_MODE0 | POLARITY_LOW, PHASE_1EDGE | SPI_MODE_0 |
| 1 | 0 / 1 | SPI_MODE1 | POLARITY_LOW, PHASE_2EDGE | SPI_MODE_1 |
| 2 | 1 / 0 | SPI_MODE2 | POLARITY_HIGH, PHASE_1EDGE | SPI_MODE_2 |
| 3 | 1 / 1 | SPI_MODE3 | POLARITY_HIGH, PHASE_2EDGE | SPI_MODE_3 |
CPOL과 CPHA란?
CPOL(클럭 극성)은 SPI 클럭의 유휴 레벨을 정합니다: 0이면 유휴 시 LOW, 1이면 유휴 시 HIGH입니다. CPHA(클럭 위상)는 데이터를 어느 엣지에서 샘플링할지 정합니다: 0이면 각 클럭 사이클의 leading 엣지에서, 1이면 trailing 엣지에서 샘플링합니다. CPOL과 CPHA의 네 가지 조합이 0부터 3까지 번호가 매겨진 네 가지 SPI 모드를 만듭니다.
내 장치에 맞는 SPI 모드 찾는 방법
주변장치 데이터시트의 타이밍 다이어그램이나 전기적 특성 항목을 확인하세요. 모드 번호를 직접 명시하는 데이터시트도 있고, CPOL/CPHA만 표시하거나 데이터 유효 구간이 표시된 클럭 파형만 보여주는 경우도 있습니다. 그 파형을 이 페이지의 다이어그램과 비교해 CPOL과 CPHA를 파악한 뒤 모드 번호를 확인하세요.
SPI 모드를 잘못 설정하면 생기는 문제
CPOL이 틀리면 클럭이 잘못된 레벨에서 유휴 상태가 되어 첫 비트가 잘못 샘플링되거나 한 비트씩 밀릴 수 있습니다. CPHA가 틀리면 모든 비트가 잘못된 엣지에서 샘플링되어 간헐적 오류가 아니라 지속적으로 깨지거나 밀린 데이터가 나오는 경우가 많으므로, 새로 연결한 SPI 장치가 이상한 값을 반환할 때 가장 먼저 의심해 볼 부분입니다.
FAQ
SPI Mode 0과 Mode 3의 차이는 무엇인가요?
Mode 0은 CPOL 0, CPHA 0이라 클럭이 LOW에서 유휴하고 상승 엣지에서 샘플링합니다. Mode 3은 CPOL 1, CPHA 1이라 클럭이 HIGH에서 유휴하지만, 다른 유휴 레벨을 기준으로 마찬가지로 상승 엣지에서 샘플링합니다.
센서나 디스플레이에 어떤 SPI 모드가 필요한지 어떻게 알 수 있나요?
데이터시트에서 CPOL과 CPHA 값, 명시된 모드 번호, 또는 클럭 타이밍 다이어그램을 확인하세요. 다이어그램만 제공된다면 클럭 유휴 레벨과 데이터가 바뀌는 엣지를 이 페이지의 다이어그램과 비교해 모드를 파악하면 됩니다.
Arduino, STM32, Linux에서 SPI 모드가 동일한가요?
CPOL/CPHA의 전기적 동작 자체는 동일하고 0~3 모드 번호 체계도 어디서나 같은 표준이지만, 코드에서 부르는 이름은 플랫폼마다 다릅니다. 예를 들어 Arduino는 SPI_MODE0, STM32 HAL은 SPI_POLARITY_LOW와 SPI_PHASE_1EDGE 조합으로 표현합니다.
가장 흔히 쓰이는 SPI 모드는 무엇인가요?
Mode 0(CPOL 0, CPHA 0)이 많은 마이크로컨트롤러, 센서, SD 카드에서 기본값으로 가장 흔히 쓰이지만, 일부 부품은 Mode 1·2·3을 사용하므로 항상 해당 장치의 데이터시트로 확인해야 합니다.
모드 번호를 다시 CPOL과 CPHA로 변환할 수 있나요?
네. 모드 번호는 CPOL을 1비트 왼쪽으로 옮기고 CPHA와 합친 값이므로, 모드 번호의 상위 비트가 CPOL이고 하위 비트가 CPHA입니다. 이 페이지의 모드 버튼이 바로 이 계산을 수행합니다.