I2C为什么需要外接上拉电阻?针对电路进行剖析
1.I²C的输出模式
I²C 的 SDA、SCL 线都是 开漏/开集电极输出(open-drain/open-collector)
开漏输出 : MCU内部通常集成了MOSFET来控制IO口的开关,对于开漏输出,MOSFET可以开启,控制引脚接地,为低电平,但是如果关闭则会导致引脚悬空(此时引脚的电平进入不确定状态,很显然这样不可靠),此时内部又加上了一个几十K到几百K的上拉电阻,形成弱上拉(保证MOSFET关闭状态下默认高电平),此时电流很小,这只适合“保持默认高电平”,不能满足 I²C 高速通信对上升沿的要求。
如果需要外接上拉电阻,建议关闭MCU或者电子器件的内部上拉
2.电路图分析(非IIC标准电路)

-
图片里面没有表示出MCU内部弱上拉的电路图,但是有外部上拉电路图,并且连接一个电子器件,器件内部的阻抗必须远大于外接的上拉电阻,这样能够极大的减小3.3V流到节点的电流,减小电流就能减小电压损耗,此时就可以保证节点的电压保持在接近3.3V,然后作为高阻输入,R2通常是远大于R1的,R2是让输入保持默认高阻状态,即芯片默认关闭,但是R1 才是保证 IO 能真正输出高电平的关键,所以外接一个上拉电阻用来保证能够上拉输出。
-
上拉电阻越小 ,上升沿越快(好处),但功耗更大(坏处)。
-
上拉电阻越大,上升沿越慢,功耗降低,但是如果是IIC快速通讯会导致上升沿速度太慢,信号畸形,通信错误
-
当内部MOS管打开后,有一个导通电阻(图中未标出),这个导通电阻非常小,通常为几毫欧到几欧,远小于R2,节点通过低电阻直接接到地,此时电压输出为0,即没有电压经过R2,电子期间不会激活
- R2就是为了维持输入的高阻态,保证在没有外部驱动的情况下关闭,保持引脚为低电平,即高电平输入来激活电子器件
-
2.1.MOS管断开的情况下的电路分析:
- VCC — R1 — 节点 — R2 — GND(MOS 断开不参与)
- 这就是一个电阻分压网络,电流为:
I = V C C R 1 + R 2 I= \frac {V_ {CC}}{R_ {1}+R_ {2}} I=R1+R2VCC - 节点电压(EN脚电压)为:
V E N = V C C ⋅ R 2 R 1 + R 2 V_{EN} = V_{CC} \cdot \frac{R_2}{R_1 + R_2} VEN=VCC⋅R1+R2R2 - 为了让 V_BE接近V_CC,需要 R2≫R1:
例: 𝑉 𝐶 𝐶 = 3.3 V , 𝑅 1 = 10 𝑘 Ω , 𝑅 2 = 100 𝑘 Ω , V C C = 3.3 V , R 1 = 10 k Ω , R 2 = 100 k Ω 例:𝑉𝐶𝐶=3.3V,𝑅1=10𝑘Ω,𝑅2=100𝑘Ω,VCC=3.3V,R1=10kΩ,R2=100kΩ 例:VCC=3.3V,R1=10kΩ,R2=100kΩ,VCC=3.3V,R1=10kΩ,R2=100kΩ
I = 3.3 110 k ≈ 30 μ A , V E N = 3.3 ⋅ 100 110 ≈ 3.0 V I = \frac{3.3}{110k} \approx 30\ \mu A,\quad V_{EN} = 3.3 \cdot \frac{100}{110} \approx 3.0\ \text{V} I=110k3.3≈30 μA,VEN=3.3⋅110100≈3.0 V - 上拉还要“克服”EN脚的 输入漏电流(设为 I_leak),MOS 关断时,会有一股很小的直流电流从 VCC 经 R1 → 节点 → R2 → GND 流过,这股电流在节点上形成的分压把节点“抬高”,所以上拉电阻需要考虑到漏电流和抬升的电压
V E N = V C C − I p u l l ⋅ R 1 , I p u l l = I l e a k + V E N R 2 V_{EN} = V_{CC} - I_{pull} \cdot R_1,\quad I_{pull} = I_{leak} + \frac{V_{EN}}{R_2} VEN=VCC−Ipull⋅R1,Ipull=Ileak+R2VEN - 只要 I_leak 很小、R_2很大,I_pull 就很小,V_EN就会非常接近V_CC。
2.2.MOS管闭合的情况下的电路分析:
- VCC — R1 — 节点 — MOS(on) — GND 电流几乎不流向R2,导致R2附近电压全为0
- 大多数MOS闭环导通的电阻会远小于外接上拉电阻,节点电压结算:
V E N = V C C ⋅ R D S ( o n ) R 1 + R D S ( o n ) ≈ 0 V_{EN} = V_{CC} \cdot \frac{R_{DS(on)}}{R_1 + R_{DS(on)}} \approx 0 VEN=VCC⋅R1+RDS(on)RDS(on)≈0 - 上拉电流:
I = V C C R 1 + R D S ( o n ) ≈ V C C R 1 I = \frac{V_{CC}}{R_1 + R_{DS(on)}} \approx \frac{V_{CC}}{R_1} I=R1+RDS(on)VCC≈R1VCC
R 1 = 10 k Ω , R D S ( o n ) = 50 Ω ⇒ V E N ≈ 16 mV , I ≈ 0.33 mA R_1 = 10k\Omega , R_{DS(on)} = 50\Omega \Rightarrow V_{EN} \approx 16\ \text{mV},\ I \approx 0.33\ \text{mA} R1=10kΩ,RDS(on)=50Ω⇒VEN≈16 mV, I≈0.33 mA - 开漏只能“拉低”,不会主动拉高。没有 R1,MOS 关断时节点就是悬空(或只被 R2 往地拉)→ 得不到高电平。
- R2 的作用是“默认下拉,防误使能”;R1 的作用是“当 MOS 关断时提供上拉电流,把节点电压抬到高电平”。两者分工不同。
3.如何选择上拉电阻的阻值
低电平到高电平的转化在细分的时间刻度下并不是瞬间完成的,它需要有一个爬升的过程,而上拉电阻越大,爬升的越慢,上拉电阻越小,驱动能力越强,爬升的越快,在IIC标准中,在400KHZ的快速模式下,上升时间 t_r <= 300ns
电平上升波形图:
-
I²C 总线的信号线(SDA 和 SCL)会受到寄生电容的影响,并且影响高电平的上升速度,高电阻会影响电容的充电速度,这些寄生电容主要来源于:
- 引脚输入电容:每个设备的 I²C 引脚都会有一定的输入电容,通常为几 pF 到几十 pF。
- PCB 走线电容:印刷电路板上的走线也会引入电容,通常每厘米约为 1~2 pF。
- 杜邦线电容:杜邦线的长度和材质会影响电容,通常每厘米约为 50~100 pF/m。
-
可以根据需要挂载的从机数量以及线束的长度,PCB走线的长度估算出总电容
-
上拉电阻和寄生电容形成一个 RC 电路,所以可以通过RC电路来计算电平上升时间
-
t r ≈ 2.2 ⋅ R p ⋅ C t o t a l t r ≈2.2⋅R p ⋅C total tr≈2.2⋅Rp⋅Ctotal
- R p 是上拉电阻; C t o t a l 是总线电容。 R p 是上拉电阻; C total 是总线电容。 Rp是上拉电阻;Ctotal是总线电容。
-
根据公式来计算所需的上拉电阻
-
-
一般建议2.7K到4.7k之间能满足20cm走线的400KHZ高速通信
示例电路:
更多推荐

所有评论(0)