当前位置:首页 > 燃界驿讯 > 正文

I2C用10k不通,换成2.2k就好了,上拉到底怎么选?

I2C用10k不通,换成2.2k就好了,上拉到底怎么选?

I2C上拉不是“4.7k万能值”。10k在一块短板上可能完全正常,换成长排线、多器件或400kHz后,上升沿就可能慢到来不及到达高电平门限。阻值要同时受总线电容、速度和器件灌电流能力约束。

这个问题很常见,也特别容易靠“试电阻”解决。

板子上I2C偶发NACK,10k不稳定,换成4.7k好一点,再换2.2k就完全正常。

然后设计就结束了:以后都用2.2k。

能工作当然重要,但如果想知道下一块板为什么又可能出问题,就得把这颗上拉电阻到底在干什么弄清楚。

I2C的高电平不是器件主动推上去的

SDA、SCL通常是Open-Drain结构。

器件负责把线拉低;释放以后,高电平靠上拉电阻给总线电容充电。

所以I2C的上升沿天然就是一个RC充电过程。电阻越大、总线电容越大,上升越慢。

NXP的I2C规范直接给出了这个关系:30%到70%电压区间的Rise Time约等于0.8473×Rp×Cb。这里Cb就是线、器件引脚、连接器等加起来的总线电容。

wKgZO2rVwLyAO8iAABEmj7LmHGw783.png

图1:同一条I2C总线更换不同上拉电阻后,上升时间会出现非常明显的变化。

为什么10k短板能跑,接排线就不行

同样是10k,上拉电阻没变,但Cb变了。

板内几厘米走线时,总线电容可能很小;接上排线、转接板、多几个从设备以后,电容一路往上叠。

RC变大,上升沿就开始变圆。到400kHz时,留给每个高电平的时间本来就比100kHz短,边沿还没爬到接收门限,下一个状态已经来了。

这时候逻辑分析仪可能只告诉你“NACK”,示波器看一眼SDA/SCL上升沿,往往更直接。

图2:NXP示例用示波器从门限区间直接测I2C上升时间,并由此估算总线电容。

wKgZO2rVwL6AUoLqAAEuKAQdOPc763.png

图3:增加线缆电容后,SDA/SCL上升沿明显变慢,哪怕时钟频率本身并不高。

那是不是电阻越小越好?也不是

电阻减小,上升沿会变快,但器件拉低时需要灌更大的电流。

比如3.3V、1kΩ,低电平时理论电流已经是毫安级。器件如果Sink能力有限,VOL会抬高,低电平也可能不再漂亮。

因此I2C规范对Rp同时有上下限:上限主要被Rise Time和Bus Capacitance限制,下限则跟VDD、允许VOL和器件能灌多少电流有关。

这也是为什么2.2k、4.7k、10k都可能对,但要看当前总线,而不是背一个固定答案。

实际调试,我会直接做三件事

先确认当前工作速度:100kHz、400kHz还是更高。不同模式允许的Rise Time不同。

再用示波器在最远端器件附近量SCL和SDA的上升沿。别只在MCU旁边量,因为远端看到的才是它自己真正收到的波形。

最后用不同上拉做A/B测试,看Rise Time、VOL和通信稳定性怎么变化。

如果必须把电阻压得很小才能跑,说明总线电容可能已经太大了。这个时候降低频率、缩短线、减少挂载、分段加Buffer,往往比继续往下减Rp更干净。

图4:过大的上拉电阻会让上升沿严重变圆;过小又会增加器件拉低时的灌电流。

审核编辑 黄宇