1. I2C协议基础:物理层特性、总线拓扑结构、电气特性与上拉电阻选择
各位同学,咱们今天聊聊I2C协议的物理层。说实话,很多工程师调I2C调得头大,根源往往不是协议逻辑没搞懂,而是物理层没吃透。我当年第一次调I2C,从机死活不ACK,折腾了两天,最后发现是上拉电阻选错了。嗯,这种坑,咱们今天一次性填平。
1.1 物理层特性:两根线怎么干活?
I2C总线就两根线:SCL(时钟线)和SDA(数据线)。所有设备都挂在这两根线上,通过开漏输出(Open-Drain)结构实现“线与”逻辑。
什么叫开漏?说白了,就是器件只能把线拉低,不能主动拉高。拉高的工作交给上拉电阻。所以总线空闲时,SCL和SDA都是高电平。
我见过不少新手问:“为什么I2C要开漏,不能推挽吗?”你想想看,如果两个设备同时输出,一个推高一个拉低,那就短路了。开漏结构天然支持多主机仲裁,谁先拉低谁赢,这就是I2C的优雅之处。
1.2 总线拓扑结构:能挂多少个设备?
I2C总线是真正的多从机总线。每个从机有唯一的7位或10位地址。理论上,7位地址可以挂127个设备(地址0x00保留)。但实际中,受限于总线电容,一般建议不超过8-12个。
拓扑结构就一种:总线型。所有设备的SDA连一起,SCL连一起。没有星型,没有树型,就是一根线串到底。
这里有个常见的误区:有人觉得I2C可以像SPI那样搞菊花链。不行!I2C没有片选线,所有设备都监听总线,地址匹配才响应。所以必须是并联结构。
1.3 电气特性:电平标准与噪声容限
I2C的电平标准分两类:
| 参数 | 标准模式 (100kHz) | 快速模式 (400kHz) | 高速模式 (3.4MHz) |
|---|---|---|---|
| VIL (输入低电平) | 0.3 × VDD | 0.3 × VDD | 0.3 × VDD |
| VIH (输入高电平) | 0.7 × VDD | 0.7 × VDD | 0.7 × VDD |
| VOL (输出低电平) | 0.4V @ 3mA | 0.4V @ 3mA | 0.4V @ 3mA |
| 上升时间 tr | ≤ 1000ns | ≤ 300ns | ≤ 120ns |
| 下降时间 tf | ≤ 300ns | ≤ 300ns | ≤ 120ns |
注意看,VIL和VIH是比例值,不是绝对值。所以3.3V系统和5V系统混接时,只要满足0.7×VDD的门限,就能正常工作。我做过3.3V主控接5V传感器,只要上拉电阻接5V,IO口耐压够,完全没问题。
1.4 上拉电阻选择:这个坑最深
上拉电阻选多大?这是I2C调试中最常见的问题。选小了,功耗大,拉低电流不够;选大了,上升沿太慢,时序不过。
计算公式其实不复杂:
Rp(min) = (VDD - VOL) / IOL
Rp(max) = tr / (0.8473 × Cb)
其中:
- VDD:总线供电电压
- VOL:输出低电平最大值(通常0.4V)
- IOL:输出低电平电流(标准模式3mA,快速模式20mA)
- tr:允许的最大上升时间
- Cb:总线总电容(包括器件引脚电容和走线寄生电容)
举个例子,3.3V系统,400kHz,总线电容估算50pF:
Rp(min) = (3.3 - 0.4) / 0.003 = 967Ω
Rp(max) = 300ns / (0.8473 × 50pF) ≈ 7.08kΩ
所以电阻范围是1kΩ ~ 7kΩ。我一般取中间值4.7kΩ,大部分场景都能跑。
1.5 知识体系总览
下面这张图把I2C物理层的核心知识点串起来了,建议保存下来对照着看。
1.6 常见问题与避坑
- 总线卡死(SCL被拉低):从机异常时可能一直拉低SCL。我遇到过传感器上电时序不对,导致SCL被锁死。解决办法:加硬件看门狗,或者主机主动发9个时钟脉冲复位从机。
- 地址冲突:两个从机地址相同,总线就乱了。选型时注意地址可配置性,或者用I2C多路复用器。
- 电平不匹配:1.8V主控接3.3V从机,直接连会烧IO。用PCA9306这类电平转换芯片,或者自己搭MOS管电路。
- 上拉电阻选错:电阻太大,上升沿缓,高速模式跑不起来;电阻太小,拉低电流超限,器件发热。我建议手边常备2.2kΩ、4.7kΩ、10kΩ各一包,调试时换着试。
好了,物理层就聊到这儿。记住一句话:I2C调不通,八成是物理层的问题。上拉电阻、总线电容、电平匹配,这三样搞定了,剩下的就是协议层面的逻辑问题了。