풀업·오픈드레인·레벨 시프터

한 줄 요약 — 풀업(pull-up) 저항 값 하나가 I2C 통신 속도와 소비 전력을 정합니다.


풀업 / 풀다운

목적: 신호가 정의되지 않는 상태(하이임피던스)를 막습니다.

상황필요
오픈 드레인(open drain) 출력풀업 필수
버튼 입력풀업 또는 풀다운
MCU 부팅 중 GPIO가 하이임피던스외부 소자의 오동작 방지
MOSFET 게이트플로팅 방지
미사용 CMOS 입력고정 필수

내부 풀업 vs 외부 풀업

내부 (MCU)외부
값20~50 kΩ (부정확)정확
부팅 전동작 안 함항상 동작
I2C대개 부족필요
비용0저항

⚠️ MCU 리셋/부팅 중에는 내부 풀업이 동작하지 않습니다. 그 사이 외부 소자(MOSFET, 릴레이 드라이버)가 오동작하면 위험하므로, 안전이 중요한 신호에는 외부 풀업/풀다운을 쓰세요.


★ I2C 풀업 계산

I2C는 오픈 드레인(drain)이므로 풀업이 필수이고, 그 값이 속도와 전력을 동시에 결정합니다.

최소값 (전류 제한)

Rmin=VDD−VOLIOLR_{min} = \frac{V_{DD} - V_{OL}}{I_{OL}}
기호
I_OL전류 (OL)current (OL)A
R_min최소 저항minimum resistanceΩ
V_DD전압 (DD)voltage (DD)V
V_OL출력 Low 전압output low voltageV

I2C 규격: IOLI_{OL} = 3 mA, VOLV_{OL} = 0.4 V

3.3 V: Rmin=3.3−0.40.003=967 ΩR_{min} = \dfrac{3.3-0.4}{0.003} = 967\ \Omega → 약 1 kΩ

최대값 (상승 시간)

풀업 저항과 버스 용량이 RC를 만듭니다. 30%→70% 상승 시간:

tr=0.8473×RpCbt_r = 0.8473\times R_pC_b
기호
C_b정전용량 (b)capacitance (b)F
R_p피크 저항peak resistanceΩ
t_r상승 시간rise times
모드최대 trt_r최대 CbC_b
표준 (100 kHz)1000 ns400 pF
고속 (400 kHz)300 ns400 pF
초고속 (1 MHz)120 ns550 pF
Rmax=tr0.8473×CbR_{max} = \frac{t_r}{0.8473\times C_b}
기호
C_b정전용량 (b)capacitance (b)F
R_max최대 저항maximum resistanceΩ
t_r상승 시간rise times

계산 예제

400 kHz, 버스 용량 200 pF:

Rmax=300×10−90.8473×200×10−12≈1.77 kΩR_{max} = \frac{300\times10^{-9}}{0.8473\times200\times10^{-12}} \approx 1.77\ \text{k}\Omega
기호
R_max최대 저항maximum resistanceΩ

허용 범위: 1 kΩ ~ 1.77 kΩ → 1.5 kΩ 선택

100 kHz, 버스 용량 100 pF:

Rmax=1000×10−90.8473×100×10−12≈11.8 kΩR_{max} = \frac{1000\times10^{-9}}{0.8473\times100\times10^{-12}} \approx 11.8\ \text{k}\Omega
기호
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).

저항 분압 레벨 시프터 (5V → 3.3V) 회로도R11.7kΩV55V 출력R23.3kΩCIN15pF3.3V 입력 용량SRCINGND
저항 분압 레벨 시프터 (5V → 3.3V)워크벤치에서 열기 →

단순한 분압기분압 voltage divider직렬로 이은 두 저항은 입력 전압을 저항비대로 나눠 갖습니다.Vout=Vin R2R1+R2V_{out} = V_{in}\,\frac{R_2}{R_1+R_2}자세히 보기 →입니다. R1R_1이 위(5 V 쪽), R2R_2가 아래(GND 쪽)이고 중간점이 3.3 V 입력으로 갑니다.

R1=1.7R_1 = 1.7 kΩ, R2=3.3R_2 = 3.3 kΩ 정도 (비율 1:1.94)

⚠️ 고속 신호에는 부적합. 그리고 단방향입니다.

2. MOSFET 양방향 (I2C에 표준)

BSS138 양방향 레벨 시프터 (I2C) 회로도RA2.2kΩ3.3V 풀업RB2.2kΩ5V 풀업V333.3VV505VCA100pFMCU측 버스 용량CB100pF센서측 버스 용량VCM1BSS138SWSW_IDEALMCU 오픈드레인VLVHSDALSDAHCTLGND
BSS138 양방향 레벨 시프터 (I2C)워크벤치에서 열기 →
부품어디에 붙나하는 일
M1 소스3.3 V(낮은) 쪽 버스바디 다이오드가 3.3 V 쪽 → 5 V 쪽 방향을 향하게 만드는 배치
M1 드레인5 V(높은) 쪽 버스
M1 게이트3.3 V 레일에 고정VGS=3.3−VSDA(low)V_{GS} = 3.3 - V_{SDA(low)} 가 되어, 낮은 쪽이 내려갈수록 더 세게 켜진다
RupR_{up} (양쪽)각 레일 ↔ 각 버스오픈드레인 버스를 High로 올린다. 양쪽 전압이 달라도 각자 자기 레일로 올라간다

게이트를 3.3 V에 연결. 양방향으로 동작하며 I2C에 완벽합니다.

동작 원리:

  • 3.3 V 쪽이 Low → MOSFET이 켜짐 → 5 V 쪽도 Low
  • 5 V 쪽이 Low → 바디 다이오드(diode)를 통해 3.3 V 쪽이 내려가고, 그러면 VGSV_{GS}가 커져 MOSFET이 완전히 켜짐
  • 둘 다 High → MOSFET 차단(cutoff), 각자 풀업으로 High

3. 전용 IC

IC특징
74LVC1T45단방향, 방향 제어 핀, 고속
74LVC2T452채널
TXB0104양방향 자동, 오픈드레인에 부적합
TXS0102양방향, I2C용 (풀업 내장)
PCA9306I2C 전용 레벨 시프터(level shifter)

⚠️ TXB 시리즈는 I2C 같은 오픈드레인 버스에 쓰면 안 됩니다. 내부에 약한 드라이버가 있어 오픈드레인과 충돌합니다. TXS 시리즈나 PCA9306을 쓰세요.

4. 5 V 내성 입력 활용

많은 3.3 V MCU의 일부 핀은 5 V 내성(5V tolerant) 입니다. 이 경우 5 V → 3.3 V 방향은 직접 연결 가능합니다.

⚠️ 데이터시트에서 어느 핀이 내성인지 확인하세요. 아날로그 기능이 있는 핀은 대개 내성이 없습니다.


시뮬레이션으로 확인

I2C 풀업 저항과 상승 시간 회로도RP4.7kΩ풀업VDD3.3VCB200pF버스 용량VCSWSW_IDEALVPSDACTLGND
I2C 풀업 저항과 상승 시간워크벤치에서 열기 →
# 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}

RPCBR_P C_B 시정수시정수 time constantRC 회로가 목표값까지 63%를 가는 데 걸리는 시간으로, 회로의 빠르기를 한 숫자로 나타냅니다.τ=RC\tau = RC자세히 보기 →를 확인하세요. 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Ω

⚠️ 이상과 실제의 차이

이상실제
상승이 즉시RCRC로 느림
버스 용량이 작음커넥터·케이블로 크게 증가
풀업 값이 자유최소·최대 제약이 동시에 존재
레벨 시프트가 투명지연·왜곡 추가
5 V 내성이면 안전전원이 꺼진 상태에서 5 V가 들어오면 기생 급전(back-powering) 위험

연습문제

문제 1. I2C 400 kHz, 버스 용량 150 pF, 3.3 V. 풀업 저항 범위는?

연습 9-05-1 — I2C 풀업 저항의 위아래 한계 회로도RP2.2kΩ풀업VDD3.3VVC놓는 순간CB150pF버스 용량SW1SW_IDEAL개방 드레인VPSDACTLGND
연습 9-05-1 — I2C 풀업 저항의 위아래 한계워크벤치에서 열기 →
풀이

최소: 3.3−0.40.003=967 Ω\dfrac{3.3-0.4}{0.003} = 967\ \Omega

최대: 300×10−90.8473×150×10−12≈2.36 kΩ\dfrac{300\times10^{-9}}{0.8473\times150\times10^{-12}} \approx 2.36\ \text{k}\Omega

범위: 1 kΩ ~ 2.36 kΩ → 1.8 kΩ 또는 2.2 kΩ

문제 2. 3.3 V MCU와 5 V 센서를 I2C로 연결합니다. 어떻게 하겠습니까?

풀이

BSS138 MOSFET 레벨 시프터 (SDA, SCL 각각):

BSS138 양방향 레벨 시프터 (I2C) 회로도RA2.2kΩ3.3V 풀업RB2.2kΩ5V 풀업V333.3VV505VCA100pFMCU측 버스 용량CB100pF센서측 버스 용량VCM1BSS138SWSW_IDEALMCU 오픈드레인VLVHSDALSDAHCTLGND
BSS138 양방향 레벨 시프터 (I2C)워크벤치에서 열기 →

SDA·SCL 두 신호에 각각 하나씩, 총 BSS138 2개 + 풀업 4개가 필요합니다.

왜 이 방법인가:

  • I2C는 양방향이므로 방향 제어가 필요 없는 방식이어야 함
  • 오픈드레인 특성을 유지해야 함
  • 저렴하고 검증됨

대안: PCA9306, TXS0102 같은 전용 IC (더 빠르고 확실하지만 비쌈)

⚠️ 주의: 양쪽에 각각 풀업이 필요하고, 버스 용량이 두 배가 되므로 풀업 값을 다시 계산해야 합니다.

더 간단한 대안: 센서가 3.3 V로도 동작한다면(많은 5 V 센서가 3.0~5.5 V 범위) 그냥 3.3 V로 구동하세요. 레벨 시프터가 아예 필요 없습니다.


이전 ← 04 클럭과 타이밍 | 다음 → 06 아날로그 스위치와 멀티플렉서