I2C 풀업 저항값별 SCL 파형: 스코프로 상승 시간 재서 원인 가르기
3.3V·400kHz I2C 버스에서 풀업 저항과 버스 용량을 바꿔 시뮬레이션하고, 허용 범위를 직접 계산해 스코프 측정값과 비교하는 기준을 만들었습니다.
보드의 센서나 EEPROM이 I2C 스캔에서 잡혔다 안 잡혔다 합니다. 칩을 바꿔도 그대로이고, 오실로스코프로 SCL을 찍어 보면 네모여야 할 파형이 상어 지느러미처럼 비스듬히 올라갑니다. 이럴 때 먼저 봐야 할 것이 풀업 저항과 버스 용량이 만드는 상승 시간입니다.
이 글에는 직접 만든 자료 세 가지를 넣었습니다. 첫째는 3.3V, 400kHz 버스에서 풀업 저항값과 버스 용량을 바꿔 가며 돌린 ngspice 시뮬레이션이고, 둘째는 TI 앱노트 SLVA689의 공식으로 계산한 풀업 저항 허용 범위입니다. 셋째는 이번에 새로 넣은 그래프로, 1.8V 장치와 3.3V 장치를 MOSFET 레벨 변환 회로로 이은 버스에서 풀업 값을 바꾸거나 한쪽 풀업이 빠졌을 때 양쪽 파형이 어떻게 달라지는지 ngspice로 시뮬레이션한 결과입니다. 규격값은 NXP의 I2C 규격 문서(UM10204) 기준이고, 회로 값은 계산을 위해 가정한 값이며 가정은 각 그래프 설명과 본문에 적었습니다. 이 자료를 기준값으로 삼아, 실제 보드에서 스코프로 상승 시간을 재고 무엇이 문제인지 가려내는 순서를 정리합니다.

상승 시간을 왜 재야 하나
I2C 선은 오픈 드레인입니다. 칩은 선을 0V 쪽으로 끌어내리기만 하고, HIGH로 올리는 일은 풀업 저항이 합니다. TI SLVA689에 따르면 풀업 저항이 너무 크면 선이 논리 HIGH에 닿기 전에 다시 LOW로 끌려 내려갈 수 있고, 잘못된 풀업 값은 신호 손실로 이어질 수 있습니다. 내려갈 때는 트랜지스터가 빠르게 방전시키지만 올라갈 때는 저항 하나로 버스 용량 전체를 충전해야 해서, 풀업과 버스 용량의 영향은 하강보다 상승 쪽 파형에 크게 나타납니다.
앱노트는 상승 시간을 0.3×VCC에서 0.7×VCC까지 걸리는 시간으로 보고, RC 충전식에서 tr = 0.8473 × Rp × Cb를 끌어냅니다. 직접 계산하면 3.3V 버스에서 이 두 기준점은 0.99V와 2.31V입니다. 앱노트가 옮겨 놓은 I2C 규격(NXP UM10204)의 표에서 SDA와 SCL의 상승 시간(tr) 상한은 Standard Mode(100kHz)가 1000ns, Fast Mode(400kHz)가 300ns입니다. 보통 이 정도 나온다는 값이 아니라 넘으면 안 되는 한계값입니다. 같은 표에서 버스 선 하나의 용량 부하(Cb) 상한은 Fast Mode 기준 400pF입니다.
시뮬레이션 조건과 넷리스트
오픈 드레인 출력을 온저항 20Ω짜리 스위치로 놓고, 2.5µs 주기(400kHz)로 켜고 끕니다. 스위치가 꺼진 1.25µs 동안 풀업 저항이 버스 용량을 충전합니다. 첫 번째 시뮬레이션은 버스 용량을 200pF로 고정하고 풀업을 1kΩ, 2.2kΩ, 4.7kΩ, 10kΩ로 바꿨습니다. 두 번째는 풀업을 2.2kΩ로 고정하고 버스 용량을 50pF, 200pF, 400pF로 바꿨습니다. 상승 시간은 .meas로 두 번째 상승 구간의 0.99V→2.31V 시간을 쟀습니다.
* I2C SCL 400kHz, VCC 3.3V, Cb 200pF, pull-up 1k/2.2k/4.7k/10k
VCC vcc 0 DC 3.3
VDRV g 0 PULSE(0 5 0 5n 5n 1.25u 2.5u)
.model SW SW(Ron=20 Roff=100Meg Vt=2.5 Vh=0.1)
R1 vcc a 1k
C1 a 0 200p
S1 a 0 g 0 SW
R2 vcc b 2.2k
C2 b 0 200p
S2 b 0 g 0 SW
R3 vcc c 4.7k
C3 c 0 200p
S3 c 0 g 0 SW
R4 vcc d 10k
C4 d 0 200p
S4 d 0 g 0 SW
.tran 2n 10u
.meas tran tr_1k TRIG v(a) VAL=0.99 RISE=2 TARG v(a) VAL=2.31 RISE=2
.meas tran tr_2k2 TRIG v(b) VAL=0.99 RISE=2 TARG v(b) VAL=2.31 RISE=2
.meas tran tr_4k7 TRIG v(c) VAL=0.99 RISE=2 TARG v(c) VAL=2.31 RISE=2
.meas tran vmax_4k7 MAX v(c) FROM=7.5u TO=10u
.meas tran vmax_10k MAX v(d) FROM=7.5u TO=10u
두 번째 시뮬레이션 넷리스트는 부품값만 다릅니다.
* I2C SCL 400kHz, VCC 3.3V, pull-up 2.2k, Cb 50p/200p/400p
VCC vcc 0 DC 3.3
VDRV g 0 PULSE(0 5 0 5n 5n 1.25u 2.5u)
.model SW SW(Ron=20 Roff=100Meg Vt=2.5 Vh=0.1)
R1 vcc a 2.2k
C1 a 0 50p
S1 a 0 g 0 SW
R2 vcc b 2.2k
C2 b 0 200p
S2 b 0 g 0 SW
R3 vcc c 2.2k
C3 c 0 400p
S3 c 0 g 0 SW
.tran 2n 10u
.meas tran tr_50p TRIG v(a) VAL=0.99 RISE=2 TARG v(a) VAL=2.31 RISE=2
.meas tran tr_200p TRIG v(b) VAL=0.99 RISE=2 TARG v(b) VAL=2.31 RISE=2
.meas tran tr_400p TRIG v(c) VAL=0.99 RISE=2 TARG v(c) VAL=2.31 RISE=2
.meas tran vmin_400p MIN v(c) FROM=7.5u TO=10u
이상적인 부품 모델이라 실제 측정값과 다를 수 있습니다. 실제 칩의 출력단, 입력 핀의 히스테리시스, 배선 인덕턴스와 반사는 넣지 않았습니다.
풀업 저항값별 결과
맨 위 그래프가 첫 번째 시뮬레이션 결과입니다. 수치로 옮기면 아래와 같습니다. 이론 상승 시간은 0.8473RC로 직접 계산한 값입니다.
| 풀업 | 시뮬레이션 상승 시간 | 직접 계산 0.8473RC | HIGH 구간 최고 전압 | 400kHz 300ns 기준 |
|---|---|---|---|---|
| 1kΩ | 169ns | 169ns | 3.3V까지 도달 | 통과 |
| 2.2kΩ | 373ns | 373ns | 3.11V | 초과 |
| 4.7kΩ | 797ns | 796ns | 2.43V | 초과 |
| 10kΩ | 2.31V 미도달 | 1695ns | 1.53V | HIGH 인식 불가 |
시뮬레이션 결과 10kΩ에서는 HIGH 구간 최고 전압이 1.53V에 그쳐, 직접 계산한 VIH 2.31V에 닿지 못합니다. 이 상태라면 받는 쪽이 SCL이 올라간 것을 인식하지 못할 수 있습니다. 4.7kΩ은 시뮬레이션 결과 상승 시간이 797ns라서 표준 모드 1000ns 기준은 넘지 않지만 고속 모드 300ns 기준은 크게 넘습니다. 버스 용량이 200pF라면 같은 4.7kΩ이라도 100kHz에서는 상승 시간 상한을 지키고 400kHz에서는 지키지 못한다는 뜻입니다.
반대로 1kΩ은 시뮬레이션 결과 LOW 전압이 0.065V로 다른 값보다 높게 나옵니다. 시뮬레이션 결과에 나온 이 차이는 넷리스트 스위치 온저항 20Ω과 풀업 저항이 분압을 이루기 때문입니다. 실제 칩의 출력단 저항은 이 가정값과 다르고, UM10204(앱노트 표)의 VOL 상한 0.4V는 VDD가 2V보다 높을 때 3mA를 끌어내리는 조건의 값이라, 풀업을 너무 작게 하면 LOW가 덜 내려갑니다. 직접 계산하면 3.3V 버스에서 Rp(min) = (3.3 − 0.4) / 3mA = 967Ω이고, 1kΩ은 이 경계에 바짝 붙어 있습니다.
버스 용량이 늘면 같은 저항도 느려진다

시뮬레이션 결과 풀업 2.2kΩ에서 상승 시간은 50pF일 때 93ns, 200pF일 때 373ns, 400pF일 때 746ns입니다. 용량이 네 배가 되면 상승 시간도 거의 네 배가 됩니다. 시뮬레이션 결과 400pF에서는 HIGH 구간 끝 전압이 2.50V로, VIH 2.31V를 겨우 넘깁니다.
수리할 때 이 그래프가 쓸모 있는 이유는 버스 용량이 보드 설계 때와 달라질 수 있기 때문입니다. 케이블로 모듈을 이어 붙였거나, 같은 버스에 장치를 더 달았거나, 원래 없던 프로브와 선을 물렸을 때입니다. 프로브가 더하는 용량은 오실로스코프 사용법 글에서 x1·x10 프로브를 I2C 선에 댄 시뮬레이션으로 따로 다뤘습니다. 풀업은 그대로인데 파형이 무너졌다면 용량 쪽을 의심합니다.
허용 범위를 계산으로 미리 정해 두기

Rp(max) = tr / (0.8473 × Cb)에 규격 상승 시간을 넣으면 버스 용량별 풀업 상한이 나옵니다. 직접 계산한 값을 표로 정리했습니다.
| 버스 용량 Cb | 표준 모드 Rp(max) | 고속 모드 Rp(max) |
|---|---|---|
| 50pF | 23.6kΩ | 7.08kΩ |
| 100pF | 11.8kΩ | 3.54kΩ |
| 200pF | 5.9kΩ | 1.77kΩ |
| 400pF | 2.95kΩ | 0.89kΩ |
직접 계산하면 고속 모드에서 400pF일 때 Rp(max)가 0.89kΩ으로, 3.3V의 Rp(min) 967Ω보다 작아집니다. 3mA·0.4V 조건을 지키면서 이 상승 시간 상한을 맞출 수 있는 저항값이 없습니다. 그래프에서 빨간 영역이 오른쪽 끝에서 닫히는 부분이 그것입니다. 5V 버스라면 직접 계산한 Rp(min)이 1533Ω으로 더 올라갑니다.
앱노트는 범위 안에서 작은 저항은 빠르고, 큰 저항은 전력을 덜 쓴다고 설명합니다. 직접 계산하면 선이 LOW일 때 풀업 하나에 흐르는 전류는 1kΩ에서 3.3mA, 2.2kΩ에서 1.5mA, 4.7kΩ에서 0.7mA, 10kΩ에서 0.33mA입니다.
직접 시뮬레이션: 1.8V↔3.3V 레벨 변환이 낀 버스는 양쪽을 따로 잰다
보드에 따라 1.8V로 동작하는 칩과 3.3V로 동작하는 칩이 한 I2C 버스에 함께 붙어 있는 경우가 있고, 이때 그 사이에 MOSFET 하나로 된 레벨 변환 회로가 들어갑니다. MOSFET의 게이트를 1.8V에, 소스를 1.8V 쪽 선에, 드레인을 3.3V 쪽 선에 잇고 양쪽에 각자 자기 전압으로 풀업을 다는 방식입니다. 이 구조에서는 스코프를 어느 쪽에 대느냐에 따라 같은 신호가 다르게 보이고, 위에서 만든 허용 범위 표를 그대로 쓰면 안 되는 부분도 생깁니다. 그래서 이 회로에서 풀업 값을 바꾸거나 한쪽 풀업을 빼면 양쪽 파형이 어떻게 달라지는지 ngspice로 직접 시뮬레이션했습니다.

가정은 다음과 같습니다. MOSFET은 문턱 전압 1.0V인 단순 모델(LEVEL 1, KP 0.05A/V²)에 소스에서 드레인 방향의 몸체 다이오드를 따로 붙였습니다. 소신호 MOSFET을 흉내 낸 값일 뿐 특정 제품의 모델이 아닙니다. 버스 용량은 1.8V 쪽 50pF, 3.3V 쪽 200pF로 두고 양쪽 풀업은 같은 값(1kΩ, 2.2kΩ, 4.7kΩ, 10kΩ)으로 바꿨습니다. 선을 끌어내리는 장치는 저항 133.3Ω짜리 스위치로 넣었습니다. NXP UM10204가 VDD 2V 초과에서 정한 출력 조건(3mA를 흘릴 때 0.4V 이하)을 저항으로 바꾼 값(직접 계산)이고, 1.8V 쪽 장치에도 같은 값을 가정했습니다. 파형이 끝까지 보이도록 LOW 5µs, HIGH 5µs(100kHz)로 구동했고, 상승 시간은 각 쪽 전압의 0.3·VDD에서 0.7·VDD까지로 쟀습니다. 직접 계산하면 1.8V 쪽은 0.54V→1.26V, 3.3V 쪽은 0.99V→2.31V입니다.
| 풀업(양쪽 같은 값) | 3.3V 쪽 상승 시간 | 0.8473·R·200pF (직접 계산) | 1.8V 쪽 상승 시간 | 0.8473·R·50pF (직접 계산) | 1.8V 쪽이 LOW일 때 3.3V 쪽 | 3.3V 쪽이 LOW일 때 1.8V 쪽 |
|---|---|---|---|---|---|---|
| 1kΩ | 169ns | 169ns | 39ns | 42ns | 0.91V | 0.63V |
| 2.2kΩ | 373ns | 373ns | 103ns | 93ns | 0.33V | 0.30V |
| 4.7kΩ | 796ns | 796ns | 221ns | 199ns | 0.16V | 0.15V |
| 10kΩ | 1695ns | 1695ns | 473ns | 424ns | 0.07V | 0.07V |
첫째, 3.3V 쪽 상승 시간은 레벨 변환이 없는 버스와 같았습니다. 직접 시뮬레이션 결과 풀업 1kΩ, 2.2kΩ, 4.7kΩ, 10kΩ에서 각각 169ns, 373ns, 796ns, 1695ns로, 3.3V 쪽 풀업과 3.3V 쪽 용량 200pF만으로 계산한 0.8473RC와 맞았고, 앞의 첫 번째 시뮬레이션(200pF)에서 나온 1kΩ·2.2kΩ·4.7kΩ 결과와도 1ns 안쪽으로 같았습니다. 1.8V 쪽 선이 1.8V에서 문턱 전압을 뺀 0.8V 근처(직접 계산)까지 올라가면 MOSFET이 꺼지고, 그 뒤로 3.3V 쪽은 자기 풀업 하나로 자기 용량을 충전하기 때문입니다. 이 가정에서는 MOSFET이 꺼지는 전압이 측정 시작점 0.99V보다 낮아서 그렇게 됩니다. 즉 레벨 변환이 낀 버스에서 상승 시간으로 버스 용량을 역산할 때는 재는 쪽의 풀업 값을 써야 합니다.
둘째, 1.8V 쪽은 엣지 앞부분에서 3.3V 쪽 용량까지 함께 충전합니다. 풀업 4.7kΩ에서 1.8V 쪽 상승 시간은 221ns로, 1.8V 쪽 50pF만 있다고 보고 계산한 199ns보다 길었습니다. 1kΩ에서는 3.3V 쪽 풀업도 같이 끌어올려 39ns로 계산값 42ns보다 조금 짧았습니다. 1.8V 쪽은 단순 RC 식과 딱 맞지 않으니 역산에 쓰기보다 양쪽을 비교하는 용도로 봅니다.
셋째, 풀업을 너무 작게 하면 반대쪽 LOW가 뜹니다. 1.8V 쪽 장치가 선을 잡고 있을 때 이 장치는 1.8V 쪽 풀업과 3.3V 쪽 풀업의 전류를 함께 받습니다. 양쪽 1kΩ이면 선이 0V라고 볼 때 5.1mA로(직접 계산) UM10204의 출력 조건인 3mA를 넘습니다. 직접 시뮬레이션 결과 이때 3.3V 쪽 LOW는 0.91V로 0.4V를 크게 넘어 3.3V 쪽 0.3·VDD(0.99V)에 가까웠고, 반대로 3.3V 쪽 장치가 잡을 때 1.8V 쪽 LOW는 0.63V로 1.8V 쪽 0.3·VDD(0.54V)를 넘었습니다. 1.8V 쪽 칩이 LOW를 LOW로 읽지 못할 수 있는 상태입니다. 양쪽 2.2kΩ에서는 각각 0.33V, 0.30V로 내려왔습니다.
넷째, 한쪽 풀업이 빠지면 선이 중간 전압에서 멈춥니다. 풀업 4.7kΩ 조건에서 3.3V 쪽 풀업을 빼면(10MΩ으로 대신) 3.3V 쪽은 몸체 다이오드를 거쳐 1.26V 근처까지만 올라가 0.7·VDD(2.31V)에 못 미쳤습니다. 1.8V 쪽 풀업을 빼면 1.8V 쪽은 MOSFET이 꺼지는 0.81V에서 멈췄는데, 이 값은 1.8V 쪽의 0.54V와 1.26V 사이라 HIGH로도 LOW로도 정해지지 않는 구간입니다. 단일 전압 버스에서 풀업이 빠지면 선을 끌어올릴 경로 자체가 없어지는 것과 달리, 레벨 변환이 있으면 이렇게 어정쩡한 높이에서 평평해지는 모양이 나옵니다.
이 결과를 진단에 쓰는 방법은 다음과 같습니다.
- 2채널로 양쪽을 동시에 봅니다. CH1은 1.8V 쪽 선, CH2는 3.3V 쪽 선에 대고 같은 엣지를 트리거합니다. 한쪽만 보면 레벨 변환 회로 문제인지 그 너머 장치 문제인지 가르기 어렵습니다. 상승 시간은 각 쪽 전압의 30%/70%로 따로 읽습니다.
- 평평한 중간 전압이 보이면 그쪽 풀업부터 잽니다. 위 시뮬레이션처럼 3.3V 쪽이 1.26V 근처, 1.8V 쪽이 0.81V 근처에서 멈춘다면, 전원을 끄고 각 선과 자기 전원 레일 사이 저항을 멀티미터로 잽니다. 풀업 저항 개방이나 그쪽 풀업 전원이 없는 경우를 먼저 의심합니다. 실제 멈추는 전압은 MOSFET의 문턱 전압과 다이오드 특성에 따라 달라지니, 숫자보다 평평하게 멈추는 모양을 봅니다.
- 반대쪽 LOW가 높게 뜨면 풀업 합성값과 MOSFET을 봅니다. 양쪽 풀업을 병렬로 더 단 모듈이 있으면 합성값이 생각보다 작아져 LOW를 잡는 장치의 부담이 커집니다. 풀업이 정상인데도 LOW가 높다면 MOSFET이 약하게 켜지는지 의심합니다. 게이트에 걸리는 낮은 쪽 전압(여기서는 1.8V)이 MOSFET 데이터시트의 VGS(th) 최대값에 가까우면 덜 켜질 수 있으니 부품 번호로 데이터시트를 확인합니다. MOSFET 자체의 단락·개방 점검은 MOSFET 단락·게이트 불량 점검 글에 정리해 두었습니다.
- 역산은 재는 쪽 값으로 합니다. 3.3V 쪽 상승 시간은 3.3V 쪽 풀업과 용량으로 정해지므로, 아래 역산식에 3.3V 쪽 풀업 값을 넣습니다. 1.8V 쪽은 3.3V 쪽 용량의 영향을 받으니 역산값을 그대로 믿지 않습니다.
이 시뮬레이션은 MOSFET을 문턱 전압 하나로 정해지는 단순 모델로 넣었고, 게이트 용량, 문턱 이하에서 흐르는 전류, 온도에 따른 문턱 변화, 배선 인덕턴스는 넣지 않았습니다. 실제 MOSFET은 게이트 전압이 낮을 때 이 모델과 다르게 켜질 수 있으므로 LOW 전압과 멈추는 전압은 실제 부품에서 달라질 수 있습니다. 수치는 풀업 값과 한쪽 풀업 유무에 따라 파형 모양이 어떻게 바뀌는지 비교하는 용도로 보시기 바랍니다. 1.8V 쪽 장치가 선을 잡는 경우의 넷리스트는 아래와 같고, 3.3V 쪽 장치가 잡는 경우는 스위치를 3.3V 쪽 선(h1~h6)으로 옮긴 것만 다릅니다.
* I2C 레벨 변환(1.8V<->3.3V), MOSFET 1개 방식(BSS138형 회로), 1.8V 쪽 장치가 선을 내렸다 놓음
* 풀업 양쪽 같은 값 1k/2.2k/4.7k/10k, 버스 용량 1.8V 쪽 50pF, 3.3V 쪽 200pF (가정)
* 5,6번: 4.7k에서 한쪽 풀업이 빠진 경우(10Meg로 대신)
VL vl 0 DC 1.8
VH vh 0 DC 3.3
VDRV g 0 PULSE(0 5 0 5n 5n 5u 10u)
.model SW SW(Ron=133 Roff=100Meg Vt=2.5 Vh=0.1)
.model NM NMOS(LEVEL=1 VTO=1.0 KP=0.05 LAMBDA=0.01)
.model DB D(IS=1e-12 N=1.5)
RL1 vl l1 1k
CL1 l1 0 50p
RH1 vh h1 1k
CH1 h1 0 200p
M1 h1 vl l1 l1 NM W=1u L=1u
D1 l1 h1 DB
S1 l1 0 g 0 SW
RL2 vl l2 2.2k
CL2 l2 0 50p
RH2 vh h2 2.2k
CH2 h2 0 200p
M2 h2 vl l2 l2 NM W=1u L=1u
D2 l2 h2 DB
S2 l2 0 g 0 SW
RL3 vl l3 4.7k
CL3 l3 0 50p
RH3 vh h3 4.7k
CH3 h3 0 200p
M3 h3 vl l3 l3 NM W=1u L=1u
D3 l3 h3 DB
S3 l3 0 g 0 SW
RL4 vl l4 10k
CL4 l4 0 50p
RH4 vh h4 10k
CH4 h4 0 200p
M4 h4 vl l4 l4 NM W=1u L=1u
D4 l4 h4 DB
S4 l4 0 g 0 SW
RL5 vl l5 4.7k
CL5 l5 0 50p
RH5 vh h5 10Meg
CH5 h5 0 200p
M5 h5 vl l5 l5 NM W=1u L=1u
D5 l5 h5 DB
S5 l5 0 g 0 SW
RL6 vl l6 10Meg
CL6 l6 0 50p
RH6 vh h6 4.7k
CH6 h6 0 200p
M6 h6 vl l6 l6 NM W=1u L=1u
D6 l6 h6 DB
S6 l6 0 g 0 SW
.tran 5n 20u
.meas tran trH_1k TRIG v(h1) VAL=0.99 RISE=2 TARG v(h1) VAL=2.31 RISE=2
.meas tran trH_2k2 TRIG v(h2) VAL=0.99 RISE=2 TARG v(h2) VAL=2.31 RISE=2
.meas tran trH_4k7 TRIG v(h3) VAL=0.99 RISE=2 TARG v(h3) VAL=2.31 RISE=2
.meas tran trH_10k TRIG v(h4) VAL=0.99 RISE=2 TARG v(h4) VAL=2.31 RISE=2
.meas tran trL_1k TRIG v(l1) VAL=0.54 RISE=2 TARG v(l1) VAL=1.26 RISE=2
.meas tran trL_2k2 TRIG v(l2) VAL=0.54 RISE=2 TARG v(l2) VAL=1.26 RISE=2
.meas tran trL_4k7 TRIG v(l3) VAL=0.54 RISE=2 TARG v(l3) VAL=1.26 RISE=2
.meas tran trL_10k TRIG v(l4) VAL=0.54 RISE=2 TARG v(l4) VAL=1.26 RISE=2
.meas tran volL_1k FIND v(l1) AT=14u
.meas tran volL_2k2 FIND v(l2) AT=14u
.meas tran volL_4k7 FIND v(l3) AT=14u
.meas tran volL_10k FIND v(l4) AT=14u
.meas tran volH_1k FIND v(h1) AT=14u
.meas tran volH_2k2 FIND v(h2) AT=14u
.meas tran volH_4k7 FIND v(h3) AT=14u
.meas tran volH_10k FIND v(h4) AT=14u
.meas tran knee_4k7 FIND v(l3) WHEN v(h3)=2.31 RISE=2
.meas tran vendH_4k7 FIND v(h3) AT=19.9u
.meas tran vendL_4k7 FIND v(l3) AT=19.9u
.meas tran vendH_noRH FIND v(h5) AT=19.9u
.meas tran vendL_noRH FIND v(l5) AT=19.9u
.meas tran vendH_noRL FIND v(h6) AT=19.9u
.meas tran vendL_noRL FIND v(l6) AT=19.9u
스코프로 재는 순서
이제 실제 보드에서 위 기준값과 비교하는 순서입니다. 스코프 기본 조작은 오실로스코프 사용법과 파형 읽는 법에 정리해 두었습니다.
- 전원을 끈 상태에서 멀티미터로 SCL–3.3V 레일 사이, SDA–3.3V 레일 사이 저항을 잽니다. 이것이 실제 풀업 합성값입니다.
- 읽은 값이 회로도의 풀업보다 작으면, 같은 버스의 다른 모듈에 풀업이 병렬로 더 달려 있는지 찾아봅니다. 직접 계산하면 4.7kΩ 두 개 병렬은 2.35kΩ, 10kΩ 세 개 병렬은 3.33kΩ입니다.
- 프로브를 10배로 두고, 접지는 짧은 접지 스프링으로 칩 바로 옆 GND에 댑니다. 긴 접지선은 링잉을 만들어 측정을 흐립니다. x1로 두면 프로브 용량이 버스에 더해져 상승 시간이 실제보다 길게 보일 수 있습니다.
- SCL 채널에 상승 에지 트리거를 걸고, 커서를 3.3V 기준 0.99V와 2.31V에 놓아 그 사이 시간을 읽습니다. 스코프에 Rise time 자동 측정이 있으면 기준점을 30%/70%로 바꿔야 이 글의 값과 비교됩니다. 기준점을 바꿀 수 없는 스코프라면 10%→90% 값에 0.3856을 곱하면 단순 RC 파형 기준의 30%→70% 값이 됩니다. 거꾸로 보면 300ns는 10%→90%로 약 778ns, 1000ns는 약 2593ns에 해당합니다(직접 계산).
- HIGH 구간 끝 전압이 2.31V에 닿는지 확인합니다. 닿지 못하면 상승 시간을 따지기 전에 HIGH 인식부터 안 되는 상태입니다.
- 1.8V 장치와 3.3V 장치 사이에 레벨 변환 MOSFET이 있으면 양쪽 선을 2채널로 동시에 보고, 각 쪽 전압 기준으로 따로 판정합니다. 한쪽이 어중간한 전압에서 평평하게 멈추면 그쪽 풀업부터 확인합니다(위 직접 시뮬레이션 참고).
잰 상승 시간과 풀업값을 알면 버스 용량을 거꾸로 구할 수 있습니다. Cb = tr / (0.8473 × Rp)입니다. 직접 계산하면 4.7kΩ에서 797ns가 나왔다면 버스 용량은 200pF, 2.2kΩ에서 746ns가 나왔다면 400pF입니다. 이 값이 고속 모드 Rp(max) 표와 맞지 않으면 원인이 저항인지 용량인지 갈라집니다. 레벨 변환이 있는 버스라면 위 시뮬레이션처럼 3.3V 쪽 상승 시간은 3.3V 쪽 풀업과 용량으로 정해지므로, 재는 쪽의 풀업 값을 넣어 역산합니다.
측정값으로 원인 가르기
| 측정 결과 | 의심할 것 | 조치 방향 |
|---|---|---|
| 풀업 합성값이 회로도보다 큼, 상승 느림 | 풀업 저항 개방·납땜 불량, 풀업 전원 레일 없음 | 저항과 풀업 공급 전압 확인 |
| 풀업값은 정상, 상승만 느림 | 버스 용량 증가(케이블, 추가 장치) | 역산한 Cb를 Rp(max) 표와 비교 |
| LOW가 덜 내려감 | 풀업이 너무 작음(중복 풀업 등) | 합성값을 직접 계산한 Rp(min) 967Ω과 비교 |
| HIGH가 직접 계산한 VIH 2.31V에 못 닿음 | 풀업 과대 또는 용량 과대 | 위 두 항목을 모두 확인 |
| 선이 LOW에 붙어 거의 올라오지 않음 | 칩이 선을 잡은 채 멈춤, 단락이나 누설 | 노트북 온도 센서 I2C 글의 풀업 덧대기·누설 점검 |
| 레벨 변환 한쪽이 중간 전압에서 평평하게 멈춤(시뮬레이션 0.81V·1.26V) | 그쪽 풀업 저항 개방, 풀업 전원 없음 | 전원을 끄고 각 선과 자기 전원 레일 사이 저항 측정 |
| 레벨 변환 반대쪽 LOW가 높게 뜸 | 풀업 합성값 과소, MOSFET이 약하게 켜짐 | 양쪽 풀업 합성값과 MOSFET 데이터시트의 VGS(th) 확인 |
통신 오류가 팬이나 온도 제어 증상으로 나타나는 노트북의 점검 순서는 노트북 온도 센서 I2C 오류 진단에서 다뤘습니다. 그 글에는 버스가 LOW에 붙었을 때 풀업을 잠깐 덧대 누가 선을 잡고 있는지 가르는 시뮬레이션도 있습니다. 그 글의 점검 순서에서 SCL 파형이 비스듬하게 보였다면, 이 글의 표와 그래프로 원인을 좁히면 됩니다.
자주 묻는 질문
Q. 4.7kΩ이 I2C 풀업의 정답 아닌가요? 버스 용량과 속도에 따라 다릅니다. 위 시뮬레이션에서 버스 용량 200pF일 때 4.7kΩ의 상승 시간은 797ns로, UM10204의 표준 모드 상한 1000ns 안이지만 고속 모드 상한 300ns는 넘었습니다. 직접 계산한 고속 모드 Rp(max)는 100pF에서 3.54kΩ, 200pF에서 1.77kΩ입니다. 보드의 버스 속도와 붙어 있는 장치 수를 보고 판단합니다.
Q. 스코프의 Rise time 자동 측정값이 규격보다 훨씬 크게 나옵니다. 자동 측정의 기준점을 먼저 확인합니다. 10%→90%로 재는 설정이면 같은 파형도 30%→70%보다 길게 나옵니다. 단순 RC 파형에서 10%→90%는 RC의 2.1972배, 30%→70%는 0.8473배라(직접 계산), 4.7kΩ·200pF는 10%→90%로 2065ns, 30%→70%로 796ns입니다.
Q. 풀업을 아주 작게 하면 빠르니 무조건 좋은 것 아닌가요? 아닙니다. 3.3V 버스에서 3mA·0.4V 조건으로 직접 계산한 하한은 967Ω이고, 레벨 변환이 있으면 LOW를 잡는 장치가 양쪽 풀업 전류를 함께 받습니다. 위 시뮬레이션에서 양쪽 1kΩ일 때 반대쪽 LOW가 0.91V까지 올라갔습니다. 빠르기만 보고 저항을 줄이지 말고, LOW 전압을 같이 잽니다.
Q. 레벨 변환 회로에서 풀업은 어느 전압에 달려 있어야 하나요? 위 회로 방식에서는 각 쪽 선이 자기 쪽 전원에 풀업됩니다. 1.8V 쪽 선은 1.8V로, 3.3V 쪽 선은 3.3V로 저항이 이어져 있는지 전원을 끄고 확인합니다. 한쪽 풀업이 빠졌을 때의 모양은 위 그래프의 점선과 같습니다. 정확한 구성은 해당 보드의 회로도에서 확인합니다.
작업 전에는 어댑터와 배터리 커넥터를 모두 빼고 저항을 잽니다. 통전 상태에서 프로브 끝이 옆 핀과 닿으면 전원 레일이 단락될 수 있으니, 핀 간격이 좁은 곳은 테스트 패드나 풀업 저항 패드에서 잽니다.
후즈대디




댓글 2