1. SPI 통신이란?
SPI의 정의
SPI(Serial Peripheral Interface)는 마이크로컨트롤러와 주변 장치 간의 고속 동기 직렬 통신을 지원하는 프로토콜입니다. 데이터 전송 속도가 빠르고, 간단한 하드웨어 구성으로 다양한 장치와 통신할 수 있어 전자 제품 설계에서 널리 사용됩니다.
SPI의 주요 특징
- 고속 데이터 전송: 최대 수십 MHz까지 지원
- 동기식 통신: 클록 신호(SCK)를 기준으로 데이터 전송
- 다중 슬레이브 지원: 한 마스터가 여러 슬레이브와 통신 가능
- 풀듀플렉스 통신: 송신과 수신을 동시에 처리
2. SPI 통신의 구조와 구성
기본 구성 요소
-
마스터(Master)
- 통신을 제어하는 주체
- 클록 신호(SCK) 생성 및 데이터 전송 관리
-
슬레이브(Slave)
- 마스터의 명령을 따르는 장치
- 다수의 슬레이브가 연결될 수 있음
-
4개의 주요 신호 라인
- SCK(Serial Clock): 마스터가 생성하는 클록 신호
- MOSI(Master Out, Slave In): 마스터에서 슬레이브로 데이터 전송
- MISO(Master In, Slave Out): 슬레이브에서 마스터로 데이터 전송
- SS(Slave Select): 특정 슬레이브를 선택하는 신호
3. SPI 통신의 동작 원리
데이터 전송 방식
-
클록 신호를 기반으로 동기화
- SCK 신호는 데이터 전송 타이밍을 결정
- 슬레이브는 클록 신호를 기준으로 데이터를 전송하거나 수신
-
풀듀플렉스 통신
- MOSI와 MISO를 통해 동시에 데이터 송수신 가능
- 한 쪽에서 데이터를 전송하면, 반대쪽에서 데이터를 수신
통신 절차
- 마스터가 SS 신호를 LOW로 설정하여 특정 슬레이브 선택
- SCK 신호를 생성하여 데이터 전송 시작
- MOSI로 데이터 전송, MISO로 데이터 수신
- 통신 완료 후 SS 신호를 HIGH로 설정하여 슬레이브 비활성화
4. SPI 통신의 모드
클록 극성과 위상
SPI는 클록의 극성(CPOL)과 위상(CPHA)에 따라 4가지 모드를 지원합니다.
- CPOL: 클록 신호의 기본 상태 (HIGH 또는 LOW)
- CPHA: 클록 신호의 상승/하강 에지에서 데이터를 샘플링
| 모드 | CPOL | CPHA | 데이터 샘플링 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 상승 에지 |
| Mode 1 | 0 | 1 | 하강 에지 |
| Mode 2 | 1 | 0 | 하강 에지 |
| Mode 3 | 1 | 1 | 상승 에지 |
5. SPI 통신의 장점과 단점
장점
-
빠른 데이터 전송 속도
- 비동기 통신(UART)보다 훨씬 높은 속도 제공
-
간단한 구현
- I2C와 비교해 프로토콜이 단순하며 하드웨어 구성도 간단
-
다중 슬레이브 지원
- 한 마스터가 여러 슬레이브와 독립적으로 통신 가능
-
풀듀플렉스 통신
- 데이터를 동시에 송신 및 수신 가능
단점
-
많은 신호 라인 필요
- 슬레이브 개수가 늘어날수록 SS 라인이 추가 필요
-
통신 거리 제한
- 신호 간섭 및 감쇠로 인해 장거리 통신에 부적합
-
복잡한 다중 마스터 구조
- 다중 마스터 구성은 충돌 문제를 초래할 수 있음
6. SPI 통신의 실제 적용
사용 사례
-
센서 데이터 수집
- SPI를 통해 온도 센서, 압력 센서 등의 데이터를 마이크로컨트롤러로 전송
-
메모리 장치와의 통신
- 플래시 메모리나 EEPROM과 데이터를 교환
-
디스플레이 제어
- OLED나 LCD와 같은 디스플레이의 픽셀 데이터를 빠르게 전송
-
사운드 모듈 제어
- DAC(디지털-아날로그 변환기)와 통신하여 오디오 신호 생성
7. SPI 통신을 활용한 간단한 예제
준비물
- 아두이노 Uno
- SPI 지원 슬레이브 장치 (예: SD 카드 모듈)
- 점퍼 케이블
아두이노 코드 예제
마스터 코드
#include <SPI.h>
void setup() {
SPI.begin(); // SPI 시작
pinMode(10, OUTPUT); // SS 핀 설정
digitalWrite(10, HIGH); // 슬레이브 비활성화
}
void loop() {
digitalWrite(10, LOW); // 슬레이브 활성화
SPI.transfer(0x42); // 데이터 전송
digitalWrite(10, HIGH); // 슬레이브 비활성화
delay(1000); // 1초 대기
}
슬레이브 코드
#include <SPI.h>
volatile byte receivedData;
void setup() {
pinMode(MISO, OUTPUT); // MISO 핀 출력 설정
SPCR |= _BV(SPE); // SPI 활성화
SPI.attachInterrupt(); // SPI 인터럽트 설정
}
ISR(SPI_STC_vect) {
receivedData = SPDR; // 수신 데이터 읽기
}
void loop() {
// 수신 데이터에 따라 작업 수행
}
8. SPI 통신 시 유의점
신호 간섭 방지
- 짧은 케이블 사용 및 주변 간섭 최소화
슬레이브 선택 관리
- SS 라인을 신중히 설계하여 원하는 슬레이브만 활성화
전송 속도 설정
- 과도한 속도는 데이터 손실을 초래할 수 있으므로 적절한 속도로 설정
9. SPI와 다른 통신 프로토콜 비교
| 프로토콜 | 전송 속도 | 핀 수 | 데이터 방향 | 주요 특징 |
|---|---|---|---|---|
| SPI | 매우 빠름 | 4개 | 풀듀플렉스 | 고속, 간단한 하드웨어 구성 |
| I2C | 보통 | 2개 | 반이중 | 다중 슬레이브 관리 용이 |
| UART | 보통 | 2개 | 반이중 | 장거리 통신 가능 |
10. SPI 학습을 위한 추천 리소스
SPI는 빠르고 안정적인 통신을 제공하는 강력한 프로토콜입니다. 마이크로컨트롤러와 다양한 주변 장치를 연결하여 창의적인 프로젝트를 구현하는 데 필수적인 기술로 자리 잡고 있습니다.
