기술 가이드

I²C 풀업 저항 계산: 상승 시간·버스 용량·LOW 전류 함께 확인하기

I²C Standard/Fast-mode에서 풀업 저항의 허용 범위를 공식 규격과 C 계산 예제로 확인합니다.

목차

센서가 I²C에서 간헐적으로 NACK을 내거나 100 kHz에서는 되는데 400 kHz에서 실패한다면 SDA·SCL의 상승 파형부터 확인할 만합니다. I²C 출력은 LOW를 능동적으로 만들고 HIGH는 풀업 저항이 버스 용량을 충전해 만듭니다. 저항을 작게 하면 상승은 빨라지지만 LOW에서 장치가 더 많은 전류를 흘려야 합니다. NXP I²C 규격 UM10204의 상승 시간 제한과 TI 풀업 계산 보고서 SLVA689의 식을 함께 적용해 범위를 구해 보겠습니다.

저항의 상한과 하한

I²C 상승 시간 tᵣ은 SDA 또는 SCL이 공급 전압의 30%에서 70%까지 올라가는 데 걸리는 시간입니다. 단순 RC 근사에서 tᵣ ≈ 0.8473 × Rₚ × Cᵦ입니다. 따라서 Rₚ(max) = tᵣ(max) / (0.8473 × Cᵦ)입니다. NXP의 Standard-mode 최대 상승 시간은 1000 ns, Fast-mode는 300 ns입니다. 실제 핀·배선·커넥터·센서의 입력 용량을 합친 Cᵦ를 사용합니다. 단일 센서의 데이터시트 입력 용량만 넣으면 저항 상한을 과하게 높일 수 있습니다.

LOW를 보장하는 하한은 Rₚ(min) = (VDD − VOL(max)) / IOL입니다. 여기서 IOL은 연결된 장치가 해당 VOL을 유지하며 흘릴 수 있는 보장 전류로 잡아야 합니다. 다른 전압 도메인이나 장치에는 같은 숫자를 그대로 적용하지 마세요. 저항이 하한보다 작으면 HIGH 상승은 빨라도 LOW 전압 사양을 위반할 수 있습니다. SDA와 SCL 각각에 실제로 병렬 연결된 저항이 있으면 합성 저항으로 계산합니다.

3.3 V·200 pF 예제

가상의 3.3 V 버스에서 가장 약한 장치의 보장 조건을 VOL(max)=0.4 V, IOL=3 mA, 측정·추정한 버스 용량을 200 pF로 두겠습니다. 이것은 설계 예시값입니다. 실제 제품의 핀 사양과 보드 파형을 확인해야 합니다.

항목 계산값
LOW 전류로 정한 최소 저항 약 967 Ω
Standard-mode 상승 시간으로 정한 최대 저항 약 5.90 kΩ
Fast-mode 상승 시간으로 정한 최대 저항 약 1.77 kΩ

이 조건에서 4.7 kΩ은 약 796 ns이므로 Standard-mode 상승 시간에는 맞지만 Fast-mode에는 느립니다. 2.2 kΩ도 약 373 ns로 Fast-mode 제한을 넘습니다. 1.5 kΩ의 약 254 ns는 Fast-mode 제한 이내이고, LOW 전류는 (3.3−0.4)/1500 ≈ 1.93 mA로 예시의 3 mA 이내입니다. 이는 RC·전류 조건만 통과한 것이며 다른 타이밍·노이즈 조건과 실측 결과까지 보장하지 않습니다.

PC에서 계산 재현하기

아래 표준 C 프로그램을 i2c_pullup.c로 저장해 gcc -std=c11 -Wall -Wextra -Werror i2c_pullup.c -o i2c_pullup으로 빌드하세요. Windows에서는 ./i2c_pullup.exe, Linux에서는 ./i2c_pullup으로 실행할 수 있습니다. 특정 MCU나 회로를 구동하지 않는 계산 검사입니다.

#include <assert.h>
#include <stdio.h>

static double rise_ns(double ohms, double pf) {
return 0.8473 * ohms * pf * 0.001;
}

int main(void) {
const double vdd = 3.3, vol_max = 0.4, iol_a = 0.003;
const double cap_pf = 200.0;
const double r_min = (vdd - vol_max) / iol_a;
const double r_max_fast = 300.0 / (0.8473 * cap_pf * 0.001);
const double r_max_standard = 1000.0 / (0.8473 * cap_pf * 0.001);
const double r_fast = 1500.0;

assert(r_min > 966.0 && r_min < 968.0);
assert(r_max_fast > 1770.0 && r_max_fast < 1771.0);
assert(r_max_standard > 5900.0 && r_max_standard < 5902.0);
assert(r_fast >= r_min && r_fast <= r_max_fast);
assert(rise_ns(r_fast, cap_pf) < 300.0);
assert(rise_ns(2200.0, cap_pf) > 300.0);
assert(rise_ns(4700.0, cap_pf) < 1000.0);

printf("Rmin %.0f ohm; Rmax fast %.0f ohm; standard %.0f ohm\n",
r_min, r_max_fast, r_max_standard);
printf("rise: 1.5k %.0f ns; 2.2k %.0f ns; 4.7k %.0f ns\n",
rise_ns(1500.0, cap_pf), rise_ns(2200.0, cap_pf),
rise_ns(4700.0, cap_pf));
puts("PASS: 1.5k fast, 2.2k not fast, 4.7k standard");
return 0;
}

예상 출력:

Rmin 967 ohm; Rmax fast 1770 ohm; standard 5901 ohm
rise: 1.5k 254 ns; 2.2k 373 ns; 4.7k 796 ns
PASS: 1.5k fast, 2.2k not fast, 4.7k standard

PASS는 입력한 가정 아래 저항 상·하한과 상승 시간 계산이 일치한다는 뜻입니다. 코드의 숫자를 보드의 실측 용량, 전압 및 가장 약한 장치의 데이터시트 값으로 바꿔 다시 계산하세요.

오실로스코프로 최종 확인

  1. SDA와 SCL을 각각 측정하고, 30%·70% 지점 사이의 시간을 재세요. 긴 케이블이나 센서 모듈을 연결한 최종 구성에서 확인합니다.
  2. LOW 전압이 연결된 모든 장치의 허용치 안에 있는지 확인하세요. 모듈에 내장된 풀업과 개발 보드의 풀업이 병렬이 되면 합성 저항이 너무 작아질 수 있습니다.
  3. 센서의 타이밍 요구사항과 MCU I²C 설정, 클록 스트레칭, 레벨 시프터의 제한을 별도로 확인하세요. 100 kHz에서 400 kHz로 바꿀 때는 저항만으로 성공을 판단할 수 없습니다.
  4. 실측 상승 시간이 경계값에 붙으면 용량 추정·측정 오차와 온도·부품 편차를 감안해 여유를 두세요. 필요하면 배선 축소, 버스 분리 또는 적절한 버퍼를 검토합니다.

공식 참고: NXP UM10204 I²C 규격, TI SLVA689 풀업 저항 계산.

관련 글

댓글

첫 댓글을 남겨 보세요.

관리자 확인 후 게시됩니다.

처리 중입니다...

잠시만 기다려주세요.