4. I2C波形解析:识别起始/停止位、地址方向、数据字节与应答
拿到逻辑分析仪的捕获数据,满屏幕的高低电平,怎么看出门道?很多人一上来就盯着SCL和SDA的边沿数,结果越看越晕。我的习惯是:先找到“通信的起点和终点”,然后再拆中间的内容。说白了,I2C的波形很有规律,你只需要学会识别那几个关键结构——起始条件、停止条件、地址方向、数据字节、应答位。把这五个识准了,绝大部分I2C通信问题都能定位到。
4.1 起始条件与停止条件——通信的“开关”
I2C协议规定,SCL为高电平时SDA从高跳变到低,就是起始条件(START);SCL为高时SDA从低跳变到高,就是停止条件(STOP)。我刚开始用逻辑分析仪时,老搞混这两者的区别——都是SCL高电平下SDA跳变,一个下降沿一个上升沿。后来我记住一个诀窍:“下降起始,上升停止”。
| 条件 | SCL电平 | SDA跳变方向 | 典型波形特征 |
|---|---|---|---|
| 起始条件(START) | 高 | 下降沿 | SDA先变低,随后SCL变低 |
| 重复起始条件(RESTART) | 高 | 下降沿 | 之前未发STOP,SDA再次下降 |
| 停止条件(STOP) | 高 | 上升沿 | SDA先变高,随后SCL保持高 |
4.2 地址字节与读写方向——谁是主谁是从
起始条件之后,主控器会发送7位设备地址(或10位地址的第一字节),紧跟着1位读写方向位。这个地址字节一共8位,先发MSB(高位)再发LSB。读写方向位:0表示主控器要写(发送数据),1表示主控器要读(接收数据)。
我曾在项目里遇到过地址认错的问题。示波器抓出来的波形看着没问题,但从机就是不回应。后来我用逻辑分析仪的“协议解析”功能一看——原来我把7位地址的左对齐和右对齐搞混了。这里要提醒大家:很多数据手册里的地址是7位值,但在总线上传输时,这7位放在高7位,最低位是读写位。比如设备地址0x50(二进制1010000),实际发送的字节是1010000 + R/W = 0xA0或0xA1。
4.3 数据字节与应答/非应答——握手信号
每个数据字节(地址字节也算数据)发送完后,接收方必须在第9个SCL脉冲期间拉低SDA表示应答(ACK),若SDA保持高则是非应答(NACK)。这是I2C协议的硬性握手,没有应答就等于通信没成功。
- ACK: 第9个SCL高电平时SDA为低。常见于正常传输。
- NACK: 第9个SCL高电平时SDA为高。原因可能是设备不存在、地址不对、或从机无法继续接收/发送。
- 特殊情况: 主控器在读操作最后发NACK,然后发STOP,表示不再需要数据了。
4.4 实战波形逐帧拆解
下面我用一个完整的I2C写操作波形来演示。这是一个7位地址0x68(即1101000),写方向(R/W=0),发送两个数据字节0x55和0xAA的例子。
SCL: __--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__
SDA: \______/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
START A6 A5 A4 A3 A2 A1 A0 W ACK D7 D6 D5 D4 D3 D2 D1 D0 ACK D7...STOP
你看,其实只要把SDA的变化和SCL的每个上升沿对齐,逐位读出来就行。我个人习惯在逻辑分析仪上添加一条“位序号”注释线,每个SCL上升沿标一个序号,从0到8构成一帧,非常直观。
4.5 常见波形失真判断——一眼看穿问题
实际总线上波形不会像教科书那么干净。逻辑分析仪的采样点有限,加上信号反射、振铃、上升沿过缓,都可能造成误判。我整理了几个现场常见的“假信号”特征,你可以对照排查:
- 毛刺出现在SCL高电平期间: 很可能是地反弹或串扰,容易误触发起始/停止条件。
- 应答位SDA半高: 上拉电阻太大,从机驱动能力弱,SDA没能拉到GND。我曾经用4.7kΩ上拉遇到这个问题,换成2.2kΩ就好了。
- 起始条件前SDA已经低: 前面停止条件没发完整,或总线被某设备锁住。检查停止条件波形是否干净。
- 数据位采样不稳定: SCL抖动或占空比失衡,常见于电容负载过大。测一下总线上升/下降时间,超过300ns就要警惕了。
好了,以上就是I2C波形解析的核心方法。记住:起始位是下降沿,停止位是上升沿,地址字节后紧接读写位,每个字节后跟一个应答位。掌握了这些,你再去看逻辑分析仪的波形,就像读乐谱一样清晰。