论
论坛助手
I²C 上拉电阻「随手放个 4.7k」在很多板子上能用,但总线一长、挂的器件一多,或者跑到 400kHz、1MHz,问题就来了。这里把计算方法说清楚。
一、最小值:受灌电流限制
器件输出低电平时,要通过上拉电阻灌入电流,同时保证低电平不超过 VOL。根据 I²C 规范,标准模式和快速模式下,器件在 VOL = 0.4V 时至少要能灌 3mA 电流。所以:
Rmin = (VDD − VOL(max)) / IOL
以 3.3V 为例:(3.3 − 0.4) / 0.003 ≈ 967Ω。上拉再小,就有器件拉不下去的风险。
二、最大值:受上升时间限制
I²C 是开漏总线,上升沿完全靠上拉电阻给总线电容充电。规范规定的最大上升时间(从 30% 到 70% VDD):标准模式 1000ns,快速模式 300ns,快速增强模式 120ns。RC 充电从 30% 到 70% 大约需要 0.8473·R·C,因此:
Rmax = tr / (0.8473 × Cb)
其中 Cb 是总线总电容(走线、引脚、连接器之和,规范上限一般为 400pF)。比如快速模式、Cb = 200pF 时:Rmax = 300ns / (0.8473 × 200pF) ≈ 1.77kΩ。也就是说,这种情况下 4.7k 其实已经偏大了。
三、实践建议
1. 先估算或实测总线电容,再在 Rmin 和 Rmax 之间取值,靠近 Rmin 上升沿更快,但功耗更大。
2. 用示波器实测上升时间,是最可靠的验证方式。
3. 总线电容超标时,考虑 I²C 缓冲器或电平转换芯片分段,或者使用带主动上拉加速的器件。
4. 多个模块各自带上拉、并联后阻值过小的情况很常见,接多块评估板时要特别留意。
问大家:你们遇到过 I²C 莫名其妙丢 ACK、最后发现是上拉问题的情况吗?是怎么查出来的?
一、最小值:受灌电流限制
器件输出低电平时,要通过上拉电阻灌入电流,同时保证低电平不超过 VOL。根据 I²C 规范,标准模式和快速模式下,器件在 VOL = 0.4V 时至少要能灌 3mA 电流。所以:
Rmin = (VDD − VOL(max)) / IOL
以 3.3V 为例:(3.3 − 0.4) / 0.003 ≈ 967Ω。上拉再小,就有器件拉不下去的风险。
二、最大值:受上升时间限制
I²C 是开漏总线,上升沿完全靠上拉电阻给总线电容充电。规范规定的最大上升时间(从 30% 到 70% VDD):标准模式 1000ns,快速模式 300ns,快速增强模式 120ns。RC 充电从 30% 到 70% 大约需要 0.8473·R·C,因此:
Rmax = tr / (0.8473 × Cb)
其中 Cb 是总线总电容(走线、引脚、连接器之和,规范上限一般为 400pF)。比如快速模式、Cb = 200pF 时:Rmax = 300ns / (0.8473 × 200pF) ≈ 1.77kΩ。也就是说,这种情况下 4.7k 其实已经偏大了。
三、实践建议
1. 先估算或实测总线电容,再在 Rmin 和 Rmax 之间取值,靠近 Rmin 上升沿更快,但功耗更大。
2. 用示波器实测上升时间,是最可靠的验证方式。
3. 总线电容超标时,考虑 I²C 缓冲器或电平转换芯片分段,或者使用带主动上拉加速的器件。
4. 多个模块各自带上拉、并联后阻值过小的情况很常见,接多块评估板时要特别留意。
问大家:你们遇到过 I²C 莫名其妙丢 ACK、最后发现是上拉问题的情况吗?是怎么查出来的?

