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线上的上拉电阻阻值过大或过小,导致边沿斜率异常。
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通信帧结构如下:
- 起始条件(S):主设备产生起始条件。
- 从设备地址(7位或10位):主设备发送要通信的从设备地址。
- 读/写位(R/W):第8位,0表示写操作,1表示读操作。
- 应答位(ACK):从设备在第9个SCL周期拉低SDA,表示确认收到地址。
- 数据字节(8位):根据操作类型,主设备或从设备发送数据。
- 应答位(ACK/NACK):接收方在第9个SCL周期给出应答。
- 停止条件(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:从设备无法处理接收到的数据(如寄存器写保护或无效地址)。
2.6 调试中的时序验证清单
在音频Codec驱动调试中,使用逻辑分析仪或示波器捕获I2C波形时,建议按以下清单逐项检查:
- 检查起始条件:确认SDA下降沿发生在SCL高电平期间,且边沿干净。
- 检查地址字节:确认发送的7位地址与Codec数据手册一致,且R/W位正确。
- 检查地址ACK:在第9个SCL周期,SDA是否被从设备拉低。如果SDA保持高电平,说明从设备未应答。
- 检查数据字节:确认数据位在SCL高电平时稳定,且字节顺序正确(通常高位在前)。
- 检查数据ACK:每个数据字节后,接收方是否给出ACK。
- 检查停止条件:确认SDA上升沿发生在SCL高电平期间。
实战建议: 对于音频Codec,常见的I2C时钟频率为100kHz(标准模式)或400kHz(快速模式)。如果遇到通信不稳定,可以尝试将时钟频率降低到100kHz,排除时序裕量不足的问题。同时,确保SDA和SCL的上拉电阻值在4.7kΩ到10kΩ之间。