3. I2C时序参数详解:SCL时钟频率、上升时间与下降时间、数据建立时间与保持时间、总线电容与上拉电阻计算

各位好,我是老周。今天咱们来聊聊I2C时序参数。说实话,这章是I2C调试中最容易翻车的地方。我见过太多工程师,原理图画得漂漂亮亮,板子一回来死活不通,最后发现是时序参数没算对。嗯,咱们今天就把这些参数掰开揉碎了讲清楚。

3.1 SCL时钟频率——总线的“心跳”

SCL时钟频率,说白了就是I2C总线每秒能跑多少个时钟周期。标准模式100kHz,快速模式400kHz,高速模式3.4MHz。你可能会问:“是不是频率越高越好?”

我个人习惯是:能用低速就别用高速。为什么?因为频率越高,对PCB走线、上拉电阻、从设备响应时间的要求就越苛刻。我在一个项目中遇到过,把400kHz的I2C总线拉到1MHz,结果数据时不时就错一位。查了两天才发现,是某个从设备的输入缓冲跟不上。

关键点:SCL频率由主设备产生,但实际能跑多快,取决于总线上最慢的那个设备。

实际项目中,我一般这样选频率:

  • 板内通信(走线<10cm):400kHz没问题
  • 板间通信(走线>10cm):先试100kHz,稳定再提频
  • 有长线缆或连接器:老老实实100kHz

3.2 上升时间与下降时间——边沿的“陡峭度”

上升时间(tr)是指SCL或SDA从0.3VDD上升到0.7VDD的时间。下降时间(tf)则相反。这两个参数直接影响你能跑多快。

你想想看,如果上升时间太长,SCL的高电平还没稳定,下一个时钟沿就来了——数据肯定错。I2C规范对这两个时间有明确限制:

模式 最大上升时间 (tr) 最大下降时间 (tf)
标准模式 (100kHz) 1000 ns 300 ns
快速模式 (400kHz) 300 ns 300 ns
高速模式 (3.4MHz) 160 ns 160 ns

我曾经调试一块板子,SCL的上升时间测出来有500ns,但跑的是400kHz。算一下:400kHz的周期是2500ns,高电平时间约1250ns。上升时间500ns占了高电平的40%!这数据能稳定才怪。后来把上拉电阻从10kΩ换到4.7kΩ,问题解决。

小技巧:用示波器看SCL和SDA的边沿。如果上升沿像“斜坡”而不是“陡坡”,说明上拉电阻太大了。

3.3 数据建立时间与保持时间——数据的“窗口”

建立时间(tSU)和保持时间(tHD)是I2C时序中最容易被忽视的参数。简单说:

  • 建立时间:SCL时钟沿到来前,数据必须提前稳定下来的时间
  • 保持时间:SCL时钟沿到来后,数据必须继续保持稳定的时间

说白了,数据必须在时钟沿前后“乖乖待着”,不能乱跳。I2C规范要求:

参数 标准模式 快速模式
数据建立时间 (tSU;DAT) ≥ 250 ns ≥ 100 ns
数据保持时间 (tHD;DAT) ≥ 0 ns ≥ 0 ns

注意看,保持时间只要≥0ns就行。这意味着数据可以在时钟沿的瞬间变化?理论上可以,但实际中我建议留点余量。我曾经用某款MCU的硬件I2C外设,它的保持时间只有5ns,结果接了一个慢速从设备,数据老是丢。后来在软件里加了几个NOP延时,才稳定下来。

警告:不要卡着规范的最小值设计。留20%-30%的余量,能省去很多调试时间。

3.4 总线电容与上拉电阻计算——物理层的“命门”

这是I2C设计中最核心的计算。总线电容(Cb)包括:

  • 每个IC引脚的输入电容(约5-10pF)
  • PCB走线的寄生电容(约1pF/cm)
  • 连接器、过孔等杂散电容

上拉电阻(Rp)的选择,本质上是在功耗和速度之间找平衡。电阻太小,功耗大;电阻太大,上升时间慢。

计算公式很简单:

Rp(min) = (VDD - VOL(max)) / IOL

Rp(max) = tr(max) / (0.8473 × Cb)

其中:

  • VDD:总线电压(通常是3.3V或5V)
  • VOL(max):输出低电平最大值(通常0.4V)
  • IOL:输出低电平电流(通常3mA)
  • tr(max):允许的最大上升时间
  • Cb:总线总电容

举个例子:3.3V系统,总电容50pF,跑400kHz:

Rp(min) = (3.3 - 0.4) / 0.003 = 967Ω
Rp(max) = 300ns / (0.8473 × 50pF) ≈ 7.08kΩ

所以上拉电阻选2.2kΩ到4.7kΩ比较合适。我个人习惯先选4.7kΩ,如果上升时间太长再换小。

经验之谈:如果总线上挂了很多设备(比如4-5个),总线电容很容易超过100pF。这时候4.7kΩ可能就不够用了,得换2.2kΩ甚至1kΩ。

3.5 知识体系总览

下面这张图把本章的知识点串起来了,方便你理解各个参数之间的关系:

I2C时序参数知识体系 I2C时序参数 SCL时钟频率 上升/下降时间 建立/保持时间 总线电容与上拉电阻 标准/快速/高速 影响最大通信速率 数据稳定窗口 Rp(min) = (VDD - VOL) / IOL Rp(max) = tr / (0.8473 × Cb) 核心:在功耗与速度之间找到平衡点

3.6 避坑指南——我踩过的那些坑

做I2C设计这么多年,我总结了几条血泪教训:

  • 别信datasheet上的“典型值”:我曾经按某款传感器的datasheet推荐值选了上拉电阻,结果死活不通。后来发现它推荐的4.7kΩ是在总线上只挂一个设备的前提下。我挂了三个,电容翻倍,上升时间超标。
  • 长走线一定要算电容:PCB走线每厘米约1pF。如果从板子一头走到另一头,30cm就是30pF。再加上IC引脚电容,轻松超过100pF。
  • 高速模式别用面包板:面包板的寄生电容和电感会让信号惨不忍睹。400kHz以上,老老实实画PCB。
  • 示波器探头也有电容:普通探头约10-15pF。测高频I2C时,探头本身就会改变总线特性。我习惯用有源探头或低电容探头。

我的调试流程:先测SCL和SDA的上升时间 → 算实际总线电容 → 核对上拉电阻是否合适 → 看建立/保持时间是否满足 → 最后调频率。按这个顺序,90%的I2C问题都能找到根因。

好了,时序参数这块就聊到这儿。记住一句话:I2C的物理层设计,就是算好上拉电阻和总线电容的账。账算清楚了,剩下的就是软件的事了。


公众号:蓝海资料掘金营,微信deep3321