TIL/Embedded

[임베디드] I2C, SPI 개념 정리

masacorgi 2025. 6. 15. 07:12

오늘의 주제는 I2C, SPI 개념 정리, 즉 센서와 MCU의 인터페이스이다.

이번에는 이전에 다뤘던 GPIO나 ADC처럼 직접 연결하는 단순한 방식이 아니라 센서 ↔ MCU 사이의 통신 규약, 특히 I2C와 SPI를 다룬다.

I2C와 SPI는 여러 장치를 주소로 구분해서 한 라인으로 제어하는 구조인데,

이후에 고급 센서나 여러 장치 제어할 때 필수로 익혀야 할 개념이라고 한다.

 

 

1. I2C와 SPI란?

MCU가 여러 센서나 주변 장치와 효율적으로 데이터를 주고받기 위해 사용하는 통신 방식
→ 동기식 직렬 통신(Serial Communication) 방식

 

2. SPI (Serial Peripheral Interface)

2.1 특징

  • 4개의 핀 사용
    • MOSI (Master Out Slave In)
    • MISO (Master In Slave Out)
    • SCK (Serial Clock)
    • SS/CS (Slave Select / Chip Select)
  • Full Duplex (양방향 동시 통신) 가능
  • 매우 빠르며 실시간성이 중요할 때 유리

2.2 구조

Master MCU ── SCK ──> Slave
             ── MOSI ──> 
             <── MISO ── 
             ── SS (Slave 선택용 핀)

2.3 사용 예시

  • SD 카드, TFT LCD, 고속 센서
  • 여러 Slave를 각각의 CS로 관리

 

 

3. I2C (Inter-Integrated Circuit)

3.1 특징

  • 2개의 핀만 사용
    • SDA (Serial Data)
    • SCL (Serial Clock)
  • 주소 기반 통신 (각 Slave에게 주소 부여)
  • Half Duplex (한 방향 통신 시 한 번에 하나만)

 

3.2 구조

MCU ── SDA ──+
             +── Slave1 (주소 0x40)
             +── Slave2 (주소 0x50)
MCU ── SCL ──+

3.3 사용 예시

  • DHT12, MPU6050 자이로센서, OLED 디스플레이
  • 저속 통신이지만 핀 수가 적고 구조 단순

 

4. 비교 요약

 

  SPI I2C
핀 수 4개 이상 (장치 수에 따라 증가) 2개 (SDA, SCL)
속도 빠름 느림
통신 방식 Full Duplex Half Duplex
연결 장치 Slave 개별 CS 핀 필요 주소 기반
사용 난이도 비교적 복잡 상대적으로 단순

 

 

 

5. 아두이노 코드 예시 (I2C 기준)

5.1 I2C로 온습도 센서(DHT12) 읽기 예시

#include <Wire.h>

void setup() {
  Wire.begin(); // I2C 시작
  Serial.begin(9600);
}

void loop() {
  Wire.beginTransmission(0x5C); // DHT12 주소
  Wire.write(0x00); // 데이터 시작 위치
  Wire.endTransmission();
  
  Wire.requestFrom(0x5C, 5); // 5바이트 요청
  
  byte hum = Wire.read(); // 습도
  Wire.read(); // 소수점 무시
  byte temp = Wire.read(); // 온도
  Wire.read(); // 소수점 무시
  Wire.read(); // 체크섬

  Serial.print("Temp: "); Serial.print(temp);
  Serial.print(" °C, Humid: "); Serial.print(hum);
  Serial.println(" %");
  
  delay(1000);
}

 

 

 

 

 

6. 참고자료