2. I2C时序分析:标准模式、快速模式与高速模式

I2C的时序,说白了就是一根时钟线(SCL)和一根数据线(SDA)怎么配合干活。很多新手拿到逻辑分析仪,看到波形就懵了——这高低起伏的到底在说什么?

我刚开始调I2C时也犯过这毛病。有一次板子上的传感器死活不响应,抓了波形一看,SCL的上升沿太缓了,从0.7V到1.5V磨蹭了快1微秒。嗯,后来换了强上拉电阻才搞定。

这一节我们就拿逻辑分析仪,把标准模式、快速模式、高速模式的时序参数一个一个拆开看。

2.1 三种模式的核心参数对比

先上一张参数表。这是I2C规范里最关键的几个数字,我建议你打印出来贴在工位上。

参数 符号 标准模式 (100kHz) 快速模式 (400kHz) 高速模式 (3.4MHz)
SCL时钟频率 fSCL 100 kHz 400 kHz 3.4 MHz
SCL低电平时间 tLOW ≥ 4.7 μs ≥ 1.3 μs ≥ 160 ns
SCL高电平时间 tHIGH ≥ 4.0 μs ≥ 0.6 μs ≥ 60 ns
上升时间 tr ≤ 1000 ns ≤ 300 ns ≤ 160 ns
下降时间 tf ≤ 300 ns ≤ 300 ns ≤ 160 ns
数据建立时间 tSU;DAT ≥ 250 ns ≥ 100 ns ≥ 10 ns
数据保持时间 tHD;DAT ≥ 0 ns ≥ 0 ns ≥ 0 ns

核心要点:频率越高,时序窗口越窄。快速模式比标准模式快了4倍,但建立时间窗口缩了2.5倍。高速模式更是把上升时间压到了160ns以内——这对PCB走线和上拉电阻都是考验。

2.2 用逻辑分析仪抓一个完整的I2C帧

我们拿一个实际波形来说话。假设你抓到了一段I2C通信,逻辑分析仪上显示的是SCL和SDA两路信号。怎么读?

我个人习惯按这个顺序看:

  1. 看起始条件:SCL高电平时,SDA从高跳低。这是通信开始的标志。
  2. 看地址字节:SCL每来一个脉冲,SDA上就有一位数据。先发7位地址,再发1位读写位。
  3. 看应答位:第9个SCL脉冲时,SDA被从机拉低——说明从机收到了。
  4. 看数据字节:重复上面的过程,每8位数据跟一个应答位。
  5. 看停止条件:SCL高电平时,SDA从低跳高。通信结束。

你想想看,如果逻辑分析仪上SDA一直高,或者应答位没被拉低,那八成是从机没响应。我曾经遇到一个案例,地址写对了,但从机就是不应答——后来发现是它的VDD没供上电。

2.3 标准模式 vs 快速模式:波形上的差异

标准模式和快速模式在波形上最直观的区别是什么?

  • SCL脉冲宽度:标准模式下tLOW是4.7μs,快速模式只有1.3μs。你用逻辑分析仪的测量光标一量就清楚。
  • 上升沿斜率:快速模式的上升时间要求更严(≤300ns),波形更陡。如果看到上升沿拖了个长尾巴,说明上拉电阻太大了。
  • 总线空闲时间:标准模式要求停止条件和下一个起始条件之间至少有4.7μs的空闲,快速模式只要1.3μs。

调试技巧:如果你不确定当前跑的是哪种模式,直接量SCL的周期。周期10μs是100kHz,周期2.5μs是400kHz。逻辑分析仪上一般都有频率测量功能,点一下就行。

2.4 高速模式(Hs-mode)的特殊之处

高速模式跟前面两种模式有个本质区别——它用了电流源上拉,而不是普通的上拉电阻。

为什么?因为3.4MHz下,RC充放电根本来不及。普通上拉电阻在这么高的频率下,上升沿会变得很缓,时序直接超标。

高速模式的工作流程是这样的:

  1. 主机先以快速模式发送一个主从码(00001XXX),告诉总线我要切高速了。
  2. 从机收到这个码后,开启内部的电流源上拉电路。
  3. 主机把SCL频率提升到3.4MHz,开始高速传输。
  4. 传输结束后,主机发停止条件,总线回到快速模式。

我记得第一次调高速模式时,逻辑分析仪上波形乱成一团。后来发现是PCB走线太长,寄生电容太大,电流源上拉都拉不动。嗯,那之后我画板子就记住了:高速I2C的走线不要超过10cm。

2.5 时序参数与上拉电阻的关系

上拉电阻的选择直接影响上升时间。公式很简单:

t_r ≈ 0.847 × R_p × C_b

其中Rp是上拉电阻,Cb是总线电容(包括走线电容和引脚电容)。

举个例子:

  • 标准模式:Cb = 200pF,要求tr ≤ 1000ns → Rp ≤ 5.9kΩ
  • 快速模式:Cb = 200pF,要求tr ≤ 300ns → Rp ≤ 1.77kΩ
  • 高速模式:Cb = 100pF,要求tr ≤ 160ns → Rp ≤ 1.89kΩ(但实际用电流源)

注意:上拉电阻也不是越小越好。电阻太小,低电平时的灌电流会很大,可能超出器件的IOL规格。一般快速模式用2.2kΩ~4.7kΩ比较稳妥。

2.6 用逻辑分析仪排查时序故障

实战中,我总结了一套排查流程:

  1. 抓波形,看起始条件:SDA的下降沿是否干净?如果有毛刺,可能是上拉电阻太小或走线串扰。
  2. 量SCL的占空比:理想情况是50%。如果tLOW明显偏短,说明主机的时钟分频配置有问题。
  3. 看数据建立时间:在SCL上升沿之前,SDA上的数据是否已经稳定?如果建立时间不够,从机可能采到错误数据。
  4. 检查应答位:第9个SCL脉冲时,SDA是否被拉低?如果没有,从机没响应——检查地址、供电、或者从机是否处于复位状态。
  5. 看停止条件后的总线状态:SDA和SCL是否都回到高电平?如果有一根线被拉低,总线被锁死了。

我曾经遇到一个很隐蔽的问题:快速模式下偶尔通信失败,逻辑分析仪上波形看起来都正常。后来用示波器一看,发现SDA的下降沿后面跟了一个小回勾——原来是驱动能力不够,从机释放总线时SDA没完全拉高。换了个驱动能力更强的MCU引脚就解决了。

2.7 I2C时序知识结构图

下面这张图把三种模式的时序关系、关键参数和调试要点串在了一起。你可以把它当作一个快速参考。

I2C时序知识结构图 I2C时序知识结构图 标准模式 100kHz 快速模式 400kHz 高速模式 3.4MHz 关键时序参数 • tLOW ≥ 4.7μs • tHIGH ≥ 4.0μs • tr ≤ 1000ns • tSU;DAT ≥ 250ns 关键时序参数 • tLOW ≥ 1.3μs • tHIGH ≥ 0.6μs • tr ≤ 300ns • tSU;DAT ≥ 100ns 关键时序参数 • tLOW ≥ 160ns • tHIGH ≥ 60ns • tr ≤ 160ns • tSU;DAT ≥ 10ns 逻辑分析仪调试要点 ① 检查起始/停止条件边沿 ② 测量SCL占空比 ③ 验证数据建立时间 ④ 确认应答位 ⑤ 检查总线释放状态 上拉电阻选择:Rp = tr / (0.847 × Cb) 标准模式:≤5.9kΩ | 快速模式:≤1.77kΩ | 高速模式:电流源上拉

2.8 实战建议:逻辑分析仪的设置

最后聊几句工具设置。我常用的逻辑分析仪采样率是这样配的:

  • 标准模式:采样率 ≥ 1MHz(10倍于SCL频率)
  • 快速模式:采样率 ≥ 4MHz
  • 高速模式:采样率 ≥ 34MHz

采样率太低的话,上升沿和下降沿的细节抓不到,时序参数量不准。我见过有人用200kHz的采样率去抓400kHz的I2C,出来的波形跟锯齿一样——那根本没法分析。

触发设置方面,我建议设成下降沿触发,触发通道选SDA。这样每次通信一开始,逻辑分析仪就自动开始抓,不会漏掉起始条件。

一个小技巧:抓完波形后,先把SCL和SDA的电压阈值设对。TTL电平一般是1.5V,但有些I2C器件是1.8V或3.3V的。阈值设错了,逻辑分析仪会把高电平判成低电平,波形全乱套。