深入解析I2C协议框架与关键时序

2026-01-04 21:52:30

目录

一、协议帧结构的波形

二、完整帧示例波形:

关键时序参数 (Specified by Mode):

关于I2C的硬件介绍请参看:

《I2C的硬件特性与设计要求》

这一篇一起来看看I2C的协议:

一、协议帧结构的波形

起始条件 (START Condition - S):

波形: 当 SCL 线为 高电平 (1) 时,SDA 线发生一个 从高到低 (1 -> 0) 的下降沿。

作用: 表示一次传输的开始。它唤醒所有从设备,准备接收地址。主设备发起。

停止条件 (STOP Condition - P):

波形: 当 SCL 线为 高电平 (1) 时,SDA 线发生一个 从低到高 (0 -> 1) 的上升沿。

作用: 表示一次传输的结束。主设备释放总线(将 SDA 和 SCL 置为高阻态,由上拉电阻拉高)。主设备发起

重复起始条件 (Repeated START Condition - Sr):

波形: 与起始条件 (S) 完全相同 (SCL 高时 SDA 从高到低)。

作用: 在不释放总线(不发送停止条件 P)的情况下,终止当前通信并开始一次新的通信(例如,切换读写方向或寻址另一个从设备)。比先 P 再 S 效率更高。主设备发起。

数据位传输 (Data Bit Transfer):

规则: 数据在 SCL 低电平期间可以变化,在 SCL 高电平期间必须保持稳定。 接收端在 SCL 高电平的中间采样 SDA 的值。

波形:

SCL Low: SDA 线被发送设备驱动为下一个要传输的位 (0 或 1)。

SCL Rising Edge: SDA 线上的数据位被“锁定”。

SCL High: SDA 线 必须保持稳定。接收设备在 SCL 高电平的中间(或稍后,满足建立/保持时间)采样 SDA 的值。

SCL Falling Edge: 发送设备可以准备下一个数据位(改变 SDA)。

顺序: 数据传输总是 最高位 (MSB) 在前。

应答位 (Acknowledge Bit - ACK):

位置: 紧跟在每个字节(8 位数据)之后,由接收方发送。

波形:

ACK (确认): 发送方(主或从)释放 SDA 线(输出高阻态)。接收方(从或主)在应答时钟脉冲 (ACK 对应的 SCL 高电平)期间 将 SDA 线主动拉低 (0)。这表示接收方成功收到了字节并准备好接收下一个。

NACK (非确认 / Not Acknowledge): 发送方释放 SDA 线。接收方在应答时钟脉冲 (ACK 对应的 SCL 高电平)期间 不拉低 SDA 线,允许上拉电阻将其保持为高 (1)。这表示:

接收方未成功接收字节(例如,校验错)。

接收方无法接收更多数据(例如,缓冲区满)。

主设备在读取最后一个字节后发送 NACK,通知从设备传输即将结束。

寻址时无设备响应。

时序: ACK/NACK 位遵循与数据位相同的时序规则(数据在 SCL 低变,在 SCL 高稳并被采样)。

二、完整帧示例波形:

Start (S): SCL 高时 SDA 下降沿。

地址字节 (7-bit Addr + R/W):

主设备发送 7 位从设备地址 (A6-A0)。

接着发送 1 位方向位 (R/W): 0 表示主设备要写数据到从设备 (Write),1 表示主设备要读数据从从设备 (Read)。

总共 8 位 (1 字节)。

ACK (1): 被寻址的从设备拉低 SDA 作为应答。

数据字节: 根据 R/W 位决定方向:

Write (R/W=0): 主设备发送数据字节 (D7-D0)。

Read (R/W=1): 从设备发送数据字节 (D7-D0)。主设备在 SCL 低时释放 SDA,从设备在 SCL 低时驱动 SDA。

ACK (2): 对于 Write,从设备应答 (拉低 SDA)。对于 Read,主设备在读取最后一个字节后发送 NACK (不拉低 SDA) 通知从设备结束;读取非最后一个字节时,主设备发送 ACK (拉低 SDA) 要求继续发送。

... : 可以传输多个数据字节,每个字节后跟一个 ACK/NACK。

Stop (P): SCL 高时 SDA 上升沿。主设备释放总线。

关键时序参数 (Specified by Mode):

I²C 规范定义了不同速度模式下必须满足的最小/最大时间要求。以下是常见模式的关键参数:

时序参数描述标准模式 (100 kHz)快速模式 (400 kHz)快速模式+ (1 MHz)高速模式 (3.4 MHz)fSCLSCL 时钟频率≤ 100 kHz≤ 400 kHz≤ 1000 kHz≤ 3400 kHztLOWSCL 时钟低电平时间> 4.7 μs> 1.3 μs> 0.5 μs> 0.16 μstHIGHSCL 时钟高电平时间> 4.0 μs> 0.6 μs> 0.26 μs> 0.06 μstSU;STA起始条件建立时间 (SCL 变高到 SDA 变低)> 4.7 μs> 0.6 μs> 0.26 μs> 0.06 μstHD;STA起始条件保持时间 (SDA 变低后 SCL 保持低的时间)> 4.0 μs> 0.6 μs> 0.26 μs> 0.06 μstSU;STO停止条件建立时间 (SCL 变高前 SDA 必须变低的时间)> 4.0 μs> 0.6 μs> 0.26 μs> 0.06 μstSU;DAT数据建立时间 (SCL 上升沿前,SDA 必须稳定的时间)> 250 ns> 100 ns> 50 ns> 10 nstHD;DAT数据保持时间 (SCL 下降沿后,SDA 必须保持稳定的时间)> 0 ns (通常≥0)> 0 ns (通常≥0)> 0 ns (通常≥0)> 0 ns (通常≥0)tBUF停止到起始时间 (总线空闲时间)> 4.7 μs> 1.3 μs> 0.5 μs> 0.16 μstVD;DAT数据有效时间 (SCL 下降沿后,SDA 数据有效的时间)< 3.45 μs< 0.9 μs< 0.45 μs< 0.15 μstVD;ACK应答有效时间 (SCL 下降沿后,ACK 信号有效的时间)< 3.45 μs< 0.9 μs< 0.45 μs< 0.15 μstR (SCL/SDA Rise)信号上升时间 (受总线电容 Cb 和上拉电阻 Rp 影响)< 1000 ns< 300 ns< 120 ns< 40 ns (HS)tF (SCL/SDA Fall)信号下降时间 (通常由器件驱动能力决定,较快)< 300 ns< 300 ns< 120 ns< 40 ns (HS)

为什么这些时序很重要?

数据可靠性 (tSU;DAT, tHD;DAT): 确保接收方在 SCL 上升沿采样时,SDA 数据是稳定且正确的。

起始/停止条件识别 (tSU;STA, tHD;STA, tSU;STO): 保证所有设备都能明确无误地检测到帧的开始和结束。

ACK/NACK 有效性 (tVD;ACK): 发送方需要知道接收方是否成功接收了数据。

总线竞争与仲裁 (多主): 依赖于严格的时序,确保在仲裁过程中数据不会丢失。

速度兼容性 (tLOW, tHIGH): 决定了总线能达到的最高时钟频率。

信号完整性 (tR, tF): 过慢的上升时间(通常由上拉电阻过大或总线电容过大引起)是导致高速通信失败的最常见硬件原因。它可能导致违反 tSU;DAT 或 tHIGH 要求。

调试提示:

使用示波器观察 SDA 和 SCL 波形是调试 I²C 问题最有效的方法。

重点检查:

起始/停止条件 是否符合定义 (SCL 高时 SDA 跳变)。

SCL 高电平期间 SDA 是否稳定 (无毛刺或缓慢变化)。这是数据建立/保持时间违规的直接表现。

ACK 位 是否正确拉低 (有无设备响应?设备是否忙?)。

信号上升时间 (tR) 是否满足所选模式的要求。如果上升沿太缓,尝试减小上拉电阻 Rp 或减少总线上的设备/缩短走线以降低电容 Cb。

时序参数(特别是 tSU;DAT 和 tR)是否在规范范围内。