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,表示不再需要数据了。
注意: 应答位是接收方驱动的!很多新手分析波形时,看到第9个时钟SDA低,误以为主控器拉的。其实主控器在第9个时钟前会释放SDA线(通过开漏输出变为输入),由从机拉低。如果上拉电阻有问题,应答位可能无法被正确识别——我吃过这个亏。

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构成一帧,非常直观。

I2C总线帧结构图(写操作示例) START 7位地址 (0x68) W (0) ACK 数据 (0x55) ACK STOP SCL在第9个脉冲 时检查SDA的电平 读操作时最后发NACK+STOP 主控器释放总线 SCL波形示意: 高电平 第1~8脉冲(地址+写) 第9脉冲(应答)

4.5 常见波形失真判断——一眼看穿问题

实际总线上波形不会像教科书那么干净。逻辑分析仪的采样点有限,加上信号反射、振铃、上升沿过缓,都可能造成误判。我整理了几个现场常见的“假信号”特征,你可以对照排查:

  • 毛刺出现在SCL高电平期间: 很可能是地反弹或串扰,容易误触发起始/停止条件。
  • 应答位SDA半高: 上拉电阻太大,从机驱动能力弱,SDA没能拉到GND。我曾经用4.7kΩ上拉遇到这个问题,换成2.2kΩ就好了。
  • 起始条件前SDA已经低: 前面停止条件没发完整,或总线被某设备锁住。检查停止条件波形是否干净。
  • 数据位采样不稳定: SCL抖动或占空比失衡,常见于电容负载过大。测一下总线上升/下降时间,超过300ns就要警惕了。
我的经验: 遇到奇怪的I2C通信失败,别急着改软件。先用逻辑分析仪把起始、地址、应答三个点抓到,90%的问题都能定位。如果波形看起来都对但通信还是失败,十有八九是时序违规——比如SCL高电平保持时间不够。这时候就得看示波器了。

好了,以上就是I2C波形解析的核心方法。记住:起始位是下降沿,停止位是上升沿,地址字节后紧接读写位,每个字节后跟一个应答位。掌握了这些,你再去看逻辑分析仪的波形,就像读乐谱一样清晰。