2. I2C协议时序:起始条件、停止条件、数据有效性、字节传输格式、ACK/NACK机制

I2C(Inter-Integrated Circuit)总线是一种由飞利浦公司(现恩智浦半导体)开发的两线式串行通信协议,广泛应用于音频Codec、传感器、存储器等外设的寄存器配置。理解其底层时序是进行硬件调试和驱动开发的基础。本章将详细拆解I2C协议的五个核心时序要素。

2.1 协议概述与信号线

I2C总线仅使用两条双向信号线:

  • SCL(Serial Clock):串行时钟线,由主设备(Master)驱动,用于同步数据传输。
  • SDA(Serial Data):串行数据线,用于在主设备和从设备(Slave)之间传输地址和数据。

两条线均通过上拉电阻连接到电源电压(VDD)。当总线空闲时,SCL和SDA都处于高电平状态。

2.2 起始条件(START Condition)与停止条件(STOP Condition)

每次I2C通信都以一个起始条件开始,以一个停止条件结束。这两个条件是唯一允许SDA线在SCL线为高电平时发生变化的时刻。

条件 时序定义 示意图描述
起始条件(S) SCL为高电平时,SDA从高电平切换到低电平。 SDA下降沿发生在SCL高电平期间。
停止条件(P) SCL为高电平时,SDA从低电平切换到高电平。 SDA上升沿发生在SCL高电平期间。
调试要点: 使用逻辑分析仪抓取波形时,首先确认起始条件和停止条件的边沿是否清晰、无毛刺。如果起始条件无法被从设备识别,后续所有通信都将失败。常见原因是SCL或SDA线上的上拉电阻阻值过大或过小,导致边沿斜率异常。
I2C 起始条件与停止条件时序图 I2C 起始条件与停止条件时序 SCL SDA 起始条件 (S) SDA下降沿,SCL高 停止条件 (P) SDA上升沿,SCL高 数据有效 数据有效 数据有效 数据有效

2.3 数据有效性(Data Validity)

I2C协议规定,在数据传输过程中,SDA线上的数据必须在SCL时钟的高电平期间保持稳定。数据的变化(即SDA的上升沿或下降沿)只能在SCL为低电平时发生。

  • SCL高电平期间:SDA必须保持稳定,此时数据被从设备采样。
  • SCL低电平期间:允许SDA变化,主设备或从设备可以在此阶段准备下一个数据位。
常见错误: 在调试音频Codec时,如果发现寄存器写入的值与预期不符,很可能是数据建立时间(tSU;DAT)或保持时间(tHD;DAT)不满足从设备的数据手册要求。务必检查MCU的I2C时序配置参数。

2.4 字节传输格式与帧结构

I2C总线上的数据传输以字节(8位)为单位。每个字节传输后,必须跟随一个应答位(ACK/NACK)。完整的I2C通信帧结构如下:

  1. 起始条件(S):主设备产生起始条件。
  2. 从设备地址(7位或10位):主设备发送要通信的从设备地址。
  3. 读/写位(R/W):第8位,0表示写操作,1表示读操作。
  4. 应答位(ACK):从设备在第9个SCL周期拉低SDA,表示确认收到地址。
  5. 数据字节(8位):根据操作类型,主设备或从设备发送数据。
  6. 应答位(ACK/NACK):接收方在第9个SCL周期给出应答。
  7. 停止条件(P):主设备产生停止条件,结束通信。
帧段 位数 方向 说明
S 1 主→从 起始条件
Slave Address 7 主→从 从设备地址(如音频Codec的地址0x1A)
R/W 1 主→从 0=写,1=读
ACK 1 从→主 从设备应答
Data Byte 1 8 主↔从 第一个数据字节(如寄存器地址或数据)
ACK 1 接收方→发送方 应答位
... ... ... 后续数据字节
P 1 主→从 停止条件

2.5 ACK/NACK 机制

应答机制是I2C协议可靠性的核心。每个字节(包括地址字节和数据字节)传输完成后,接收方必须在第9个SCL时钟周期内产生一个应答位。

  • ACK(Acknowledge,应答):接收方在第9个SCL周期将SDA线拉低,表示“已收到,请继续发送”。
  • NACK(Not Acknowledge,非应答):接收方在第9个SCL周期保持SDA线为高电平,表示“未成功接收”或“传输结束”。
NACK的常见场景:
  • 地址NACK:总线上不存在该地址的从设备,或从设备忙。这是调试中最常见的错误。
  • 数据NACK:在读操作中,主设备在最后一个字节后发送NACK,通知从设备停止发送。
  • 写操作NACK:从设备无法处理接收到的数据(如寄存器写保护或无效地址)。
I2C 完整字节传输与 ACK/NACK 时序 I2C 字节传输与 ACK/NACK 时序 SCL SDA S A6 A5 A4 A3 A2 A1 A0 R/W ACK SDA被拉低 数据字节 (8位) D7-D0 ACK SDA被拉低 P

2.6 调试中的时序验证清单

在音频Codec驱动调试中,使用逻辑分析仪或示波器捕获I2C波形时,建议按以下清单逐项检查:

  1. 检查起始条件:确认SDA下降沿发生在SCL高电平期间,且边沿干净。
  2. 检查地址字节:确认发送的7位地址与Codec数据手册一致,且R/W位正确。
  3. 检查地址ACK:在第9个SCL周期,SDA是否被从设备拉低。如果SDA保持高电平,说明从设备未应答。
  4. 检查数据字节:确认数据位在SCL高电平时稳定,且字节顺序正确(通常高位在前)。
  5. 检查数据ACK:每个数据字节后,接收方是否给出ACK。
  6. 检查停止条件:确认SDA上升沿发生在SCL高电平期间。
实战建议: 对于音频Codec,常见的I2C时钟频率为100kHz(标准模式)或400kHz(快速模式)。如果遇到通信不稳定,可以尝试将时钟频率降低到100kHz,排除时序裕量不足的问题。同时,确保SDA和SCL的上拉电阻值在4.7kΩ到10kΩ之间。