전자회로 실무 / 통신·신호

I2C(Inter-Integrated Circuit) 모듈(module)을 추가했다면 이미 달린 풀업(pull-up) 저항부터 합산합니다

I2C(Inter-Integrated Circuit) 모듈(module)을 추가한 뒤 통신이 불안정해졌다면 풀업(pull-up) 저항이 몇 개 연결됐는지 세어 보세요. 모듈마다 달린 저항이 병렬로 연결되므로, SDA(Serial Data)와 SCL(Serial Clock)의 합성 저항과 파형이 달라질 수 있습니다.

먼저 알아둘 용어

I2C(Inter-Integrated Circuit)·SDA(Serial Data)·SCL(Serial Clock) — I2C는 여러 장치가 데이터선 SDA와 클록(clock)선 SCL을 공유하는 통신 방식입니다. 전송을 시작한 제어기가 SCL 클록을 만듭니다. 그러나 클록 스트레칭(clock stretching)을 지원하는 대상 장치는 SCL을 LOW로 붙잡아 진행을 늦출 수 있고, 제어기가 여럿이면 다른 제어기도 SCL을 구동할 수 있습니다. 각 선을 LOW로 당기는 장치와 HIGH로 올리는 풀업 저항이 함께 동작합니다.

풀업(pull-up)·싱크 전류 — 풀업 저항은 신호를 정해진 전원 전압 쪽으로 올립니다. 장치가 LOW를 만들 때는 저항을 통해 흐르는 전류를 받아 내리는 싱크 능력이 필요합니다.

버스(bus) 용량·상승 시간 — 버스 용량은 연결된 핀(pin)과 배선에 축적되는 전하의 영향을 나타냅니다. 풀업이 이 용량을 충전하므로 저항이 너무 크면 HIGH로 올라가는 시간이 길어집니다.

VOL·IOL·VIH·VIL — VOL은 출력 LOW 전압, IOL은 그 조건에서 장치가 흡수하는 LOW 전류입니다. VIH는 수신기가 HIGH로 인정하는 최소 전압, VIL은 LOW로 인정하는 최대 전압입니다.

VDD·tr·C·단위 — VDD는 풀업 전원, tr은 정의된 구간의 상승 시간, C는 핀·배선을 합한 버스 용량입니다. pF는 10⁻¹² F, ns는 10⁻⁹초입니다.

여러 모듈에 있는 풀업 저항이 같은 버스 선에서 병렬이 되는 연결 관계입니다.
여러 모듈에 있는 풀업 저항이 같은 버스 선에서 병렬이 되는 연결 관계입니다. · 클릭하면 확대됩니다.

모듈마다 달린 저항은 같은 선에서 합쳐집니다

브레이크아웃 모듈은 작은 부품을 쉽게 연결하도록 핀과 주변 회로를 마련한 보드(board)입니다. 이 주변 회로에 풀업이 포함되어 있을 수 있습니다. MCU(Microcontroller Unit) 보드에도 풀업이 있으면 모듈을 늘릴 때 의도하지 않게 병렬 연결이 늘어납니다. SDA와 SCL은 서로 다른 선이므로 두 선을 섞어 합산하지 않습니다.

전원을 끄고 각 모듈의 회로도·점퍼(jumper)·실장 저항을 확인합니다. SDA와 SCL을 각각 조사하고, 어느 전압으로 올라가는지 기록합니다. MCU 보드, 센서(sensor) 모듈, 변환 보드에 나뉜 저항을 빠뜨리지 않습니다. 단순히 버스 전체를 저항계로 재면 반도체 경로나 커패시터(capacitor) 때문에 각 저항을 정확히 분리해 알기 어려울 수 있습니다.

작은 자체 기판을 설계할 때는 조립을 마친 뒤에야 풀업 저항이 빠진 것을 알게 되지 않도록 배치 단계에서 확인합니다. 배터리 상태를 측정하는 배터리 게이지(battery gauge)를 I2C로 연결한다면 SDA와 SCL의 풀업이 회로도와 부품 목록에 각각 있는지, 두 저항을 실제 기판에 실장할 자리가 있는지 대조하세요. 같은 배치도에서 프로그램을 넣고 문제를 점검할 디버그 커넥터(debug connector)의 접점과 케이블 접근 공간도 확인합니다. 기판 층수를 늘리거나 커넥터 자리를 마련했다는 것만으로 버스 전압과 상승시간이 맞는 것은 아닙니다. 조립 뒤에는 전원을 넣기 전에 저항의 실장·연결 상태를 확인하고, 전원을 넣은 뒤 실제 수신 핀의 HIGH·LOW 전압과 상승시간을 측정합니다.

같은 선에 같은 전압으로 연결된 4.7 kΩ 두 개는 2.35 kΩ, 세 개는 약 1.57 kΩ입니다. 같은 값 R인 저항 n개의 병렬 합성값은 R/n입니다. 서로 다른 값이면 1/R합=1/R1+1/R2+…로 구합니다. 전압이 다른 풀업은 이 계산만으로 적합하다고 판단하지 않습니다. 버스 버퍼(buffer)·스위치(switch)가 있으면 실제로 연결되는 구간도 나누어 조사합니다.

SDA와 SCL마다 3.3 V↔5 V 변환 회로를 둡니다

3.3 V 제어기에 5 V I2C 장치를 연결할 때는 제어기의 SDA·SCL 입력이 5 V를 허용하는지 먼저 확인합니다. 허용하지 않는다면 LOW 신호는 양쪽으로 전달하되, HIGH는 각 장치의 전원 전압에 맞춰야 합니다. 두 전압 구간이 접지(GND)를 공유하고 장치가 선을 LOW로 당기거나 놓는 오픈드레인(open-drain) 방식이라면, 데이터선 SDA와 클록선 SCL 각각에 N채널 MOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor) 한 개를 둔 양방향 레벨 변환기를 사용할 수 있습니다. MOSFET은 게이트 전압에 따라 소스와 드레인 사이의 전류 통로가 열리는 부품입니다.

그림의 2N7002 MOSFET은 소스(source)를 3.3 V 쪽 선에, 드레인(drain)을 5 V 쪽 선에, 게이트(gate)를 3.3 V 전원에 연결합니다. 한 선의 양쪽에는 각각 자기 전원으로 올라가는 풀업을 둡니다. SDA에 한 개를 연결했다면 SCL에도 같은 회로를 따로 마련합니다. 아래 그림은 연결 원리도이며 부품의 실제 핀 위치나 측정 파형은 아닙니다.

3.3 V와 5 V의 SDA·SCL 선마다 MOSFET 한 개와 양쪽 풀업을 두고, 게이트를 3.3 V에 연결한 원리도입니다.
3.3 V와 5 V의 SDA·SCL 선마다 MOSFET 한 개와 양쪽 풀업을 두고, 게이트를 3.3 V에 연결한 원리도입니다. · 클릭하면 확대됩니다.

방향 선택 핀이 없어도 되는 이유는 한 선의 세 상태를 살펴보면 알 수 있습니다. 게이트-소스 전압 VGS는 게이트 전압에서 소스 전압을 뺀 값입니다. 몸체 다이오드(body diode)는 MOSFET 내부의 다이오드로, 여기서는 소스에서 드레인 쪽으로 전류가 흐를 수 있는 방향입니다.

  1. 양쪽 장치가 선을 놓으면 소스와 게이트가 약 3.3 V가 되어 VGS가 거의 0 V입니다. MOSFET은 꺼지고 몸체 다이오드도 역방향이므로 양쪽 선은 각자의 풀업으로 3.3 V와 5 V의 HIGH가 됩니다. 이때 5 V 풀업이 3.3 V 입력을 직접 끌어올리지 않습니다.
  2. 3.3 V 쪽 장치가 LOW로 당기면 소스 전압이 내려가 VGS가 커집니다. MOSFET이 켜지면 5 V 쪽 풀업의 전류도 이 통로를 거쳐 LOW를 만드는 장치로 흐르므로 양쪽 선이 LOW가 됩니다.
  3. 5 V 쪽 장치가 LOW로 당기면 먼저 드레인 전압이 내려갑니다. 몸체 다이오드가 잠깐 전류를 흘려 3.3 V 쪽 소스 전압을 낮추면 VGS가 커지고 MOSFET이 켜집니다. 그 뒤 양쪽 선이 LOW가 됩니다. 최종 LOW 전압을 다이오드의 순방향 전압만으로 정하는 회로는 아닙니다.

이 설명은 높은 쪽 전원이 정상 동작 중 낮은 쪽 전원보다 낮지 않고, 양쪽 장치가 오픈드레인으로 동작할 때에 해당합니다. MOSFET의 임계 전압은 도통이 시작되는 조건이지, 필요한 전류에서 LOW 전압이 충분히 낮다는 보증은 아닙니다. 실제 구매한 부품의 핀 배열과 전류 특성, 각 수신 핀의 LOW·HIGH 입력 기준을 대조합니다.

서로 다른 전원에 매인 두 풀업을 하나의 병렬 저항으로 합산하지 않습니다. 상승 시간은 SDA·SCL의 각 전압 구간에서 확인합니다. 반면 어느 쪽 장치가 LOW를 만들든 켜진 MOSFET을 거쳐 두 구간의 풀업 전류를 함께 받아야 할 수 있습니다. 예를 들어 다른 풀업이 없고 양쪽에 10 kΩ씩 달렸으며 LOW를 0 V로 가정하면, 흡수해야 할 전류는 약 3.3 V/10 kΩ + 5 V/10 kΩ = 0.83 mA입니다. 실제 LOW 전압과 MOSFET의 전압 강하, 추가 풀업을 반영해 다시 계산해야 합니다. 10 kΩ을 연결했다고 해서 속도까지 검증된 것은 아니므로 실제 배선의 SDA·SCL 양쪽에서 HIGH·LOW 전압과 상승 시간을 측정합니다.

저항을 낮추면 상승 시간은 줄일 수 있지만 LOW를 만드는 장치가 더 큰 전류를 처리해야 합니다. 저항을 높이면 그 부담은 줄어도 상승이 늦어질 수 있습니다. 모듈 추가는 저항과 용량을 모두 바꾸므로 불필요한 풀업을 조정한 뒤 가장 불리한 위치의 LOW 전압과 상승 시간을 확인합니다. 모든 저항을 제거하는 것이 목적은 아닙니다. 사용 전압·통신 속도·총 용량·가장 약한 장치의 싱크 조건을 만족하도록 필요한 저항을 남깁니다.

합성 저항이 들어갈 수 있는 범위를 계산합니다

LOW 전류 제한으로 저항의 하한을 먼저 구합니다. 허용 LOW 전압을 VOLmax, 그 조건의 싱크 전류를 IOL이라 하면 Rmin≈(VDD−VOLmax)/IOL입니다. 반대로 버스 용량을 정해진 시간 안에 올리려면 저항이 너무 커서는 안 됩니다. I2C의 30~70% 상승 시간 기준에서는 tr≈0.8473RC이므로 Rmax≈tr허용/(0.8473C)로 계산할 수 있습니다. 다른 입력의 VIH 도달 시간을 이 기준과 같은 것으로 취급하지 않습니다.

설명용으로 VDD=3.3 V, VOLmax=0.4 V, IOL=3 mA를 가정하면 Rmin≈967 Ω입니다. C=100 pF에서 tr을 300 ns 이내로 요구한다면 Rmax≈3.54 kΩ입니다. 이 조건에서 10 kΩ은 요구되는 상승시간을 만족하지 못합니다. 이 계산의 입력값은 실제 연결 장치와 사용 모드의 규격으로 바꿔야 합니다.

합산 누설 전류가 HIGH 전압을 얼마나 낮추는지와 수신기의 VIH·VIL도 확인합니다. 가장 낮은 전원, 가장 큰 연결 부하에서 실제 수신 핀의 HIGH·LOW·상승 시간을 잽니다. 저항을 낮춰도 해결되지 않으면 배선 용량, 레벨 변환과 입력 임계값을 조사하고 출력이 오픈드레인인지 HIGH도 능동 구동하는지부터 구분합니다.

같은 저항도 연결 용량이 늘면 다시 계산합니다

앞의 조건에서 버스 용량만 150 pF로 늘었다면 300 ns를 만족하는 상한은 약 2.36 kΩ으로 낮아집니다. 4.7 kΩ의 상승시간은 약 597 ns, 2.2 kΩ은 약 280 ns입니다. 따라서 이 가정에서는 4.7 kΩ이 표준 모드의 1,000 ns 이내에는 들어가도 고속 모드의 300 ns에는 들어가지 못합니다. 2.2 kΩ은 계산상 두 조건을 만족하지만, 부품 공차와 추가 용량을 반영하면 여유가 줄어들 수 있습니다.

반대로 100 kΩ이면 상승시간이 약 12.7 µs로 너무 느립니다. 100 Ω이면 버스 전압을 0.4 V로 유지하는 데 풀업 저항을 통해 (3.3−0.4) V/100 Ω=29 mA가 흘러야 합니다. 이는 앞에서 가정한 3 mA 싱크 조건을 크게 넘는 요구 전류이지, 실제 핀에서 측정한 전류는 아닙니다.

LOW를 만드는 출력단의 실제 특성을 저항 하나로 단순화한 등가 저항(equivalent resistance)을 60 Ω으로 가정하고, 다른 전류 경로는 없다고 해 보겠습니다. LOW가 안정된 뒤 전류는 3.3 V/(100 Ω+60 Ω)≈20.6 mA이고 버스의 LOW 전압은 20.6 mA×60 Ω≈1.24 V입니다. 29 mA보다 전류가 작은 까닭은 버스가 0.4 V까지 내려가지 못해 풀업 저항 양단의 전압도 줄었기 때문입니다. 60 Ω은 특정 부품의 보장값이나 이 회로의 측정값이 아닙니다.

수신기도 3.3 V로 동작하고 데이터시트가 VIL 최대값을 0.3×VDD로 정했다면 LOW로 인정되는 상한은 0.3×3.3 V=0.99 V입니다. 이 단순 모델의 1.24 V는 그보다 높아 LOW로 읽힌다고 보장할 수 없습니다. 실제 설계에서는 각 장치의 VOL–IOL 특성과 수신기의 VIL을 데이터시트에서 확인하고, 가장 불리한 수신 핀에서 LOW 전압을 측정합니다. 전류가 3 mA를 넘는다는 계산만으로 과열이나 손상을 단정하지 않습니다. ‘느리면 저항을 줄인다’에서 끝내지 말고, 합성 저항이 전류로 정한 하한과 상승시간으로 정한 상한 사이에 있는지 확인해야 합니다.

통신 속도를 높인 뒤에는 수신 핀에서 상승시간을 확인합니다

상승시간 한계는 통신 모드에 따라 다릅니다. 여기서 상승시간은 전압이 풀업 전압의 30%에서 70%로 올라가는 데 걸리는 시간입니다. 표준 모드(Standard-mode, 최대 100 kbit/s)의 상한은 1,000 ns, 고속 모드(Fast-mode, 최대 400 kbit/s)의 상한은 300 ns입니다. 같은 100 pF에 10 kΩ을 쓰면 약 847 ns이므로 두 모드에서 판단이 달라집니다. 상승시간이 맞아도 LOW·HIGH 유지 시간과 데이터의 설정·유지 시간까지 만족해야 합니다.

기기를 추가하거나 케이블을 늘리면 총 정전용량이 커질 수 있습니다. 책상 위에서 되던 통신이 최종 배선이나 높은 온도에서 실패하면, 사용 조건을 유지한 채 가장 먼 수신 핀의 SDA·SCL 파형을 확인합니다. 온도가 직접 큰 정전용량을 만든다고 단정하지 말고 출력의 LOW 전압, 누설과 전원 변화도 비교합니다. 프로브 자체의 용량도 버스에 더해집니다.

장치가 보이지 않을 때는 먼저 전원·주소 설정과 신호의 기준 연결을 확인합니다. 절연되지 않은 동일 버스에서는 장치 간 공통 접지가 실제로 이어지는지 살피고, 최종 케이블 길이와 접속부가 더한 정전용량도 반영합니다. 주소 스캔은 후보 주소로 전송해 ACK 응답을 살피는 확인 방법이지만, 대상이 허용하는 탐색 명령과 동작 상태에서만 사용합니다. 탐색 전송도 장치 상태를 바꿀 수 있으므로 운영 중인 버스에 무조건 실행하지 않습니다. 응답이 없다는 사실만으로 풀업 불량으로 확정하거나, ACK가 있다는 사실을 전체 기능시험 통과로 기록하지 않습니다.

ACK(acknowledge)는 수신 측이 아홉 번째 클록에서 SDA를 LOW로 만들어 보내는 응답이고, HIGH로 남는 것은 NACK(not acknowledge)입니다. NACK가 보이면 상승시간만 원인으로 지목하지 않습니다. 주소가 맞는지, 상대가 켜져 있는지, 명령과 데이터 길이가 맞는지 확인하고 해당 전송의 실제 파형과 함께 판단합니다.

로직 분석기(logic analyzer)로 한 번의 쓰기 전송을 볼 때는 시작 조건(START condition) → 7비트 주소와 쓰기 비트 → 아홉 번째 클록의 주소 ACK → 8비트 자료 → 아홉 번째 클록의 자료 ACK → 정지 조건(STOP condition) 순서로 구간을 나눕니다. 시작 조건은 SCL이 HIGH일 때 SDA가 HIGH에서 LOW로, 정지 조건은 SCL이 HIGH일 때 SDA가 LOW에서 HIGH로 바뀌는 상태입니다. 주소 뒤에서 NACK가 나오면 주소·대상 전원·선의 LOW 전압부터, 자료 뒤에서 나오면 그 대상이 명령이나 자료를 받을 준비가 됐는지부터 확인하되 실제 파형으로 구별하세요. 이 순서는 단순한 쓰기 예시이며, 읽기의 마지막 자료 바이트 뒤에 제어기가 보내는 NACK는 수신 종료를 알리는 정상 동작일 수 있습니다. 반복 시작 조건이 있는 전송에도 정지 조건이 중간에 반드시 나온다고 가정하지 않습니다.

여러 기기가 두 선을 공유하려면 각 기기의 주소도 확인해야 합니다. 예를 들어 같은 7비트 주소 0x3C를 고정으로 쓰는 기기 두 개를 그대로 연결하면 주소만으로 하나를 선택할 수 없습니다. 주소 변경 핀이나 버스 분리 수단이 필요한지 검토합니다. 오픈드레인은 전기적으로 선을 공유하게 해 주지만 기기를 무제한으로 연결하거나 충돌을 없애 주지는 않습니다. 주소, 총 정전용량과 여러 제어기 사이의 중재 조건을 별도로 확인합니다.

주소 길이도 부품마다 확인합니다. 일부 대상 장치는 7비트 대신 10비트 주소를 사용합니다. 제어기와 대상 장치가 모두 해당 주소 방식을 지원하는지 각 부품의 자료에서 확인하세요. 주소 길이를 늘려도 같은 고정 주소를 쓰는 장치끼리의 충돌이나 버스 용량·상승 시간 문제는 저절로 해결되지 않습니다.

풀업까지 길게 갈라진 가지와 하강 에지도 확인합니다

풀업 저항값이 맞아도 SDA·SCL 본선에서 저항까지 길게 갈라지는 가지가 있으면 배선 용량과 전파 지연을 함께 보아야 합니다. LOW는 장치가 능동적으로 당기므로 상승과 하강이 같은 빠르기라고 가정하지 않습니다. 낮은 통신 빈도만 보고 빠른 하강 에지의 링잉이나 분기 영향을 배제하지 마세요. 가지 길이는 가능한 한 줄이는 안을 검토하되, 특정 길이를 모든 버스의 한계로 정하지 않습니다.

최종 배선과 같은 부하에서 송신점·먼 수신점의 SDA와 SCL을 비교합니다. 상승시간뿐 아니라 하강시간, 임계값 부근의 반복 교차, LOW 전압과 설정·유지 시간을 확인합니다. NXP UM10204 Rev. 7의 6.1절과 7.2.1절은 상승·하강 및 긴 버스의 전파 시간을 구분합니다. 문제가 보였다는 이유만으로 풀업을 계속 낮추거나 종단 저항을 임의로 추가하지 말고, 싱크 전류와 부품별 요구부터 다시 대조합니다.

작업 순서를 다시 확인합니다

I2C 모듈을 추가했다면 이미 달린 풀업 저항부터 합산합니다 — 설명용 도해
I2C 모듈을 추가했다면 이미 달린 풀업 저항부터 합산합니다 — 설명용 도해 · 클릭하면 확대됩니다.

여러 제어기의 SCL 해제를 구별합니다

Standard-mode·Fast-mode·Fast-mode Plus의 다중 제어기 I²C 버스에서는 어느 제어기라도 오픈드레인 출력으로 SCL을 LOW에 붙잡고 있으면 공통 SCL은 LOW로 남습니다. 관련 제어기 모두가 LOW 구간을 마치고 해제해야 풀업으로 HIGH가 되는 것이 클록 동기화(clock synchronization)이며, 대상 장치가 준비를 기다리게 하는 클록 스트레칭과는 주체가 다릅니다. 한 제어기 핀의 해제 시점만으로 버스의 HIGH 시점을 판단하지 않습니다. 이 설명을 Hs-mode 전송이나 단방향 UFm의 구동 조건에 그대로 적용하지 않습니다. NXP UM10204 Rev. 7, 3.1.7절.