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两路信号。怎么读?
我个人习惯按这个顺序看:
- 看起始条件:SCL高电平时,SDA从高跳低。这是通信开始的标志。
- 看地址字节:SCL每来一个脉冲,SDA上就有一位数据。先发7位地址,再发1位读写位。
- 看应答位:第9个SCL脉冲时,SDA被从机拉低——说明从机收到了。
- 看数据字节:重复上面的过程,每8位数据跟一个应答位。
- 看停止条件: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充放电根本来不及。普通上拉电阻在这么高的频率下,上升沿会变得很缓,时序直接超标。
高速模式的工作流程是这样的:
- 主机先以快速模式发送一个主从码(00001XXX),告诉总线我要切高速了。
- 从机收到这个码后,开启内部的电流源上拉电路。
- 主机把SCL频率提升到3.4MHz,开始高速传输。
- 传输结束后,主机发停止条件,总线回到快速模式。
我记得第一次调高速模式时,逻辑分析仪上波形乱成一团。后来发现是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 用逻辑分析仪排查时序故障
实战中,我总结了一套排查流程:
- 抓波形,看起始条件:SDA的下降沿是否干净?如果有毛刺,可能是上拉电阻太小或走线串扰。
- 量SCL的占空比:理想情况是50%。如果tLOW明显偏短,说明主机的时钟分频配置有问题。
- 看数据建立时间:在SCL上升沿之前,SDA上的数据是否已经稳定?如果建立时间不够,从机可能采到错误数据。
- 检查应答位:第9个SCL脉冲时,SDA是否被拉低?如果没有,从机没响应——检查地址、供电、或者从机是否处于复位状态。
- 看停止条件后的总线状态:SDA和SCL是否都回到高电平?如果有一根线被拉低,总线被锁死了。
我曾经遇到一个很隐蔽的问题:快速模式下偶尔通信失败,逻辑分析仪上波形看起来都正常。后来用示波器一看,发现SDA的下降沿后面跟了一个小回勾——原来是驱动能力不够,从机释放总线时SDA没完全拉高。换了个驱动能力更强的MCU引脚就解决了。
2.7 I2C时序知识结构图
下面这张图把三种模式的时序关系、关键参数和调试要点串在了一起。你可以把它当作一个快速参考。
2.8 实战建议:逻辑分析仪的设置
最后聊几句工具设置。我常用的逻辑分析仪采样率是这样配的:
- 标准模式:采样率 ≥ 1MHz(10倍于SCL频率)
- 快速模式:采样率 ≥ 4MHz
- 高速模式:采样率 ≥ 34MHz
采样率太低的话,上升沿和下降沿的细节抓不到,时序参数量不准。我见过有人用200kHz的采样率去抓400kHz的I2C,出来的波形跟锯齿一样——那根本没法分析。
触发设置方面,我建议设成下降沿触发,触发通道选SDA。这样每次通信一开始,逻辑分析仪就自动开始抓,不会漏掉起始条件。
一个小技巧:抓完波形后,先把SCL和SDA的电压阈值设对。TTL电平一般是1.5V,但有些I2C器件是1.8V或3.3V的。阈值设错了,逻辑分析仪会把高电平判成低电平,波形全乱套。