1. I2C协议基础:物理层特性、总线拓扑、开漏输出与上拉电阻、速率模式

各位同学,咱们今天开篇先聊聊I2C的物理层。很多人写驱动上来就调寄存器,结果波形乱七八糟,其实就是底层物理特性没吃透。我刚开始做嵌入式那会儿也犯过这毛病——拿着逻辑分析仪抓了一整天,最后发现是上拉电阻配错了。嗯,咱们从根儿上讲起。

1.1 物理层特性与总线拓扑

I2C总线就两根线:SCL(时钟线)和SDA(数据线)。所有设备都挂在这两根线上,主从设备之间通过地址寻址通信。你想想看,一个总线上挂几十个传感器、存储器、IO扩展芯片,就靠两根线搞定,这就是I2C的魅力。

总线拓扑结构其实很简单,我画了张图帮你理解:

I2C总线拓扑结构 Rₚ Rₚ VDD SDA SCL 主设备 (MCU/SoC) 从设备1 (0x50 EEPROM) 从设备2 (0x3C OLED) 关键说明: • 所有设备的SDA引脚并联到SDA总线,SCL引脚并联到SCL总线 • 每个从设备有唯一7位或10位地址,主设备通过地址选择通信对象 • 总线电容受设备数量和走线长度影响,电容越大速率上限越低 • 上拉电阻Rₚ一般取4.7kΩ~10kΩ,高速模式需更小阻值

这里有个关键点:总线电容。每个设备的引脚都有寄生电容,加上PCB走线电容,总线上所有电容加起来会限制速率。我记得有个项目,客户非要在一条I2C总线上挂16个设备,结果400kHz跑不起来,最后只能降到100kHz。所以设计时别太贪心,一般建议不超过8个设备。

1.2 开漏输出与上拉电阻

I2C最特别的地方就是开漏输出。说白了,设备的SDA和SCL引脚内部就是一个MOS管的漏极,它只能把总线拉低到GND,但没法主动拉高。那高电平谁来给?上拉电阻。

开漏输出的本质:设备只能输出低电平(0)和高阻态(Z)。高电平完全靠外部上拉电阻把总线拉到VDD。这就实现了"线与"逻辑——任何一个设备拉低总线,总线就是低电平。

为什么要这么设计?我举个例子你就明白了。假设主设备想发送数据,从设备想发送ACK应答。如果都用推挽输出,两个设备同时驱动总线就会短路。开漏输出配合"线与"逻辑,多个设备可以安全地共享总线,谁想拉低谁就拉低,不会打架。

上拉电阻的取值很讲究,我列个表给你参考:

参数 标准模式 (100kHz) 快速模式 (400kHz) 高速模式 (3.4MHz)
推荐上拉电阻 4.7kΩ ~ 10kΩ 1.5kΩ ~ 4.7kΩ 200Ω ~ 1kΩ
总线电容上限 400pF 400pF 100pF
上升时间要求 ≤ 1000ns ≤ 300ns ≤ 40ns
VDD范围 3.0V ~ 5.5V 1.8V ~ 5.5V 1.8V ~ 3.3V

避坑指南:我曾经在一个低功耗项目里用了100kΩ的上拉电阻,想着省电。结果波形上升沿慢得像蜗牛,通信完全不可靠。上拉电阻不是越大越好,也不是越小越好——太小了灌电流太大,功耗高;太大了上升沿太慢,速率上不去。

计算上拉电阻有个经验公式:Rₚ(min) = VDD / Iₒₗ,其中Iₒₗ是器件能承受的最大灌电流,一般3mA~5mA。最大值则取决于总线电容和允许的上升时间:Rₚ(max) = tᵣ / (0.8473 × C_bus)。嗯,实际项目中我一般先按4.7kΩ起步,调试时用示波器看波形再微调。

1.3 速率模式详解

I2C定义了三种速率模式,咱们一个一个说。

标准模式 (Standard Mode, 100kHz)

这是最基础的速率,几乎所有I2C设备都支持。时序要求宽松,上拉电阻好配,总线电容容忍度高。我建议你在原型阶段先用标准模式调通,再往上提速率。省得上来就高速,出了问题都不知道是硬件还是软件的事。

快速模式 (Fast Mode, 400kHz)

现在大部分传感器和存储器都支持这个速率。相比标准模式,快速模式对上升时间要求更严(≤300ns),所以上拉电阻要适当减小。另外,快速模式设备可以支持快速模式+ (FM+, 1MHz),不过这个不是所有器件都有。

高速模式 (High-Speed Mode, 3.4MHz)

这个模式就比较讲究了。高速模式下,主设备会先发送一个"高速模式主码"(00001XXX),然后切换到一个特殊的开漏电流源来驱动SCL。从设备也需要专门支持高速模式。我做过一个项目用3.4MHz读图像传感器,PCB走线必须严格控制,上拉电阻用到了330Ω,总线电容不能超过100pF。

个人经验:实际项目中,80%的场景用100kHz或400kHz就够了。别盲目追求高速——速率越高,抗干扰能力越差,走线要求越苛刻。我见过有人非要用3.4MHz读一个温度传感器,结果数据老是出错,降到400kHz就稳了。选速率要匹配实际需求。

1.4 本章小结

咱们把I2C物理层的核心点捋一遍:

  • 两根线:SCL时钟线 + SDA数据线,所有设备并联
  • 开漏输出:设备只能拉低,不能拉高,高电平靠上拉电阻
  • 上拉电阻:标准模式4.7kΩ起步,高速模式可能低至200Ω
  • 三种速率:100kHz标准、400kHz快速、3.4MHz高速,选型要匹配
  • 总线电容:设备数量和走线长度直接影响速率上限