2. I2C 时序分析:SCL 与 SDA 的时序关系、标准模式/快速模式/高速模式区别、上拉电阻选择

2.1 SCL 与 SDA 的时序关系

I2C 只有两根线:SCL(时钟)和 SDA(数据)。你想想看,所有通信都靠这两根线完成。我个人习惯把 SCL 看成指挥棒,SDA 是跟着节奏跳舞的人。

空闲时,两根线都是高电平。为啥?因为总线是开漏输出,全靠外部上拉电阻拉高。一旦开始传输,SCL 产生时钟脉冲,SDA 在 SCL 低电平时改变数据,在 SCL 高电平时保持稳定。嗯,这里要注意:数据只能在 SCL 低电平时变化,高电平时读取。这个规则一旦搞错,总线就乱套了。

起始条件和停止条件呢?

  • 起始条件:SCL 高电平时,SDA 由高变低。
  • 停止条件:SCL 高电平时,SDA 由低变高。

我在项目中遇到过有人把起始和停止的边沿搞反,结果主设备和从设备永远对不上话。这里分享一个诀窍:记住“高电平跳变”这个关键词——起始和停止都发生在 SCL 高电平期间,只是 SDA 方向相反。

避坑指南:我曾经调试一块传感器板,死活读不到数据,示波器一看——SDA 在 SCL 高电平时跳变了。从设备不认,直接 NAK。后来发现是中断服务程序里改了 SDA 电平,没等 SCL 变低。所以记住:SCL 高,SDA 必须稳。

2.2 标准模式 / 快速模式 / 高速模式区别

I2C 有三种速度档位,我手头常用的是标准模式(100 kHz)和快速模式(400 kHz)。高速模式(3.4 MHz)我仅在高端传感器上用过,要求 PCB 走线很短,上拉电阻也得重算。

模式 最大时钟频率 SCL 低电平时间 (tLOW) SCL 高电平时间 (tHIGH) 上升时间 (tr) 下降时间 (tf)
标准模式 (Sm) 100 kHz ≥4.7 μs ≥4.0 μs ≤1.0 μs ≤0.3 μs
快速模式 (Fm) 400 kHz ≥1.3 μs ≥0.6 μs ≤0.3 μs ≤0.3 μs
快速模式+ (Fm+) 1 MHz ≥0.5 μs ≥0.26 μs ≤0.12 μs ≤0.12 μs
高速模式 (Hs) 3.4 MHz ≥0.16 μs ≥0.16 μs ≤0.16 μs ≤0.16 μs

为什么高速模式要求这么严?你想想看,频率高了,一个时钟周期不到 300 ns,上升时间稍微一长,波形就变成正弦波了,数据没法采。我在做一款摄像头模组时,用了 1 MHz 的 Fm+ 模式,SDA 的上升时间超了 0.2 μs,结果收包总是 CRC 错。换了个小上拉电阻,波形立竿见影。

经验:标准模式对走线长度不敏感,随便飞线都能通。快速模式开始挑 PCB 寄生电容了。高速模式?建议差分走线都考虑进去,我一般不画超过 5 cm 的 I2C 线。

2.3 上拉电阻选择

上拉电阻的大小直接决定上升时间。说白了,Rp 和总线电容 Cb 组成 RC 低通滤波器。阻值太大,波形爬不上去;阻值太小,低电平电流过大,会把从设备的引脚拉坏。

选型公式其实简单:

最小电阻:Rp(min) = (VDD – VOL) / IOL
最大电阻:Rp(max) = tr / (0.8473 × Cb)

我常用 4.7 kΩ 作为标准模式的起点。快速模式换成 2.2 kΩ~3.3 kΩ。如果是 3.4 MHz 的高速模式,我会直接算一下:假设总线电容 50 pF,允许上升时间 0.16 μs,那么最大电阻 = 0.16e-6 / (0.8473 × 50e-12) ≈ 3.8 kΩ。实际会选 1.5 kΩ 留余量。

记一个参考值:
  • 标准模式(100 kHz,1~2 个从设备)→ 4.7 kΩ
  • 快速模式(400 kHz,2~4 个从设备)→ 2.2 kΩ
  • 高速模式(3.4 MHz,仅 1 个从设备)→ 1.0 kΩ
当然,具体数值要根据示波器调。我有一次偷懒用 10 kΩ 跑快速模式,结果上升沿快到 1 μs,从设备干脆不响应。别省这一步。
I2C 时序与模式对比概览 I2C 时序与三种模式对比 基本时序波形 SCL SDA S P SCL低时 SDA变化 SCL高时 采样SDA 三种模式参数 标准模式 100 kHz tLOW≥4.7 μs 快速模式 400 kHz tLOW≥1.3 μs 高速模式 3.4 MHz tLOW≥0.16 μs 上拉电阻推荐 典型值(VDD=3.3V) 标准:4.7 kΩ 快速:2.2 kΩ 高速:1.0 kΩ 选型依据:Rp(max) = tr / (0.8473×Cb) 核心要点 • SCL 高电平时 SDA 必须稳定——这是 I2C 能可靠通信的根本要求。 • 频率越高,时序窗口越窄,上升/下降时间越关键。 • 上拉电阻不是随便选的,用示波器实测上升沿,调到大约 tr ≤ 0.3 × tSCL 就稳了。

2.4 I2C 时序参数速查表

除了频率,还有两个参数容易被忽略:总线电容 Cb 和噪声容限。我习惯在 PCB 布局后估一下总线上挂了多少器件,每个从设备的输入电容大概 5~10 pF,加上走线电容,算个总数,再倒推上拉电阻。

参数 标准模式 100 kHz 快速模式 400 kHz 高速模式 3.4 MHz
总线上限电容 Cb 400 pF 400 pF(实际建议 ≤200 pF) 100 pF
最大从设备数 理论上 127(实际 ≤20) ≤10 ≤3
上拉电阻典型范围 4.7 kΩ ~ 10 kΩ 1.5 kΩ ~ 4.7 kΩ 0.5 kΩ ~ 1.5 kΩ
SCL/SDA 驱动电流 3 mA(开漏) 3 mA(开漏) 20 mA(开漏,特殊引脚)
个人的一个小习惯: 画原理图时,我会在 SCL 和 SDA 上各留一个 0 Ω 电阻位置,方便调试时换不同阻值。量产时再固定为计算好的电阻。你想想看,万一 PCB 加工后电容变了,还能用烙铁救回来。

说到 DMA 和 I2C 配合,时序的知识是地基。你在配置 I2C 时,无论用寄存器还是 HAL 库,心里要清楚:你设置的时钟分频系数、上升时间过滤寄存器,说到底都是在跟 SCL 和 SDA 的物理波形打交道。底层的时序如果敲定了,上层 DMA 搬运数据就是个流水线活。嗯,本章就聊到这儿,接下来咱们直接上手 DMA 配置。