2. I2C 时序分析:SCL 与 SDA 的时序关系、标准模式/快速模式/高速模式区别、上拉电阻选择
2.1 SCL 与 SDA 的时序关系
I2C 只有两根线:SCL(时钟)和 SDA(数据)。你想想看,所有通信都靠这两根线完成。我个人习惯把 SCL 看成指挥棒,SDA 是跟着节奏跳舞的人。
空闲时,两根线都是高电平。为啥?因为总线是开漏输出,全靠外部上拉电阻拉高。一旦开始传输,SCL 产生时钟脉冲,SDA 在 SCL 低电平时改变数据,在 SCL 高电平时保持稳定。嗯,这里要注意:数据只能在 SCL 低电平时变化,高电平时读取。这个规则一旦搞错,总线就乱套了。
起始条件和停止条件呢?
- 起始条件:SCL 高电平时,SDA 由高变低。
- 停止条件:SCL 高电平时,SDA 由低变高。
我在项目中遇到过有人把起始和停止的边沿搞反,结果主设备和从设备永远对不上话。这里分享一个诀窍:记住“高电平跳变”这个关键词——起始和停止都发生在 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 错。换了个小上拉电阻,波形立竿见影。
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Ω
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(开漏,特殊引脚) |
说到 DMA 和 I2C 配合,时序的知识是地基。你在配置 I2C 时,无论用寄存器还是 HAL 库,心里要清楚:你设置的时钟分频系数、上升时间过滤寄存器,说到底都是在跟 SCL 和 SDA 的物理波形打交道。底层的时序如果敲定了,上层 DMA 搬运数据就是个流水线活。嗯,本章就聊到这儿,接下来咱们直接上手 DMA 配置。