I2C硬件设计:上拉电阻计算、总线电容、电平转换与多主设备支持
去年冬天调试一块带三路I2C从设备的板子,示波器挂上去一看,SCL波形像被狗啃过——上升沿拖了老长的尾巴,从3.3V爬到2.0V用了将近1微秒。当时室温大概15度,我心想这要是夏天温度上来,总线电容再变一变,通信铁定翻车。后来查了从设备数据手册,发现其中一颗传感器输入引脚电容标称10pF,加上PCB走线、连接器、保护器件,整条总线电容轻松超过400pF。这就是典型的“上拉电阻选小了,上升时间不够”的坑。
上拉电阻计算:不是随便焊个4.7k就完事
I2C总线是开漏结构,SCL和SDA线靠上拉电阻把电平拉高。电阻选小了,灌电流太大,从设备可能拉不动;选大了,上升沿太慢,时序就崩了。标准模式(100kHz)要求上升时间不超过1000ns,快速模式(400kHz)不超过300ns,快速+模式(1MHz)更是严苛到120ns。
计算上拉电阻下限的公式很简单:Rmin = (VDD - VOL) / IOL。VDD是总线电压,VOL是低电平最大值(通常0.4V),IOL是器件能承受的最大灌电流(一般3mA或6mA,看数据手册)。比如3.3V系统,用3mA算,Rmin = (3.3 - 0.4) / 0.003 ≈ 967Ω。别死磕这个值,实际工程中我常用1.5k到2.2k,留点余量。
上限计算就有点意思了:Rmax = Tr / (0.8473 × Cbus)。Tr是要求的上升时间,Cbus是总线总电容。0.8473这个系数来自RC充电曲线——从0V充到0.3VDD的时间常数。假设Cbus=200pF,要求Tr=300ns(快速模式),Rmax = 300e-9 / (0.8473 × 200e-12) ≈ 1770Ω。这时候你选2.2k就悬了,1.5k更稳妥。
这里踩过坑:别只看从设备的输入电容,PCB走线电容每厘米大约1-2pF,连接器、ESD保护管、TVS管都会加电容。我见过一块板子,I2C总线上挂了5个从设备,每个标称10pF,但走线绕了大半个板子,加上两个ESD保护管,实测总线电容飙到350p