1. I2C协议基础:物理层特性、总线拓扑结构、电气特性与上拉电阻选择

各位同学,咱们今天聊聊I2C协议的物理层。说实话,很多工程师调I2C调得头大,根源往往不是协议逻辑没搞懂,而是物理层没吃透。我当年第一次调I2C,从机死活不ACK,折腾了两天,最后发现是上拉电阻选错了。嗯,这种坑,咱们今天一次性填平。

1.1 物理层特性:两根线怎么干活?

I2C总线就两根线:SCL(时钟线)和SDA(数据线)。所有设备都挂在这两根线上,通过开漏输出(Open-Drain)结构实现“线与”逻辑。

什么叫开漏?说白了,就是器件只能把线拉低,不能主动拉高。拉高的工作交给上拉电阻。所以总线空闲时,SCL和SDA都是高电平。

核心要点: I2C是半双工通信,同一时刻只能一个设备控制总线。主机提供时钟,从机响应数据。

我见过不少新手问:“为什么I2C要开漏,不能推挽吗?”你想想看,如果两个设备同时输出,一个推高一个拉低,那就短路了。开漏结构天然支持多主机仲裁,谁先拉低谁赢,这就是I2C的优雅之处。

1.2 总线拓扑结构:能挂多少个设备?

I2C总线是真正的多从机总线。每个从机有唯一的7位或10位地址。理论上,7位地址可以挂127个设备(地址0x00保留)。但实际中,受限于总线电容,一般建议不超过8-12个。

拓扑结构就一种:总线型。所有设备的SDA连一起,SCL连一起。没有星型,没有树型,就是一根线串到底。

实战经验: 我做过一个项目,板子上挂了6个传感器加1个EEPROM,总线长度约15cm,400kHz跑得很稳。但如果走线超过20cm,或者挂的设备超过10个,建议降速到100kHz,或者加总线缓冲器。

这里有个常见的误区:有人觉得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口耐压够,完全没问题。

避坑指南: 我曾经在5V总线上用了3.3V的从机,结果从机IO口烧了。后来才意识到,虽然逻辑电平兼容,但5V上拉会把从机IO口拉到5V。解决方案:加电平转换芯片,或者用MOS管做双向电平转换。

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Ω,大部分场景都能跑。

我的习惯: 100kHz用10kΩ,400kHz用4.7kΩ,1MHz以上用2.2kΩ。如果总线走线长或者设备多,适当减小电阻。但不要低于1kΩ,否则拉低电流太大,器件可能受不了。

1.5 知识体系总览

下面这张图把I2C物理层的核心知识点串起来了,建议保存下来对照着看。

I2C物理层知识体系 I2C物理层知识体系 I2C物理层 物理层特性 总线拓扑结构 电气特性 上拉电阻选择 SCL + SDA 两根线 开漏输出结构 半双工通信 总线型并联 7位/10位地址 最多127个从机 VIL / VIH 比例值 VOL = 0.4V @ 3mA 上升/下降时间约束 Rmin = (VDD-VOL)/IOL Rmax = tr / (0.8473×Cb) 典型值:4.7kΩ 物理层是I2C调试的第一道关,上拉电阻是重中之重 选对电阻,时序就成功了一半

1.6 常见问题与避坑

  1. 总线卡死(SCL被拉低):从机异常时可能一直拉低SCL。我遇到过传感器上电时序不对,导致SCL被锁死。解决办法:加硬件看门狗,或者主机主动发9个时钟脉冲复位从机。
  2. 地址冲突:两个从机地址相同,总线就乱了。选型时注意地址可配置性,或者用I2C多路复用器。
  3. 电平不匹配:1.8V主控接3.3V从机,直接连会烧IO。用PCA9306这类电平转换芯片,或者自己搭MOS管电路。
  4. 上拉电阻选错:电阻太大,上升沿缓,高速模式跑不起来;电阻太小,拉低电流超限,器件发热。我建议手边常备2.2kΩ、4.7kΩ、10kΩ各一包,调试时换着试。
曾经踩过的坑: 有一次量产,1000块板子有3%的I2C通信不稳定。查了两天,发现是PCB走线过长,总线电容超标。后来把上拉电阻从4.7kΩ换成2.2kΩ,问题解决。所以量产前一定要做容限测试,别偷懒。

好了,物理层就聊到这儿。记住一句话:I2C调不通,八成是物理层的问题。上拉电阻、总线电容、电平匹配,这三样搞定了,剩下的就是协议层面的逻辑问题了。