2. I2C总线物理层:SDA和SCL、上拉电阻、电压电平

讲逻辑分析仪解码之前,得先把I2C的“筋骨”摸清楚。

物理层这东西,很多人觉得枯燥。但说实话,我在项目里踩过的坑,十有八九都出在这看似简单的两根线上。信号毛刺、电平不匹配、上拉电阻选错……这些问题在逻辑分析仪的波形上一看就原形毕露。

所以我建议大家,先花点时间把物理层搞透。后面解码的时候,你才看得懂波形在“说”什么。

2.1 两根线的艺术:SDA与SCL

I2C总线就两条线:SDA(串行数据线)和 SCL(串行时钟线)。

我早年刚接触时觉得:“就两根线?能传数据?”后来发现,这恰恰是它的高明之处——简单可靠。

  • SDA:双向数据线。发送地址、数据、应答信号都走它。
  • SCL:双向时钟线。由主设备(通常是MCU)驱动,从设备可以拉低它做“时钟拉伸”。

关键点来了:这两根线都是漏极开路(Open-Drain)结构。

什么意思呢?就是设备只能把线拉低到GND,不能主动拉高。要拉高,得靠外部上拉电阻。

我习惯这么理解:你把SDA和SCL想象成两个“只能往下拽,不能往上举”的把手。只要没人拽,它就靠弹簧(上拉电阻)自动弹回高电平。

核心机制:

  • 线空闲时:SDA和SCL都是高电平(靠上拉电阻维持)。
  • 设备要发数据:将对应线拉低(低电平有效)。
  • 总线仲裁:多个主设备同时驱动时,谁先拉低SDA谁就赢得仲裁。

我记得有一次排查一个I2C死锁问题,波形上SDA一直为低。后来发现是从设备拉低了SDA后没释放,上拉电阻又太大,拉不回来。这就是典型的“悬空”死锁。

2.2 上拉电阻:选大了还是选小了?

上拉电阻是I2C物理层里最容易忽视、也最容易出问题的环节。

说白了,这个电阻负责把空闲的SDA/SCL线拉到VDD。电阻值的大小,直接影响信号的上升时间和功耗。

2.2.1 电阻值的选型原则

场景 推荐阻值 原因
低速模式(100kHz),长走线 4.7kΩ ~ 10kΩ 上升时间要求宽松,减小功耗
快速模式(400kHz) 2.2kΩ ~ 4.7kΩ 需要更快的上升沿,降低电阻值
快速+模式(1MHz) 1kΩ ~ 2.2kΩ 上升沿必须极快,电阻要足够小
总线负载重(多从设备、长距离) 1kΩ ~ 2.2kΩ 寄生电容大,需要更强的拉电流

计算公式(经验版):

Rp(min) = (VDD - Vol(max)) / Iol(max)
Rp(max) = Tr(max) / (0.8473 × Cbus)

你不需要记住这个公式。我一般直接按“400kHz用4.7kΩ打底,不行再降”的套路来。

避坑指南:

我曾经在一个项目里,为了省电把上拉电阻从4.7kΩ换成了47kΩ。结果通讯时好时坏,400kHz下波形上升沿像“爬坡”一样慢。逻辑分析仪一看,上升时间超标10倍!最后老老实实换回10kΩ。

教训:不要为了省那几十微安的静态电流,牺牲信号质量。

2.2.2 上拉电阻的实物摆放

我个人习惯把上拉电阻放在主设备附近。但不是必须的——只要在总线上任意一个节点接上就行了。

注意:只能在一处加上拉电阻!两处并联会使阻值减半,可能超出驱动能力。

2.3 电压电平:必须统一吗?

这个问题很实际。

我手上有5V的MCU,配3.3V的传感器,I2C能直接连吗?

答案:不能直接连,必须做电平转换。

2.3.1 电平不匹配的后果

  • 高电平识别错误:3.3V设备Vih最低约2.0V,5V输出3.3V算高电平吗?算。但5V输出5V会让3.3V设备承受过压。
  • 漏电流增加:5V信号直接灌入3.3V设备的IO引脚,会烧坏ESD保护二极管。
  • 死锁(Latch-up):严重时芯片直接冒烟!

实用技巧:

两设备电平差在0.5V以内,可以试试不加转换。我习惯看数据手册的VIH/VIL和VOH/VOL参数,算一下余量。不够就加电平转换芯片(如TXS0102、PCA9306)。

2.3.2 标准电平方案对比

方案 适用场景 成本
外部上拉到低电压(漏极开路) 低速、同一电源域 很低,仅需电阻
专用电平转换芯片 高速、多通道、不同电源域 中等
分立MOSFET转换电路 单通道、快速原型 较低

我个人最常用的是TXS0102,它支持自动双向,不需要方向控制信号。

2.4 本章知识体系速览

下面这张图总结了I2C物理层的核心要素。你可以把它当成一个“检查清单”:

I2C总线物理层知识体系 SDA / SCL 漏极开路结构 上拉电阻 电压电平 设备只能拉低 总线仲裁机制 阻值选型 上升时间控制 电平匹配 转换方案 核心结论 I2C物理层的本质:两根线 + 一个电阻 + 电平匹配 逻辑分析仪观察点:上升沿形状、电平幅值

这张图把物理层的几个关键点串起来了。后面你用逻辑分析仪抓波形的时候,对着这张图检查,基本不会漏东西。

2.5 小结

I2C物理层不复杂,但很关键。记住三件事:

  • 两根线:SDA送数据,SCL送时钟,都是漏极开路。
  • 一个电阻:上拉电阻不能省,阻值选对了,波形才漂亮。
  • 电平匹配:不同电压域的设备不能直连,必须做转换。

嗯,物理层就这些内容。接下来你就可以用逻辑分析仪去看真实的I2C波形了。到那时,你会发现——原来波形上那些“毛刺”和“台阶”,都是物理层的小脾气。