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. 참고자료