SPI(Serial Peripheral Interface)는 직렬 주변기기 인터페이스의 약어로, 마이크로컨트롤러(Master)와 센서, 메모리, 디스플레이와 같은 다양한 주변 장치(Slave) 간의 데이터 통신을 위해 설계된 동기식 직렬 통신 프로토콜이다.1 SPI는 주로 근거리, 특히 단일 회로 기판(on-board) 내의 칩 간 통신에 최적화되어 있다.4 이는 RS-232C나 CAN 버스와 같이 장거리 통신을 목적으로 하는 프로토콜들과 근본적으로 다른 설계 철학을 반영하며, 칩 간 통신에서 요구되는 높은 속도와 낮은 복잡성을 달성하는 데 주안점을 두었음을 시사한다. 이러한 개발 배경은 SPI 통신의 주요 장점인 고속 전송과 단순한 인터페이스를 가능케 하는 동시에, 거리 제약 및 노이즈에 대한 취약성이라는 단점의 근본적인 원인이 된다.
SPI 통신은 그 구조와 동작 방식에서 몇 가지 핵심적인 특징을 갖는다. 첫째, 마스터-슬레이브(Master-Slave) 구조로 동작한다.1 마스터는 통신을 시작하고 제어하는 주체로, 보통 MCU(Microcontroller Unit)가 그 역할을 수행한다.3 슬레이브는 마스터의 제어를 받는 주변 장치이며, SPI 통신은 한 개의 마스터와 한 개 이상의 슬레이브로 구성된다.1
둘째, 동기식(Synchronous) 통신 방식이다.2 마스터는 통신에 필요한 클럭 신호를 직접 생성하고(SCLK), 이 클럭 신호를 기준으로 데이터 송수신 타이밍을 동기화한다.2 이 방식은 송수신 장치 간에 미리 설정된 통신 속도(Baud Rate)를 맞춰야 하는 비동기식(Asynchronous) 통신(예: UART)과는 달리, 별도의 타이밍 동기화 과정이 필요 없어 통신 속도 오차 문제를 회피할 수 있다.11 이로 인해 SPI는 이론적으로 최대 클럭에 대한 제한이 없어 고속 통신에 매우 유리하다.4 하지만 실제 통신 속도는 통신 라인의 신호 무결성, 마스터의 출력 용량, 그리고 슬레이브 장치의 처리 능력에 의해 결정된다.3
셋째, 전이중(Full-duplex) 통신을 지원한다.2 이는 마스터와 슬레이브가 동시에 데이터를 송수신할 수 있음을 의미하며, SPI의 고속 통신을 가능케 하는 핵심적인 특징이다.
SPI 통신은 최소 네 개의 필수 신호선으로 구성된 4-와이어 버스를 사용한다.2 이 네 개의 신호선은 각각의 고유한 기능을 수행하며, 이 구조 덕분에 SPI는 전이중 통신이 가능하다. 각 핀의 기능과 역할은 다음 표에 요약되어 있다.
| 핀 명칭 | 전체 이름 | 마스터 역할 | 슬레이브 역할 | 신호 방향 | 주요 기능 |
|---|---|---|---|---|---|
| SCLK | Serial Clock | 출력(Out) | 입력(In) | Master –» Slave | 통신 타이밍 동기화를 위한 클럭 신호 생성 및 전송 2 |
| MOSI | Master Out Slave In | 출력(Out) | 입력(In) | Master –» Slave | 마스터가 슬레이브에게 데이터를 전송 2 |
| MISO | Master In Slave Out | 입력(In) | 출력(Out) | Slave –» Master | 슬레이브가 마스터에게 데이터를 전송 2 |
| SS / CS | Slave Select / Chip Select | 출력(Out) | 입력(In) | Master –» Slave | 마스터가 특정 슬레이브를 선택, 활성화 시키는 신호 2 |
Active-Low로 동작하며, 마스터가 특정 슬레이브의 SS/CS 핀을 LOW 상태로 만들 때 해당 슬레이브가 활성화되어 마스터의 클럭과 데이터에 반응한다.4SPI 통신은 1:N 통신이 가능하다는 장점을 갖지만, I2C 통신처럼 슬레이브를 식별하기 위한 별도의 주소값이 프로토콜 자체에 내장되어 있지 않다.4 대신 마스터는 SS/CS라는 별도의 아웃밴드(out-band) 신호선을 통해 통신할 슬레이브를 선택한다.4 이 방식은 슬레이브 수가 늘어날수록 마스터에 필요한 SS/CS 핀의 수도 비례하여 증가한다는 물리적 한계로 이어진다.2 이러한 배선 복잡성은 SPI 통신이 소수의 장치를 연결하는 근거리 통신에 주로 사용되는 이유를 뒷받침한다.4
SPI 통신의 핵심은 마스터와 슬레이브 양단에 존재하는 시프트 레지스터(Shift Register)를 이용한 데이터 교환 방식이다.4 마스터가 SCLK 클럭 신호를 생성하면, 매 클럭 주기마다 마스터의 시프트 레지스터에 저장된 데이터가 1비트씩 MOSI 라인을 통해 슬레이브로 밀려나간다.4 이와 동시에, 슬레이브의 시프트 레지스터에 저장된 데이터도 1비트씩 MISO 라인을 통해 마스터로 밀려들어온다. 이 과정을 추상화하여 표현하면 다음과 같다.
\(D_{M\_in,i} = D_{S\_out,i-1}, \quad D_{S\_in,i} = D_{M\_out,i-1}\)
여기서 D는 데이터를 의미하고, M은 마스터, S는 슬레이브, in은 입력, out은 출력, 그리고 i는 클럭 주기를 나타낸다. 이 수식은 i번째 클럭 주기에서 마스터의 입력 데이터는 슬레이브의 직전 출력 데이터(i−1 주기)와 같고, 슬레이브의 입력 데이터는 마스터의 직전 출력 데이터와 같음을 보여준다.
데이터 전송은 일반적으로 최상위 비트(MSB, Most Significant Bit)부터 이루어지지만, 장치에 따라 최하위 비트(LSB, Least Significant Bit)부터 전송하는 경우도 있으므로, 반드시 해당 장치의 데이터시트를 확인해야 한다.4
SPI 통신은 클럭 극성(CPOL)과 클럭 위상(CPHA)이라는 두 가지 파라미터를 조합하여 총 네 가지의 통신 모드를 정의한다.9 통신에 참여하는 모든 장치는 동일한 모드로 설정되어야만 정상적인 데이터 교환이 가능하다.21
SCLK의 기본 논리 레벨을 정의한다.9
CPOL = 0: 유휴 상태에서 SCLK가 LOW 상태이다.9CPOL = 1: 유휴 상태에서 SCLK가 HIGH 상태이다.9SCLK의 어느 엣지에서 데이터를 샘플링(Sampling)할지, 즉 데이터를 읽을 시점을 정의한다.9
CPHA = 0: SCLK의 첫 번째 엣지(Leading Edge)에서 데이터를 샘플링한다.9CPHA = 1: SCLK의 두 번째 엣지(Trailing Edge)에서 데이터를 샘플링한다.9이 두 파라미터의 조합으로 형성되는 네 가지 SPI 통신 모드는 다음 표와 같다.23
| 통신 모드 | CPOL (클럭 극성) | CPHA (클럭 위상) | 유휴 상태 클럭 | 데이터 샘플링 엣지 |
|---|---|---|---|---|
| Mode 0 | 0 | 0 | Low | 첫 번째 엣지 (상승 엣지) |
| Mode 1 | 0 | 1 | Low | 두 번째 엣지 (하강 엣지) |
| Mode 2 | 1 | 0 | High | 첫 번째 엣지 (하강 엣지) |
| Mode 3 | 1 | 1 | High | 두 번째 엣지 (상승 엣지) |
통신 모드는 SS 신호가 활성화된 이후의 클럭과 데이터의 타이밍 관계를 결정한다. 예를 들어, Mode 0 (CPOL=0, CPHA=0)의 경우, SS 신호가 LOW로 전환되면 SCLK는 유휴 상태인 LOW를 유지한다.17 이후 SCLK가 LOW에서 HIGH로 바뀌는 첫 번째 상승(Rising) 엣지에서 데이터를 샘플링하며, HIGH에서 LOW로 바뀌는 하강(Falling) 엣지에서 데이터를 출력한다.17
클럭과 데이터의 관계를 수학적으로 표현하면 다음과 같다.
과거에는 CPOL과 CPHA 값이 하나의 값으로 미리 지정되어 설계된 SPI 코어가 존재하여, 서로 다른 모드를 사용하는 장치들 간의 통신이 불가능했다.21 이 경우 하드웨어를 재설계해야 하는 문제가 발생하였다. 하지만 오늘날의 마이크로컨트롤러는 SPCR(SPI Control Register)과 같은 제어 레지스터를 통해 CPOL과 CPHA 값을 프로그래밍 방식으로 유연하게 설정할 수 있게 함으로써 이러한 호환성 문제를 해결하였다. 이는 SPI 통신이 단순한 하드웨어 프로토콜을 넘어, 소프트웨어적으로 유연하게 제어되는 방식으로 진화하였음을 보여준다.18
고속 통신: SPI는 클럭 신호에 대한 이론적인 제한이 없어 통신 속도가 빠르다.4
Push-Pull 출력 방식을 사용하여 신호 무결성을 확보하고 고속 데이터 전송을 지원한다.4
전이중 통신: MOSI와 MISO 신호선이 분리되어 있어 동시에 데이터를 주고받을 수 있으므로 통신 효율이 매우 높다.2
간단한 하드웨어 처리: 별도의 시작/정지 비트나 주소 지정 프로토콜이 필요 없어 하드웨어 인터페이스 처리 과정이 간단하다.4
저전력 소모: I2C 통신과 비교하여 상대적으로 낮은 전력을 소비한다.4
SS/CS 라인이 비례적으로 늘어나 배선이 복잡해지는 물리적인 한계가 존재한다.2CRC(Cyclic Redundancy Check)와 같은 오류 검사(Error Checking) 기능이 정의되어 있지 않다.4 따라서 데이터의 무결성은 전적으로 하드웨어적 안정성에 의존하게 된다. 하지만 이 한계는 일부 IC의 경우 SPI 명령어 구조에 CRC 코드를 포함시켜 보완할 수 있다.25 이는 SPI의 높은 프로토콜 유연성을 활용하여 응용 계층에서 기능을 확장한 사례이다.4SPI 통신은 I2C 및 UART와 같은 다른 주요 직렬 통신 프로토콜과 비교했을 때, 각각의 뚜렷한 장단점을 갖는다. 다음 표는 세 가지 프로토콜의 핵심 특징을 비교한다.
| 특징 | SPI (Serial Peripheral Interface) | I2C (Inter-Integrated Circuit) | UART (Universal Asynchronous Receiver/Transmitter) |
|---|---|---|---|
| 통신 방식 | 동기식, 전이중 | 동기식, 반이중 | 비동기식, 전이중 |
| 배선 수 | 최소 4개 (SCLK, MOSI, MISO, SS) | 2개 (SCL, SDA) | 2개 (Tx, Rx) |
| 통신 속도 | 빠름 (이론적 제한 없음, 10Mbps~20Mbps) | 상대적으로 느림 (Standard 100Kbps, Fast 400Kbps) | 느림 (Baud Rate에 의존, 최대 115,200bps) |
| 통신 구조 | 1 Master - 1:N Slave | 1:N Master - 1:N Slave | 1:1 통신 |
| 주소 지정 | SS/CS 신호선 사용 (하드웨어) |
7비트 또는 10비트 주소 사용 (소프트웨어) | 없음 |
| 장점 | 고속, 전이중, 간단한 하드웨어 | 배선 단순, 다수 마스터 지원 | 하드웨어 단순, 별도 클럭선 불필요 |
| 단점 | 배선 복잡, 오류 검사 부재 | 반이중, 통신 속도 느림 | 비동기식으로 인한 타이밍 오차 가능성 |
SPI와 I2C는 모두 마이크로컨트롤러와 주변 장치 간의 근거리 통신에 주로 사용된다. SPI는 전이중 통신과 고속이 필요한 응용 분야(예: ADC, 플래시 메모리)에 적합한 반면 4, I2C는 단 2개의 신호선만을 사용하고 주소 지정을 통해 다수의 슬레이브를 관리할 수 있어 배선 단순화가 중요한 저속 센서 네트워크에 주로 활용된다.11
반면 UART는 클럭선이 없는 비동기식 통신이라는 특징 덕분에 하드웨어 구성이 가장 단순하다.11 그러나 송수신 양단이 동일한 Baud Rate를 사용해야 하므로 타이밍 오차의 영향을 받을 수 있으며, 통신 속도도 상대적으로 느리다.11 결국 임베디드 시스템 설계자는 단순히 속도만을 고려할 것이 아니라, 전체 시스템의 배선 복잡도, 전력 소모, 오류 허용치 등 종합적인 요소를 고려하여 최적의 통신 프로토콜을 선택해야 한다.
마이크로컨트롤러(MCU)에서 SPI 통신을 구현하기 위해서는 다음과 같은 일반적인 절차를 거친다.
SCLK, MOSI, MISO, SS 핀들을 각각의 역할에 맞는 입출력 모드로 설정한다.24마스터 모드로 동작하도록 설정한다.18 또한, 주변 장치에 맞는 CPOL, CPHA 값을 설정하고, 클럭 분주비(Prescaler)를 조절하여 적절한 통신 속도를 결정한다.23SS 핀을 LOW로 설정하여 해당 장치를 활성화하고, 데이터 전송 및 수신을 진행한다.18이 과정에서 가장 중요한 것은 통신 대상 장치의 데이터시트를 정확하게 분석하는 것이다. 데이터시트는 CPOL/CPHA 설정(통신 모드), 데이터 전송 순서(MSB/LSB), 그리고 장치를 제어하기 위한 고유의 명령어 프로토콜을 명시하고 있어, 이를 토대로 MCU의 레지스터를 정확하게 설정해야만 정상적인 통신이 가능하다.15
마이크로컨트롤러는 SPI 통신을 위한 전용 레지스터와 함수를 제공한다. 예를 들어, ATmega328P MCU의 경우 다음과 같은 C 코드를 통해 SPI를 활성화하고 마스터로 설정할 수 있다.18
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); // SPI 활성화, 마스터 모드, 클럭 분주비 설정
STM32와 같은 현대의 MCU는 HAL(Hardware Abstraction Layer) 라이브러리를 통해 통신을 보다 쉽게 구현할 수 있다. HAL_SPI_TransmitReceive() 함수를 사용하면 데이터 송신과 수신을 동시에 처리할 수 있다.28
HAL_SPI_TransmitReceive(&hspi1, T_buffer, R_buffer, 8, 500); // 8비트 데이터 동시 송수신
실제 구현 시에는 DMA(Direct Memory Access) 모드를 사용할 때 타이밍 문제로 인해 데이터가 잘못 수신되는 경우가 발생할 수 있다. 이 경우 delay를 추가하거나, 함수 호출 시 타임아웃(timeout) 값을 충분히 늘리는 방식으로 문제를 해결할 수 있다.30 또한, max7219 LED 디스플레이 컨트롤러와 같은 일부 장치는 단순히 데이터를 보내는 것이 아니라, 먼저 주소(Address) 역할을 하는 명령어를 보내고, 그 다음 설정값(Data)을 보내는 복합적인 프로토콜을 사용하므로, 이러한 장치 고유의 통신 규격을 준수해야 한다.29
SPI 통신은 다양한 임베디드 시스템에서 활용된다.
BMP183) 31, 온도 및 모션 센서 3 등은 SPI를 통해 마이크로컨트롤러와 통신한다.ILI9341 또는 ST7789Vi와 같은 컨트롤러 칩을 탑재한 TFT LCD 모듈은 SPI 인터페이스를 사용하여 적은 수의 핀으로도 고해상도 이미지를 빠르게 처리할 수 있다.27SPI 통신은 고속, 전이중, 그리고 간단한 하드웨어 인터페이스를 제공하여 근거리 칩 간 통신이라는 특정 분야에서 독보적인 위치를 차지한다.4 특히 SCLK를 이용한 동기식 통신은 통신 속도 오차 문제를 회피하고 전송 안정성을 높이는 데 기여한다.11
하지만 SPI는 슬레이브 수에 따라 SS/CS 라인이 비례하여 증가하는 배선 복잡성과 프로토콜 자체에 오류 검사 기능이 부재하다는 한계를 갖는다.2 이러한 단점은 응용 분야의 특성과 소프트웨어 및 하드웨어 설계를 통해 극복될 수 있다. 예를 들어, CRC와 같은 오류 검사 기능은 통신 프로토콜 상위 계층에서 추가할 수 있으며 25, 배선 복잡성은 1:1 또는 소수의 슬레이브를 사용하는 시스템에 SPI를 적용함으로써 해소할 수 있다. 즉, SPI 통신은 그 한계와 장점을 명확히 이해하고, 다른 프로토콜(I2C, UART)과 비교하여 시스템의 목적에 맞는 최적의 통신 방식을 선택하는 것이 임베디드 시스템 설계의 핵심임을 재차 확인한다.
IoT, 자율주행 로봇, 실시간 모니터링 시스템 등 데이터의 신속한 처리가 필수적인 현대 기술 분야에서 SPI의 고속성과 안정성은 여전히 중요한 가치를 지닌다.3 기술이 발전함에 따라 데이터 전송 속도는 더욱 빨라질 것이며, 이는 신호 무결성(Signal Integrity) 문제의 중요성을 더욱 부각시킨다. 따라서 미래에는 PCB 레이아웃 최적화, 임피던스 매칭, 노이즈 감소 기술 등 하드웨어 설계의 완성도를 높이는 것이 SPI 통신의 성능과 신뢰성을 보장하는 데 더욱 중요한 요소가 될 것이다.34 SPI는 고속 근거리 통신의 표준으로서, 앞으로도 다양한 임베디드 시스템에서 중추적인 역할을 수행할 것으로 전망된다.
| SPI 통신 질문 - 인프런 | 커뮤니티 질문&답변, 8월 10, 2025에 액세스, https://www.inflearn.com/community/questions/974375/spi-%ED%86%B5%EC%8B%A0-%EC%A7%88%EB%AC%B8 |