목차
1. I2C 개요
I2C(Inter-Integrated Circuit)는 필립스(현 NXP 반도체)에서 1982년에 개발한 동기식 직렬 통신 프로토콜로, 짧은 거리에서 저속 통신을 위한 목적으로 설계되었습니다. 특히 단일 마이크로컨트롤러와 여러 주변 장치 간의 통신에 널리 사용됩니다. I2C는 '아이-투-씨', '아이-스퀘어드-씨' 등으로 발음합니다.
I2C의 주요 특징:
- 두 개의 선(SDA, SCL)만으로 다중 장치 연결 가능
- 마스터-슬레이브 구조로 통신
- 각 장치는 고유 주소를 가짐
- 표준 모드에서 최대 100kHz, 고속 모드에서 최대 400kHz 속도 지원
- 현대 버전에서는 최대 5MHz 속도 지원
2. I2C 통신 프로토콜
2.1. I2C 작동 원리
I2C는 두 개의 신호선을 사용합니다:
- SDA(Serial Data): 데이터 전송을 위한 선
- SCL(Serial Clock): 클럭 신호를 제공하는 선
두 선 모두 기본적으로 풀업 저항을 통해 HIGH 상태로 유지되며, 통신할 때 장치에 의해 LOW 상태로 당겨집니다(오픈 드레인/오픈 콜렉터 방식). 이 방식은 여러 장치가 동일한 버스에 연결되어도 신호 충돌을 방지합니다.
2.2. I2C 통신 프로토콜
I2C 통신은 다음과 같은 주요 단계로 이루어집니다:
1) 시작 조건(Start Condition)
SCL이 HIGH 상태일 때 SDA가 HIGH에서 LOW로 전환되는 것으로, 통신의 시작을 알립니다.
2) 주소 전송(Address Transmission)
마스터가 통신하려는 슬레이브의 7비트 또는 10비트 주소를 전송합니다. 주소 뒤에는 1비트 읽기/쓰기 비트가 따라옵니다(0=쓰기, 1=읽기).
3) 데이터 전송(Data Transmission)
8비트 데이터를 한 번에 전송하며, 각 바이트 전송 후 수신 장치가 ACK(Acknowledgment) 비트를 보내 성공적인 수신을 알립니다.
4) 정지 조건(Stop Condition)
SCL이 HIGH 상태일 때 SDA가 LOW에서 HIGH로 전환되는 것으로, 통신의 종료를 알립니다.
2.3. I2C의 특징과 장단점
장점
- 두 개의 선만으로 여러 장치 연결 가능
- 각 장치가 고유 주소를 가져 충돌 없이 통신
- 하드웨어적으로 간단한 구현
- ACK/NACK 메커니즘으로 데이터 무결성 확인
- 클럭 스트레칭을 통한 속도 제어 가능
- 많은 센서와 디스플레이가 I2C 인터페이스 지원
단점
- UART보다 복잡한 프로토콜
- 풀업 저항 필요
- 상대적으로 느린 통신 속도
- 선로 용량에 의한 거리 제한(약 2-3m 이내)
- 최대 127개(7비트 주소) 또는 1023개(10비트 주소)의 장치만 연결 가능
- 양방향 동시 통신 불가능(반이중 통신)
일반적인 사용 사례
- 온도, 습도, 기압 등의 센서 연결
- EEPROM, 실시간 시계(RTC) 등의 저속 메모리 액세스
- OLED, LCD 디스플레이 제어
- 복수의 마이크로컨트롤러 간 통신
- 디지털 포텐셔미터, DAC/ADC 제어
3. I2C 구현 예제
Arduino를 사용한 간단한 I2C 통신 예제를 살펴보겠습니다. 이 예제는 I2C 인터페이스를 가진 온도 센서(예: BME280)에서 데이터를 읽는 과정을 보여줍니다.
// Arduino I2C 통신 예제 - BME280 센서 읽기
#include <Wire.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // I2C 인터페이스 사용
void setup() {
Serial.begin(9600);
Serial.println("BME280 I2C 테스트 시작");
// I2C 초기화 (Arduino에서는 A4=SDA, A5=SCL)
Wire.begin();
// BME280 센서 초기화 (기본 I2C 주소: 0x76)
if (!bme.begin()) {
Serial.println("BME280 센서를 찾을 수 없습니다!");
while (1);
}
}
void loop() {
// 센서에서 데이터 읽기
float temp = bme.readTemperature();
float pressure = bme.readPressure() / 100.0F;
float humidity = bme.readHumidity();
// 데이터 출력
Serial.print("온도: ");
Serial.print(temp);
Serial.println(" °C");
Serial.print("기압: ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("습도: ");
Serial.print(humidity);
Serial.println(" %");
Serial.println();
delay(2000);
}
위 코드는 다음과 같은 동작을 수행합니다:
- Wire 라이브러리를 통해 I2C 통신 초기화
- I2C 주소(0x76)로 BME280 센서 연결
- 센서에서 온도, 기압, 습도 데이터 주기적 요청 및 읽기
- 시리얼 모니터로 읽은 데이터 출력
이 예제처럼 I2C는 간단한 코드로 여러 센서에 접근할 수 있어 다양한 임베디드 프로젝트에서 효율적으로 사용됩니다.
4. UART와 I2C 비교 분석
지금까지 UART와 I2C에 대해 각각 살펴보았습니다. 이제 두 통신 방식의 주요 차이점을 비교해 보겠습니다.
특성 | UART | I2C |
---|---|---|
통신 방식 | 비동기식(Asynchronous) | 동기식(Synchronous) |
사용 선 수 | 2선(TX, RX) + GND | 2선(SDA, SCL) + GND |
다중 장치 | 1:1 통신만 가능 | 다중 장치 연결 가능(최대 127개) |
통신 속도 | 일반적으로 9600~115200 bps | 표준: 100kHz, 고속: 400kHz, 초고속: ~5MHz |
통신 거리 | 인터페이스에 따라 수십 미터 가능 | 2-3m 이내로 제한 |
구현 복잡성 | 매우 간단 | 중간 수준 |
주소 지정 | 필요 없음(1:1 통신) | 각 장치가 고유 주소 필요 |
데이터 무결성 | 패리티 비트로 제한적 확인 | ACK/NACK 메커니즘으로 확인 |
적합한 사용 사례 | 간단한 1:1 통신, 디버깅, 모듈 통신 | 다수 센서 연결, 단거리 내 많은 장치 통신 |
선택 가이드
다음과 같은 경우에는 UART가 더 적합합니다:
- 두 장치 간의 단순한 통신이 필요할 때
- 추가 하드웨어 없이 간단히 구현하고 싶을 때
- 디버깅 목적의 통신이 필요할 때
- 기존 모듈(GPS, 블루투스 등)과 통신할 때
- 장거리 통신이 필요할 때(적절한 인터페이스 추가 시)
다음과 같은 경우에는 I2C가 더 적합합니다:
- 여러 장치를 적은 수의 핀으로 제어해야 할 때
- 디지털 센서들과 통신할 때
- 여러 마이크로컨트롤러 간 데이터 공유가 필요할 때
- 표준화된 프로토콜로 다양한 장치와 통신이 필요할 때
- 통신 안정성이 중요할 때
5. 결론
이 시리즈를 통해 임베디드 시스템에서 가장 널리 사용되는 두 가지 통신 방식인 UART와 I2C의 작동 원리, 특징, 장단점 및 사용 사례를 살펴보았습니다. 각 통신 방식은 고유한 특징과 장단점을 가지고 있으며, 구체적인 프로젝트 요구사항에 따라 적절한 통신 방식을 선택하는 것이 중요합니다.
UART는 간단하고 직관적이며 두 장치 간의 점대점 통신에 이상적입니다. 반면 I2C는 제한된 수의 핀으로 여러 장치와 통신해야 하는 복잡한 시스템에 적합합니다. 실제 프로젝트에서는 종종 두 프로토콜을 모두 활용하여 다양한 목적에 맞게 최적의 통신 환경을 구축하게 됩니다.
임베디드 시스템 개발에서는 이러한 통신 프로토콜의 기본 원리를 이해하는 것이 효율적인 시스템 설계와 디버깅에 큰 도움이 됩니다. 이 시리즈가 여러분의 임베디드 프로젝트에 도움이 되기를 바랍니다.
'하드웨어' 카테고리의 다른 글
윈도우 설치 오류 해결: "이 디스크에 Windows를 설치할 수 없습니다" (1) | 2025.07.10 |
---|---|
오렌지 파이 3 LTS (Orange Pi 3 LTS) 완벽 분석: 라즈베리 파이의 강력한 대안 (0) | 2025.07.07 |
I2C와 UART 통신 프로토콜 가이드 (Part 1) - 기본 개념과 UART 통신 방식 (0) | 2025.07.01 |
라즈베리파이 5 GPIO 문제 완전 해결: rpi-lgpio로 Node-RED 정상화하기 (1) | 2025.05.31 |
라즈베리파이 USB 카메라 완벽 설정: 연결부터 실시간 스트리밍까지 (0) | 2025.05.30 |