第1章:I2C时序参数详解

大家好,我是老张。做嵌入式这些年,I2C总线我调试过不下百次。说实话,很多人觉得I2C简单,不就是两根线嘛。但真正出问题的时候,往往就是时序参数没搞对。今天咱们就好好聊聊这个。

1.1 标准模式(100kHz)的时序要求

标准模式是I2C最基础的工作模式。时钟频率100kHz,这个速度虽然不快,但兼容性最好。我最早接触I2C就是用的这个模式,那时候用的还是51单片机。

先看几个关键参数:

参数 符号 最小值 最大值 单位
SCL时钟频率 fSCL 0 100 kHz
SCL低电平时间 tLOW 4.7 - μs
SCL高电平时间 tHIGH 4.0 - μs
上升时间 tr - 1000 ns
下降时间 tf - 300 ns
数据建立时间 tSU;DAT 250 - ns
数据保持时间 tHD;DAT 0 - ns

嗯,这里要注意。上升时间tr最大允许1μs,这个值其实挺宽松的。但我在项目中遇到过,有些板子走线太长,上拉电阻选得太大,结果上升沿变得很缓,直接超了1μs。通信就时好时坏。

关键点:标准模式下,SCL低电平时间必须≥4.7μs,高电平时间≥4.0μs。这两个时间决定了你的时钟占空比。

1.2 快速模式(400kHz)的时序要求

快速模式把频率提到了400kHz。这个模式现在用得最多。我个人的习惯是,只要器件支持,优先用快速模式。为什么呢?因为很多传感器、ADC在400kHz下才能发挥出应有的数据吞吐量。

快速模式的时序参数明显更严格了:

参数 符号 最小值 最大值 单位
SCL时钟频率 fSCL 0 400 kHz
SCL低电平时间 tLOW 1.3 - μs
SCL高电平时间 tHIGH 0.6 - μs
上升时间 tr - 300 ns
下降时间 tf - 300 ns
数据建立时间 tSU;DAT 100 - ns
数据保持时间 tHD;DAT 0 0.9 μs

看到没?上升时间从1μs降到了300ns。这意味着什么?你想想看,如果你的上拉电阻还是用10kΩ,总线电容稍微大一点,上升沿就很可能超时。

我的经验:快速模式下,上拉电阻我一般选2.2kΩ到4.7kΩ。具体要看总线电容。如果挂的器件多,走线长,就选小一点的电阻。但也不能太小,否则功耗会上去。

还有一个容易被忽略的点——数据保持时间tHD;DAT。快速模式下它有了上限,最大0.9μs。我曾经在一个项目里,主控芯片的I2C外设在发送数据后,SDA保持时间太长,结果从机在下一个时钟沿采样时读到了错误数据。查了两天才找到原因。

1.3 高速模式(3.4MHz)的时序要求

高速模式,3.4MHz。说实话,这个模式我用的不多。为什么?因为它对硬件的要求太高了。一般只有高端传感器、图像传感器、或者需要大量数据传输的场景才会用到。

先看参数:

参数 符号 最小值 最大值 单位
SCL时钟频率 fSCL 0 3.4 MHz
SCL低电平时间 tLOW 160 - ns
SCL高电平时间 tHIGH 60 - ns
上升时间 tr - 160 ns
下降时间 tf - 160 ns
数据建立时间 tSU;DAT 10 - ns
数据保持时间 tHD;DAT 0 70 ns

3.4MHz下,上升时间只有160ns。这已经非常苛刻了。我建议,如果你要用高速模式,必须注意以下几点:

  • 上拉电阻要很小——通常用几百欧姆,甚至几十欧姆
  • 总线电容要严格控制——走线尽量短,器件尽量少
  • 需要专用的电流源上拉——普通电阻上拉很难满足要求
  • 从机必须支持高速模式——不是所有I2C器件都支持

警告:高速模式下,数据建立时间只有10ns!这意味着你的主控必须在SCL上升沿之前10ns就把数据准备好。很多MCU的I2C外设根本达不到这个要求。我建议,除非你非常确定硬件支持,否则别轻易上3.4MHz。

1.4 关键参数对比与避坑指南

三种模式放在一起对比,差异就很明显了:

参数 标准模式 快速模式 高速模式
频率 100kHz 400kHz 3.4MHz
上升时间 ≤1000ns ≤300ns ≤160ns
建立时间 ≥250ns ≥100ns ≥10ns
上拉电阻典型值 4.7kΩ~10kΩ 2.2kΩ~4.7kΩ 几十Ω~几百Ω

这里我分享几个避坑经验:

  • 我曾经在一个项目里,标准模式跑得好好的,换成快速模式就出错了。查了半天,发现是上拉电阻没换。换成2.2kΩ后问题解决。
  • 我曾经遇到过从机手册上写支持400kHz,但实际只能跑到300kHz。后来发现是那个批次的芯片有bug。所以,别完全相信手册,实际测试才是王道。
  • 我个人习惯是在设计时留有余量。比如快速模式要求上升时间≤300ns,我会尽量做到200ns以内。这样即使温度变化、器件老化,系统也能稳定工作。

总结一下:时序参数是I2C通信的命根子。上升时间、下降时间、建立时间、保持时间,这四个参数你必须在示波器上亲眼看到、亲手测过,才算真正理解。下一章我会教大家怎么用示波器抓I2C波形,到时候咱们再细聊。

好了,今天就到这里。有什么问题欢迎交流。记住,调试I2C时,先看时序,再看协议。时序对了,问题就解决了一半。