SPI 통신 (Serial Peripheral Interface)의 구조와 장점 및 단점

1. SPI 통신이란?

SPI의 정의

SPI(Serial Peripheral Interface)는 마이크로컨트롤러와 주변 장치 간의 고속 동기 직렬 통신을 지원하는 프로토콜입니다. 데이터 전송 속도가 빠르고, 간단한 하드웨어 구성으로 다양한 장치와 통신할 수 있어 전자 제품 설계에서 널리 사용됩니다.

SPI의 주요 특징

  • 고속 데이터 전송: 최대 수십 MHz까지 지원
  • 동기식 통신: 클록 신호(SCK)를 기준으로 데이터 전송
  • 다중 슬레이브 지원: 한 마스터가 여러 슬레이브와 통신 가능
  • 풀듀플렉스 통신: 송신과 수신을 동시에 처리

2. SPI 통신의 구조와 구성

기본 구성 요소

  1. 마스터(Master)

    • 통신을 제어하는 주체
    • 클록 신호(SCK) 생성 및 데이터 전송 관리
  2. 슬레이브(Slave)

    • 마스터의 명령을 따르는 장치
    • 다수의 슬레이브가 연결될 수 있음
  3. 4개의 주요 신호 라인

    • SCK(Serial Clock): 마스터가 생성하는 클록 신호
    • MOSI(Master Out, Slave In): 마스터에서 슬레이브로 데이터 전송
    • MISO(Master In, Slave Out): 슬레이브에서 마스터로 데이터 전송
    • SS(Slave Select): 특정 슬레이브를 선택하는 신호

3. SPI 통신의 동작 원리

데이터 전송 방식

  1. 클록 신호를 기반으로 동기화

    • SCK 신호는 데이터 전송 타이밍을 결정
    • 슬레이브는 클록 신호를 기준으로 데이터를 전송하거나 수신
  2. 풀듀플렉스 통신

    • MOSI와 MISO를 통해 동시에 데이터 송수신 가능
    • 한 쪽에서 데이터를 전송하면, 반대쪽에서 데이터를 수신

통신 절차

  1. 마스터가 SS 신호를 LOW로 설정하여 특정 슬레이브 선택
  2. SCK 신호를 생성하여 데이터 전송 시작
  3. MOSI로 데이터 전송, MISO로 데이터 수신
  4. 통신 완료 후 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 통신의 장점과 단점

장점

  1. 빠른 데이터 전송 속도

    • 비동기 통신(UART)보다 훨씬 높은 속도 제공
  2. 간단한 구현

    • I2C와 비교해 프로토콜이 단순하며 하드웨어 구성도 간단
  3. 다중 슬레이브 지원

    • 한 마스터가 여러 슬레이브와 독립적으로 통신 가능
  4. 풀듀플렉스 통신

    • 데이터를 동시에 송신 및 수신 가능

단점

  1. 많은 신호 라인 필요

    • 슬레이브 개수가 늘어날수록 SS 라인이 추가 필요
  2. 통신 거리 제한

    • 신호 간섭 및 감쇠로 인해 장거리 통신에 부적합
  3. 복잡한 다중 마스터 구조

    • 다중 마스터 구성은 충돌 문제를 초래할 수 있음

6. SPI 통신의 실제 적용

사용 사례

  1. 센서 데이터 수집

    • SPI를 통해 온도 센서, 압력 센서 등의 데이터를 마이크로컨트롤러로 전송
  2. 메모리 장치와의 통신

    • 플래시 메모리나 EEPROM과 데이터를 교환
  3. 디스플레이 제어

    • OLED나 LCD와 같은 디스플레이의 픽셀 데이터를 빠르게 전송
  4. 사운드 모듈 제어

    • 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는 빠르고 안정적인 통신을 제공하는 강력한 프로토콜입니다. 마이크로컨트롤러와 다양한 주변 장치를 연결하여 창의적인 프로젝트를 구현하는 데 필수적인 기술로 자리 잡고 있습니다.