nutblog

실무 기반 반도체 지식과 취업·직무 경험을 공유하는 엔지니어링 Blog 입니다.

  • 2025. 4. 29.

    by. nutblog

    I2C(Inter-Integrated Circuit)는 두 개의 신호선(SCL, SDA)만으로 여러 장치를 연결할 수 있는 매우 효율적인 통신 규격입니다.
    MCU, 센서, 메모리, PMIC, 전력 모니터링 IC 등 수많은 디바이스가 I2C를 통해 연결되며,
    특히 저전력 시스템, 소형 디바이스, 복합 전자기기에서 표준처럼 사용됩니다.
    하지만 I2C는 구조상 풀업 저항, 라인 임피던스, 신호 품질, 타임아웃 등에 매우 민감하여,
    설계나 디버깅 과정에서 통신 오류, 데이터 손실, 디바이스 인식 실패 등 다양한 문제가 발생할 수 있습니다.
    이번 글에서는 I2C 통신을 신뢰성 높게 설계하고 운용하기 위한 하드웨어·소프트웨어 꿀팁을 체계적으로 정리해보겠습니다.


    I2C 통신의 기본 동작 원리 복습

    I2C는 다음과 같은 방식으로 동작합니다:

    • SDA(Data)와 SCL(Clock) 라인 모두 오픈드레인(Open-Drain) 구성
    • 풀업 저항을 통해 High 상태 유지, 디바이스가 Low로 당기는 구조
    • Master(예: MCU)가 클록을 제어하고, Slave(센서 등)가 응답
    • Start Condition: SDA가 High → Low로 떨어질 때 SCL이 High
    • Stop Condition: SDA가 Low → High로 올라갈 때 SCL이 High

    이 기본 원리를 이해하고 있어야 문제 발생 시 정확한 원인 분석이 가능합니다.


    풀업 저항 선택이 통신 품질을 좌우한다

    I2C 통신의 가장 중요한 하드웨어 요소는 풀업 저항입니다.
    풀업 저항 값이 너무 크면 신호 상승 속도가 느려지고, 너무 작으면 전류 소모가 커지고 라인에 과부하가 걸릴 수 있습니다.
    일반적인 권장값은 다음과 같습니다:

    • 표준 모드(100kHz): 4.7kΩ ~ 10kΩ
    • 패스트 모드(400kHz): 2.2kΩ ~ 4.7kΩ
    • 패스트 플러스 모드(1MHz): 1kΩ ~ 2.2kΩ

    라인 길이가 길거나 슬레이브 디바이스 수가 많으면 더 낮은 저항을 사용하여 신호 품질을 높이는 것이 좋습니다.


    라인 길이와 배선 주의사항

    I2C는 기본적으로 PCB 내부 짧은 거리용 통신 규격입니다.
    라인 길이가 길어지면 다음 문제가 발생할 수 있습니다:

    • 신호 지연(Propagation Delay)
    • 임피던스 불일치로 인한 신호 반사
    • 외부 노이즈 유입

    따라서 가능한 한 SDA와 SCL을 짧고 평행하게 배치하고,
    특히 GND를 충분히 확보하여 리턴 커런트 루프를 최소화해야 합니다.
    1미터 이상 라인이 필요한 경우에는 I2C 버퍼 IC(P82B96 등)를 사용하여 신호를 증폭하는 것이 필수입니다.


    강한 노이즈 환경에서는 보호 회로를 추가해야

    공장 자동화, 차량용 시스템, 모터 제어기 등 강한 전자기 간섭(EMI)이 예상되는 환경에서는,
    단순 풀업 저항만으로는 안정적인 I2C 통신을 보장할 수 없습니다.
    이 경우 다음 보호 회로를 추가하는 것이 좋습니다:

    • SDA/SCL 라인에 TVS 다이오드 삽입 (정전기 보호)
    • 100Ω 직렬 저항 삽입하여 신호 슬루율(Slew Rate) 조절
    • 100pF~200pF 커패시터 삽입하여 고주파 노이즈 필터링

    이러한 추가 설계는 시스템의 내구성과 EMC 성능을 크게 향상시켜줍니다.


    소프트웨어 측면 – 타임아웃과 재시도 루틴 구현

    I2C 통신은 하드웨어 에러 외에도 디바이스 응답 지연, 버스 끼임(bus hang) 같은 문제가 발생할 수 있습니다.
    이를 방지하려면 MCU 펌웨어에서 다음을 구현해야 합니다:

    • 타임아웃 설정: 응답이 없을 경우 정해진 시간 이후 통신을 중단
    • 재시도(Recovery) 루틴: 실패 시 재전송 또는 버스 초기화
    • 버스 리셋 시퀀스: SDA를 Low로 9회 이상 토글하여 버스 해제

    이러한 소프트웨어 보완이 없으면, 단 하나의 에러로 전체 시스템이 멈추는 치명적 문제가 발생할 수 있습니다.


    여러 슬레이브 연결 시 주소 충돌 주의

    I2C는 각 디바이스에 7비트 주소를 부여하는데, 서로 다른 장치가 같은 주소를 갖는 경우 통신 에러가 발생합니다.
    따라서 시스템 설계 초기 단계에서 모든 슬레이브 디바이스의 주소를 확인하고 충돌 방지해야 합니다.
    가능한 경우, 주소 변경이 가능한 디바이스(A0, A1 핀 설정)를 사용하여 유연성을 확보하는 것도 좋은 방법입니다.

     

     

    I2C 통신 안정화 꿀팁 정리 – 신뢰성 높은 버스 구축법

     

    디버깅 팁 – I2C 스캐너 활용

    I2C 통신 문제를 디버깅할 때는, 먼저 I2C 주소 스캐너 프로그램을 이용해 연결된 슬레이브 디바이스 목록을 확인하는 것이 가장 효과적입니다.
    아두이노, ESP32 등에서는 간단한 스캐너 예제를 실행해보면 연결 상태를 바로 확인할 수 있습니다.
    스캐너가 특정 주소를 찾지 못하면, 물리적 연결, 풀업 저항, 전원 공급 여부부터 점검해야 합니다.


    I2C는 단순하지만 섬세한 통신입니다

    I2C는 회로 구성이 간단하고 유연성이 높지만,
    통신 신뢰성을 확보하려면 풀업 저항, 배선 최적화, 노이즈 대비, 소프트웨어 보완 등 세심한 설계가 반드시 필요합니다.
    하드웨어와 펌웨어를 모두 고려하여 안정된 통신 환경을 구축하면,
    수십 개의 디바이스가 동시에 연결된 복잡한 시스템에서도 오류 없는 견고한 I2C 네트워크를 만들 수 있습니다.
    단순히 ‘연결만 되면 된다’는 생각을 넘어서,
    진짜 산업용 수준의 안정성을 갖춘 I2C 시스템을 설계해보시기 바랍니다.


    실무에서 자주 겪는 I2C 통신 오류와 대처법

    I2C 통신은 개발 단계에서는 잘 동작하다가도, 실제 제품 양산 과정이나 열악한 현장 환경에서는 문제를 일으키는 경우가 많습니다.
    특히 흔한 문제는 버스가 완전히 잠겨서(MCU 리셋해도 풀리지 않는 상태) 전체 시스템이 멈추는 것입니다.
    이런 상황에서는 소프트웨어적으로 SCL을 강제로 수 회 펄스 출력하여 SDA를 해제하거나,
    MCU에서 I2C 모듈을 리셋하는 방법으로 복구할 수 있습니다.
    또한, 전원 인가 순서가 틀리거나 슬레이브 디바이스 초기화가 지연될 때 발생하는 문제도 많으므로,
    통신 시작 전에 슬레이브가 완전히 준비되었는지 확인하는 Ready 체크 루틴을 추가하는 것이 매우 중요합니다.