深入解析I2C协议框架与关键时序
I²C协议帧结构主要包括起始条件(S)、停止条件(P)、重复起始条件(Sr)、数据位传输和应答位(ACK)。起始条件在SCL高电平时SDA下降沿触发,停止条件在SCL高电平时SDA上升沿触发。数据传输遵循SCL低电平变化、高电平稳定的规则,MSB优先。每个字节后跟应答位(ACK拉低/NACK保持高)。完整帧包含起始、地址字节(7位地址+1位方向)、ACK、数据字节和停止条件。协议定义了不同速度模式
目录
关于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) |
|---|---|---|---|---|---|
fSCL |
SCL 时钟频率 | ≤ 100 kHz | ≤ 400 kHz | ≤ 1000 kHz | ≤ 3400 kHz |
tLOW |
SCL 时钟低电平时间 | > 4.7 μs | > 1.3 μs | > 0.5 μs | > 0.16 μs |
tHIGH |
SCL 时钟高电平时间 | > 4.0 μs | > 0.6 μs | > 0.26 μs | > 0.06 μs |
tSU;STA |
起始条件建立时间 (SCL 变高到 SDA 变低) | > 4.7 μs | > 0.6 μs | > 0.26 μs | > 0.06 μs |
tHD;STA |
起始条件保持时间 (SDA 变低后 SCL 保持低的时间) | > 4.0 μs | > 0.6 μs | > 0.26 μs | > 0.06 μs |
tSU;STO |
停止条件建立时间 (SCL 变高前 SDA 必须变低的时间) | > 4.0 μs | > 0.6 μs | > 0.26 μs | > 0.06 μs |
tSU;DAT |
数据建立时间 (SCL 上升沿前,SDA 必须稳定的时间) | > 250 ns | > 100 ns | > 50 ns | > 10 ns |
tHD;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 μs |
tVD;DAT |
数据有效时间 (SCL 下降沿后,SDA 数据有效的时间) | < 3.45 μs | < 0.9 μs | < 0.45 μs | < 0.15 μs |
tVD;ACK |
应答有效时间 (SCL 下降沿后,ACK 信号有效的时间) |
< 3.45 μs | < 0.9 μs | < 0.45 μs | < 0.15 μs |
tR (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)是否在规范范围内。
-
更多推荐



所有评论(0)