第2章 I2C物理层:SDA、SCL与上拉电阻那些事

做嵌入式这些年,我调试过不下几十种I2C器件。说实话,90%的通信问题都出在物理层——要么波形塌了,要么电平对不上。这一章咱们就把SDA、SCL这两根线彻底聊透。

2.1 SDA与SCL:一根数据线,一根时钟线

I2C只有两根线,这大概是它最吸引人的地方。SDA(串行数据线)负责传数据,SCL(串行时钟线)负责提供同步时钟。两根线都是双向的,而且是开漏输出。

“开漏”是什么意思?说白了,就是芯片只能把线拉低,不能主动拉高。想拉高?全靠外接的上拉电阻。这个设计有个好处——多个器件可以共用一根线,谁要发数据就把线拉低,不发就释放,由电阻拉回高电平。你想想看,这相当于一个线与逻辑:只要有一个器件拉低,整条总线就是低电平。

💡 个人习惯提醒:我第一次用I2C时,以为MCU引脚配置成推挽输出也能用,结果一接从机,总线直接锁死。后来才意识到,开漏是I2C的根基,千万别偷懒用推挽。

SCL也是同样的开漏结构。主机通过控制SCL的高低来产生时钟,从机可以在需要时拉低SCL做时钟拉伸(clock stretching)——这个机制后面会细讲。

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

上拉电阻的取值直接影响总线速度和功耗。我见过很多工程师直接把电阻焊成10kΩ,结果400kHz下波形圆得跟土豆似的——上升沿太慢,时序根本过不了。

电阻选型主要看两个参数:总线电容和目标速率。标准模式下(100kHz),上拉电阻可以大一些,比如4.7kΩ~10kΩ。快速模式(400kHz),就得降到1.5kΩ~4.7kΩ。高速模式(3.4MHz)就更讲究了,有时甚至要用0.5kΩ。

工作模式 最大速率 推荐上拉电阻范围 典型总线电容
标准模式 (Sm) 100 kHz 4.7 kΩ ~ 10 kΩ ≤ 100 pF
快速模式 (Fm) 400 kHz 1.5 kΩ ~ 4.7 kΩ ≤ 200 pF
快速模式+ (Fm+) 1 MHz 0.8 kΩ ~ 2.2 kΩ ≤ 400 pF
高速模式 (Hs) 3.4 MHz 0.5 kΩ ~ 1.5 kΩ ≤ 100 pF

我有个血的教训:一次项目里,总线长度超过30cm,电容大概到了150pF,我偷懒用了10kΩ上拉。结果在250kHz下通信时好时坏,用示波器一看,SDA上升沿接近1µs,SCL高电平时间根本不够。换成了2.2kΩ后立竿见影。

⚠️ 避坑指南:我曾经在一块四层板上一口气挂了8个I2C从机,总线上拉电阻用了4.7kΩ,结果高频通信时从机地址一直NACK,排查了两天才发现是上拉电阻太大导致上升沿太慢,从机来不及采样。最后换成1.5kΩ,问题解决。记住:总线电容越大,电阻要越小。

2.3 电气参数:别让电平杀手搞垮通信

I2C的电气参数其实很宽松,但有几个关键值必须记牢。我习惯把它们分成三类:输入电平、输出电平和时序指标。

2.3.1 输入电平阈值

所有I2C器件必须兼容以下电压标准(参考I2C规范V7.0):

  • 低电平输入电压 VIL:最大 0.3 × VDD
  • 高电平输入电压 VIH:最小 0.7 × VDD
  • 迟滞(施密特触发输入):通常 ≥ 50 mV

这里有个坑:如果主控是3.3V,从机是5V,那么3.3V输出的高电平(约3.0V)对5V从机来说只有0.6×VDD,小于0.7×VDD(3.5V),从机根本识别不到高电平。怎么办?要么用电平转换芯片,要么确保所有器件共用一个VDD。

2.3.2 输出电平与灌电流

开漏输出拉低时,输出低电平 VOL 必须 ≤ 0.4V(在3mA灌电流下)。这个参数决定了上拉电阻的最小值。你想想,如果电阻太小,灌电流会很大,VOL就可能超过0.4V,总线逻辑就乱套了。

最小上拉电阻计算公式:

R_min = (V_DD - V_OL_max) / I_OL_max
例如 V_DD = 3.3V, V_OL_max = 0.4V, I_OL_max = 3mA
则 R_min = (3.3 - 0.4) / 0.003 ≈ 967 Ω

所以我通常不会把电阻搞到1kΩ以下,除非你确认器件灌电流能力够强。

2.3.3 时序参数(以100kHz标准模式为例)

参数 符号 最小 最大 说明
SCL时钟频率 fSCL - 100 kHz 标准模式上限
保持时间(起始条件) tHD;STA 4.0 µs - SCL低后SDA变化前
低电平时间 tLOW 4.7 µs - SCL低电平持续时间
高电平时间 tHIGH 4.0 µs - SCL高电平持续时间
数据建立时间 tSU;DAT 250 ns - SDA在SCL高前稳定
数据保持时间 tHD;DAT 0 ns 3.45 µs SDA在SCL低后变化
上升时间 tr - 1000 ns SDA/SCL上升沿
下降时间 tf - 300 ns SDA/SCL下降沿

这些时序值在快速模式(400kHz)下会缩短约一个数量级。具体数值可以查芯片数据手册,但上面这些是我做项目时经常要核对的心算基准。

2.4 物理层知识一目了然

下面这张图帮你把本章核心概念串起来:

I2C物理层知识结构 I2C物理层核心要素 SDA 串行数据线 双向开漏,双向传输 SCL 串行时钟线 主机产生时钟,从机可拉伸 上拉电阻 Rₚ 决定上升沿速度与功耗 输入/输出电平 Vₜₕ 阈值 · Vₒₗ 灌电流 时序参数 tₗₒw · tₕᵢgₕ · tᵣ · tₕₙₒₗₒ 总线电容 Cₚ ≤ 100/200/400 pF 物理层设计不当 → 通信失败 上拉电阻 + 电容 + 时序 = 信号完整性

✔️ 核心要点回顾:

  • SDA与SCL都是开漏输出,必须外接上拉电阻才能产生高电平。
  • 上拉电阻的取值由总电容和目标速率共同决定:电容大、速率快,电阻就得小。
  • 电气参数重点关注VIH/VIL阈值和时序的上升/下降时间,这些直接影响通信可靠性。
  • 总线电容的影响经常被忽略,但它是导致“间歇性通信失败”的头号嫌疑犯。