I2C와 UART 통신 프로토콜 가이드 (Part 2) - I2C 통신 방식과 비교 분석

2025. 7. 1. 15:23·하드웨어
반응형

 

시리즈 가이드: Part 1: 기본 개념과 UART 통신 방식 | Part 2: I2C 통신 방식과 비교 분석 (현재 글)

목차

  • 1. I2C 개요
  • 2. I2C 통신 프로토콜
    • 2.1. I2C 작동 원리
    • 2.2. I2C 통신 프로토콜
    • 2.3. I2C의 특징과 장단점
  • 3. I2C 구현 예제
  • 4. UART와 I2C 비교 분석
  • 5. 결론

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);
}

위 코드는 다음과 같은 동작을 수행합니다:

  1. Wire 라이브러리를 통해 I2C 통신 초기화
  2. I2C 주소(0x76)로 BME280 센서 연결
  3. 센서에서 온도, 기압, 습도 데이터 주기적 요청 및 읽기
  4. 시리얼 모니터로 읽은 데이터 출력

이 예제처럼 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는 제한된 수의 핀으로 여러 장치와 통신해야 하는 복잡한 시스템에 적합합니다. 실제 프로젝트에서는 종종 두 프로토콜을 모두 활용하여 다양한 목적에 맞게 최적의 통신 환경을 구축하게 됩니다.

임베디드 시스템 개발에서는 이러한 통신 프로토콜의 기본 원리를 이해하는 것이 효율적인 시스템 설계와 디버깅에 큰 도움이 됩니다. 이 시리즈가 여러분의 임베디드 프로젝트에 도움이 되기를 바랍니다.

시리즈 가이드: Part 1: 기본 개념과 UART 통신 방식 | Part 2: I2C 통신 방식과 비교 분석 (현재 글)

참고자료

  • I2C Bus Specification
  • SparkFun: I2C Tutorial
  • NXP I2C Bus Specification
  • Arduino I2C Scanner
저작자표시 비영리 변경금지 (새창열림)

'하드웨어' 카테고리의 다른 글

윈도우 설치 오류 해결: "이 디스크에 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
'하드웨어' 카테고리의 다른 글
  • 윈도우 설치 오류 해결: "이 디스크에 Windows를 설치할 수 없습니다"
  • 오렌지 파이 3 LTS (Orange Pi 3 LTS) 완벽 분석: 라즈베리 파이의 강력한 대안
  • I2C와 UART 통신 프로토콜 가이드 (Part 1) - 기본 개념과 UART 통신 방식
  • 라즈베리파이 5 GPIO 문제 완전 해결: rpi-lgpio로 Node-RED 정상화하기
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    리스트
    스크립트 실행
    유니티
    codingtips
    rtsp
    ipcamera
    믈레코비타멸균우유
    unity
    파이썬
    상품 리뷰 크롤링
    C#
    리뷰이관
    리뷰관리
    스마트스토어리뷰
    devlife
    쇼핑몰리뷰
    카페24리뷰
    Python
    cv2
    learntocode
    programmerlife
    카페24리뷰이관
    라떼우유
    programming101
    셀레니움
    긴유통기한우유
    스크립트 실행 순서
    list
    appdevelopment
    codingcommunity
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
I2C와 UART 통신 프로토콜 가이드 (Part 2) - I2C 통신 방식과 비교 분석
상단으로

티스토리툴바