4. 上拉电阻理论基础:Rp最小值计算、Rp最大值计算、上升时间约束

好,咱们进入正题。上拉电阻这东西,看着不起眼,就俩电阻加个电源。但你要是选错了,整个I2C总线就跟你闹脾气。我早年吃过这个亏,板子调了三天,最后发现就是上拉电阻没算对。

说白了,上拉电阻就是给总线一个确定的空闲电平。SCL和SDA都是开漏输出,没有上拉,它们就悬空了。悬空的状态,干扰随便进,数据全乱套。

那怎么选?核心就三个约束:最小值、最大值、上升时间。咱们一个一个拆。

4.1 Rp最小值:别把管子烧了

Rp最小值,保护的是谁?是主设备里那个开漏输出的NMOS管。你想想看,当设备把总线拉低时,电流从Vdd流过Rp,再经过NMOS管到地。电阻太小,电流就太大,管子就过热,甚至烧掉。

I2C规范给了个公式:

Rp(min) = (Vdd - Vol(max)) / Iol(max)

参数解释:

  • Vdd:总线供电电压,常见3.3V或5V
  • Vol(max):输出低电平的最大允许值,标准模式0.4V
  • Iol(max):输出管在Vol时的最大灌电流,标准模式3mA

算个例子。Vdd=3.3V,Vol=0.4V,Iol=3mA:

Rp(min) = (3.3 - 0.4) / 0.003 = 966.7 Ω

所以,最小电阻不能低于967Ω。我一般取1kΩ,留点余量。

注意: 别死磕这个最小值。如果你总线上的设备很多,或者走线很长,实际Iol可能会比标称值小。我曾经在一个项目里用了820Ω,结果主设备在高温下灌电流超标,通信间歇性失败。后来换回1kΩ,问题消失。

4.2 Rp最大值:别让信号爬不动

Rp最大值,约束的是上升时间。电阻太大,RC充电时间常数就大,信号从低到高爬得慢。I2C对上升时间有硬性要求,超了就违反时序。

公式长这样:

Rp(max) = Tr(max) / (0.8473 × Cb)

其中:

  • Tr(max):允许的最大上升时间,标准模式1000ns,快速模式300ns
  • Cb:总线总电容,包括所有设备的引脚电容、走线寄生电容
  • 0.8473:RC充电到70.7%的时间常数系数

举个例子。标准模式,Tr=1000ns,Cb=200pF:

Rp(max) = 1000 / (0.8473 × 200) ≈ 5.9 kΩ

所以最大电阻约5.9kΩ。超过这个值,上升沿就太慢了。

实战经验: 我一般取中间值,比如3.3kΩ或4.7kΩ。这样既保证灌电流安全,又保证上升时间够快。如果总线电容特别大,比如超过400pF,我会考虑用更强驱动的上拉,或者加一个总线缓冲器。

4.3 上升时间约束:RC充电那点事

上升时间,说白了就是信号从低电平跳变到高电平需要多久。I2C总线是RC电路,上拉电阻Rp是R,总线电容Cb是C。充电时间常数τ = Rp × Cb。

从低电平(约0V)充到高电平(约Vdd)的70.7%,需要1个τ。从30%充到70%,大约需要0.85个τ。I2C规范里定义的上升时间,就是从30% Vdd到70% Vdd的时间。

所以:

Tr = 0.8473 × Rp × Cb

反过来,给定Tr和Cb,就能算出Rp(max)。

不同模式的上升时间要求:

模式 最大频率 最大上升时间 Tr(max) 典型Cb范围
标准模式 (Sm) 100 kHz 1000 ns 50 ~ 200 pF
快速模式 (Fm) 400 kHz 300 ns 50 ~ 200 pF
快速模式+ (Fm+) 1 MHz 120 ns 50 ~ 200 pF
核心结论: 上升时间约束决定了Rp的上限。总线电容越大,Rp就得越小。但Rp又不能太小,否则灌电流超标。所以,Rp的取值区间就是:Rp(min) < Rp < Rp(max)。

4.4 知识结构图:上拉电阻选型逻辑

下面这张图,把整个选型逻辑串起来了。你一看就明白。

上拉电阻选型逻辑图 上拉电阻选型逻辑 输入条件 Vdd, Vol, Iol Tr, Cb 模式 (Sm/Fm/Fm+) Rp(min) 计算 Rp(max) 计算 Tr 约束检查 Rp(min) < Rp < Rp(max) 选择标准上拉电阻值 常见值:1kΩ, 2.2kΩ, 3.3kΩ, 4.7kΩ 优先选E24系列

4.5 实战选型步骤

光讲理论不行,我给你一套实战步骤,照着做就行。

  1. 估算总线电容Cb:查每个设备的输入电容,加上走线寄生电容(约1pF/cm)。把所有值加起来,再留20%余量。
  2. 确定工作模式:标准模式还是快速模式?这决定了Tr(max)。
  3. 计算Rp(min):用Vdd、Vol、Iol算出来。
  4. 计算Rp(max):用Tr(max)和Cb算出来。
  5. 选标准值:在Rp(min)和Rp(max)之间,选一个E24系列的电阻值。我常用3.3kΩ或4.7kΩ。
  6. 验证上升时间:用实际选的Rp和Cb,算一下Tr,确保小于Tr(max)。
我的习惯: 如果总线长度超过20cm,或者设备超过5个,我会在原理图上预留两个上拉电阻位置。一个按计算值焊,另一个留作调试备用。板子回来用示波器实测上升时间,再决定用哪个。这招帮我省了不少事。

嗯,上拉电阻的理论基础就到这。记住三个约束:最小值保护管子,最大值保证上升时间,上升时间约束决定通信速度。下节课咱们用实际波形说话,看看选错了会出什么幺蛾子。