풀업·오픈드레인·레벨 시프터
한 줄 요약 — 풀업(pull-up) 저항 값 하나가 I2C 통신 속도와 소비 전력을 정합니다.
풀업 / 풀다운
목적: 신호가 정의되지 않는 상태(하이임피던스)를 막습니다.
| 상황 | 필요 |
|---|---|
| 오픈 드레인(open drain) 출력 | 풀업 필수 |
| 버튼 입력 | 풀업 또는 풀다운 |
| MCU 부팅 중 GPIO가 하이임피던스 | 외부 소자의 오동작 방지 |
| MOSFET 게이트 | 플로팅 방지 |
| 미사용 CMOS 입력 | 고정 필수 |
내부 풀업 vs 외부 풀업
| 내부 (MCU) | 외부 | |
|---|---|---|
| 값 | 20~50 kΩ (부정확) | 정확 |
| 부팅 전 | 동작 안 함 | 항상 동작 |
| I2C | 대개 부족 | 필요 |
| 비용 | 0 | 저항 |
⚠️ MCU 리셋/부팅 중에는 내부 풀업이 동작하지 않습니다. 그 사이 외부 소자(MOSFET, 릴레이 드라이버)가 오동작하면 위험하므로, 안전이 중요한 신호에는 외부 풀업/풀다운을 쓰세요.
★ I2C 풀업 계산
I2C는 오픈 드레인(drain)이므로 풀업이 필수이고, 그 값이 속도와 전력을 동시에 결정합니다.
최소값 (전류 제한)
I_OL전류 (OL)current (OL)AR_min최소 저항minimum resistanceΩV_DD전압 (DD)voltage (DD)VV_OL출력 Low 전압output low voltageVI2C 규격: = 3 mA, = 0.4 V
3.3 V: → 약 1 kΩ
최대값 (상승 시간)
풀업 저항과 버스 용량이 RC를 만듭니다. 30%→70% 상승 시간:
C_b정전용량 (b)capacitance (b)FR_p피크 저항peak resistanceΩt_r상승 시간rise times| 모드 | 최대 | 최대 |
|---|---|---|
| 표준 (100 kHz) | 1000 ns | 400 pF |
| 고속 (400 kHz) | 300 ns | 400 pF |
| 초고속 (1 MHz) | 120 ns | 550 pF |
C_b정전용량 (b)capacitance (b)FR_max최대 저항maximum resistanceΩt_r상승 시간rise times계산 예제
400 kHz, 버스 용량 200 pF:
R_max최대 저항maximum resistanceΩ허용 범위: 1 kΩ ~ 1.77 kΩ → 1.5 kΩ 선택
100 kHz, 버스 용량 100 pF:
R_max최대 저항maximum resistanceΩ4.7 kΩ(관례값)이 잘 맞습니다.
💡 “I2C 풀업은 4.7 kΩ” 이라는 관례는 100 kHz, 짧은 버스 기준입니다. 400 kHz나 긴 버스에서는 계산해서 낮춰야 합니다.
버스 용량 추정
| 요소 | 용량 |
|---|---|
| IC 핀 | 5~10 pF |
| PCB 배선(trace) | 1 pF/cm |
| 커넥터·케이블 | 50~100 pF/m |
오픈 드레인 (오픈 컬렉터)
출력이 Low로 당기거나(sink), 하이임피던스만 됩니다. High는 풀업이 만듭니다.
| ✅ 장점 | ⚠️ 단점 |
|---|---|
| 와이어드-AND (여러 출력을 묶을 수 있음) | 상승이 느림 (RC) |
| 레벨 변환 자유 (풀업 전압으로 결정) | 상시 전력 소비 (Low일 때) |
| 버스 충돌 안전 | 노이즈 마진(noise margin)노이즈 마진 noise margin논리 레벨이 잘못 읽히기 전까지 견딜 수 있는 잡음의 크기로, 레벨 시프터를 고를 때의 기준입니다.자세히 보기 →이 상승 구간에서 취약 |
용도: I2C, 인터럽트 병합, 리셋 라인, 레벨 시프트
레벨 시프터
1. 저항 분압 (3.3 V ← 5 V)
가장 간단하지만 속도가 느립니다 (RC).
단순한 분압기분압 voltage divider직렬로 이은 두 저항은 입력 전압을 저항비대로 나눠 갖습니다.자세히 보기 →입니다. 이 위(5 V 쪽), 가 아래(GND 쪽)이고 중간점이 3.3 V 입력으로 갑니다.
kΩ, kΩ 정도 (비율 1:1.94)
⚠️ 고속 신호에는 부적합. 그리고 단방향입니다.
2. MOSFET 양방향 (I2C에 표준)
| 부품 | 어디에 붙나 | 하는 일 |
|---|---|---|
| M1 소스 | 3.3 V(낮은) 쪽 버스 | 바디 다이오드가 3.3 V 쪽 → 5 V 쪽 방향을 향하게 만드는 배치 |
| M1 드레인 | 5 V(높은) 쪽 버스 | |
| M1 게이트 | 3.3 V 레일에 고정 | 가 되어, 낮은 쪽이 내려갈수록 더 세게 켜진다 |
| (양쪽) | 각 레일 ↔ 각 버스 | 오픈드레인 버스를 High로 올린다. 양쪽 전압이 달라도 각자 자기 레일로 올라간다 |
게이트를 3.3 V에 연결. 양방향으로 동작하며 I2C에 완벽합니다.
동작 원리:
- 3.3 V 쪽이 Low → MOSFET이 켜짐 → 5 V 쪽도 Low
- 5 V 쪽이 Low → 바디 다이오드(diode)를 통해 3.3 V 쪽이 내려가고, 그러면 가 커져 MOSFET이 완전히 켜짐
- 둘 다 High → MOSFET 차단(cutoff), 각자 풀업으로 High
3. 전용 IC
| IC | 특징 |
|---|---|
| 74LVC1T45 | 단방향, 방향 제어 핀, 고속 |
| 74LVC2T45 | 2채널 |
| TXB0104 | 양방향 자동, 오픈드레인에 부적합 |
| TXS0102 | 양방향, I2C용 (풀업 내장) |
| PCA9306 | I2C 전용 레벨 시프터(level shifter) |
⚠️ TXB 시리즈는 I2C 같은 오픈드레인 버스에 쓰면 안 됩니다. 내부에 약한 드라이버가 있어 오픈드레인과 충돌합니다. TXS 시리즈나 PCA9306을 쓰세요.
4. 5 V 내성 입력 활용
많은 3.3 V MCU의 일부 핀은 5 V 내성(5V tolerant) 입니다. 이 경우 5 V → 3.3 V 방향은 직접 연결 가능합니다.
⚠️ 데이터시트에서 어느 핀이 내성인지 확인하세요. 아날로그 기능이 있는 핀은 대개 내성이 없습니다.
시뮬레이션으로 확인
# examples/09-digital/i2c-pullup.yaml
meta:
name: I2C 풀업 저항과 상승 시간
lesson: docs/09-digital/05-pullup-levelshift.md
note: RP를 1k/4.7k/10k로 바꾸며 상승 시간을 비교
components:
- {ref: VDD, type: vdc, value: 3.3}
- {ref: RP, type: r, value: 4.7k, label: 풀업}
- {ref: CB, type: c, value: 200p, label: 버스 용량}
- {ref: SW, type: sw, model: SW_IDEAL}
- {ref: VC, type: vpulse, params: {v1: 5, v2: 0, td: 1u, tr: 10n, tf: 10n, pw: 5u, per: 10u}}
nets:
VP: [VDD.p, RP.1]
SDA: [RP.2, CB.1, SW.1]
CTL: [VC.p, SW.cp]
GND: [VDD.n, CB.2, SW.2, SW.cn, VC.n]
analyses:
- {type: tran, tstep: 10n, tstop: 20u}시정수시정수 time constantRC 회로가 목표값까지 63%를 가는 데 걸리는 시간으로, 회로의 빠르기를 한 숫자로 나타냅니다.자세히 보기 →를 확인하세요. 4.7 kΩ × 200 pF = 940 ns → 30~70% 상승 시간 약 800 ns로 400 kHz 규격(300 ns) 초과입니다.
⚖️ 부품 트레이드오프
| 선택 | ✅ 좋아지는 것 | ⚠️ 나빠지는 것 |
|---|---|---|
| 작은 풀업 (1 kΩ) | 빠른 상승, 노이즈 면역↑ | 소비 전류↑ (3.3 mA), 드라이버 부담 |
| 큰 풀업 (10 kΩ) | 저전력 | 느린 상승 → 속도 제한, 노이즈에 취약 |
| 내부 풀업 | 부품 0개 | 값 부정확, 부팅 전 무효, I2C에 부족 |
| 저항 분압 레벨 시프트 | 부품 2개, 저렴 | 느림, 단방향, 상시 전류 |
| MOSFET 레벨 시프트 | 양방향, 빠름, 저렴 | 부품 3개(MOSFET + 풀업 2개) |
| 전용 IC | 빠르고 확실 | 비쌈, 전원 필요 |
측정 회로 관점
⚠️ I2C/SPI 배선을 아날로그 입력 근처로 지나가게 하지 마세요. 통신 중 발생하는 에지가 용량 결합(coupling)으로 아날로그에 들어옵니다.
가능하면 측정 중에는 통신을 멈추세요. ADC 변환 중에 I2C 트래픽이 있으면 그 노이즈가 그대로 데이터에 들어갑니다. 변환 완료 후 읽는 방식으로 타이밍을 분리하세요.
🔌 실제 쓰임새
| 자리 | 값 |
|---|---|
| I2C (100 kHz, 짧은 버스) | 4.7 kΩ |
| I2C (400 kHz) | 1.5~2.2 kΩ |
| I2C (긴 케이블) | 1 kΩ + 버퍼 IC (PCA9600 등) |
| 버튼 입력 | 10 kΩ |
| MOSFET 게이트 풀다운 | 100 kΩ |
| 리셋 라인 | 10 kΩ |
| 인터럽트 (와이어드-OR) | 10 kΩ |
⚠️ 이상과 실제의 차이
| 이상 | 실제 |
|---|---|
| 상승이 즉시 | 로 느림 |
| 버스 용량이 작음 | 커넥터·케이블로 크게 증가 |
| 풀업 값이 자유 | 최소·최대 제약이 동시에 존재 |
| 레벨 시프트가 투명 | 지연·왜곡 추가 |
| 5 V 내성이면 안전 | 전원이 꺼진 상태에서 5 V가 들어오면 기생 급전(back-powering) 위험 |
연습문제
문제 1. I2C 400 kHz, 버스 용량 150 pF, 3.3 V. 풀업 저항 범위는?
풀이
최소:
최대:
범위: 1 kΩ ~ 2.36 kΩ → 1.8 kΩ 또는 2.2 kΩ
문제 2. 3.3 V MCU와 5 V 센서를 I2C로 연결합니다. 어떻게 하겠습니까?
풀이
BSS138 MOSFET 레벨 시프터 (SDA, SCL 각각):
SDA·SCL 두 신호에 각각 하나씩, 총 BSS138 2개 + 풀업 4개가 필요합니다.
왜 이 방법인가:
- I2C는 양방향이므로 방향 제어가 필요 없는 방식이어야 함
- 오픈드레인 특성을 유지해야 함
- 저렴하고 검증됨
대안: PCA9306, TXS0102 같은 전용 IC (더 빠르고 확실하지만 비쌈)
⚠️ 주의: 양쪽에 각각 풀업이 필요하고, 버스 용량이 두 배가 되므로 풀업 값을 다시 계산해야 합니다.
더 간단한 대안: 센서가 3.3 V로도 동작한다면(많은 5 V 센서가 3.0~5.5 V 범위) 그냥 3.3 V로 구동하세요. 레벨 시프터가 아예 필요 없습니다.
이전 ← 04 클럭과 타이밍 | 다음 → 06 아날로그 스위치와 멀티플렉서