一、I2C 数据时序大局观
● 一句话:I2C 的所有信息(起始、地址、读写、数据、应答、停止)都是在 SCL 高电平期间通过 SDA 线上“被谁拉低/放开”来编码的。
● 基本规则
○ SDA、SCL 都是“线与”结构:上拉电阻拉成高电平,谁要发 0 就把线拉低,发 1 就松手。
○ 数据位只能在 SCL 低电平时变化,在 SCL 高电平中间必须保持稳定。
○ 所有时序的“判定瞬间”都在 SCL 上升后保持高电平的一段时间内完成。
二、起始条件与停止条件
● 一句话:起始和停止其实就是在 SCL 高电平时对 SDA 做“特定跳变”,用来标记数据帧的开始和结束。
● 起始条件(START,记作 S)
○ 判定方式:SCL 为高电平时,SDA 从高跳到低。
○ 含义:总线上所有从机看到这个动作,都会认为“新一帧开始了,准备接后面的地址”。
● 停止条件(STOP,记作 P)
○ 判定方式:SCL 为高电平时,SDA 从低跳到高。
○ 含义:一帧传输结束,所有从机都知道本次通信结束了,回到空闲状态。
● 重复起始(Repeated START,Sr)
○ 判定方式:在一次传输过程中,不发 STOP,而是又在 SCL 高电平时把 SDA 从高拉低。
○ 作用:主机可以不松总线,在一次会话里先写再读(或切换从机),常用于“先写寄存器地址,再读数据”。
三、地址阶段时序
● 一句话:起始条件之后,主机会在 8 个 SCL 周期内发出“7 位地址 + 1 位读写位”,然后等一个 ACK。
● 地址+读写位发送
○ 第 1~7 个 SCL 周期:
■ 主机在每个 SCL 低电平时,把 SDA 设置为该位的 0 或 1;
■ 在 SCL 上升并保持高电平时,从机在 SDA 上“采样”这一位。
○ 第 8 位:读写位(R/W)
■ 0:表示主机要写数据到从机(写操作);
■ 1:表示主机要从从机读数据(读操作)。
● ACK 时钟周期(第 9 个 SCL 周期)
○ 这个周期由主机继续产生 SCL 脉冲,但是:
■ 主机会把 SDA 释放为输入状态(不拉低)。
■ 如果有从机地址匹配:对应从机在 SCL 低电平期间把 SDA 拉低,形成应答 0(ACK)。
■ 如果总线上没有任何从机拉低:SDA 被上拉成高电平,表示无应答 1(NACK)。
● 注意:
○ “从机没有拉低怎么看到地址?”
■ 在地址阶段,从机只是“看”SDA 的变化,不驱动 SDA。
■ 等到第 9 个时钟(ACK 周期),它才决定要不要拉低 SDA 表示“我被命中”。
四、数据读写阶段时序
● 一句话:地址成功后,后面就是一串“8 位数据 + 1 位 ACK”的重复周期,每个字节至少 9 个时钟。
● 主写从读(主机向从机写数据)
○ 每发送 1 字节数据:
■ 8 个时钟:主机在 SCL 低电平设置 SDA,在高电平时从机采样。
■ 第 9 个时钟:主机释放 SDA,从机如果接收成功就拉低 SDA 产生 ACK。
○ 主机根据 ACK 决定继续发送下一字节,或者发送 STOP 结束。
● 主读从写(主机从从机读数据)
○ 每接收 1 字节数据:
■ 8 个时钟:从机在 SCL 低电平设置 SDA,在高电平时主机采样。
■ 第 9 个时钟:
● 主机如果要继续读:在 SCL 低电平期间拉低 SDA,给从机一个 ACK。
● 主机如果不想再读:保持 SDA 为高(不拉低),给一个 NACK,然后再发 STOP 或重复起始。
● 示例(典型“写寄存器再读数据”的时序逻辑过程)
○ 主机:S + 设备地址(写) + ACK
○ 主机:寄存器地址字节 + ACK
○ 主机:重复起始 Sr
○ 主机:设备地址(读) + ACK
○ 从机:发出数据字节1,主机 ACK
○ 从机:发出数据字节2,主机 NACK
○ 主机:P
五、时序细节:数据稳定区间与时钟拉伸
● 一句话:I2C 要求数据只能在时钟低电平变化,并允许从机通过拉低 SCL 来“减速”。
● 数据稳定区间
○ 任何一个位的判定在 SCL 高电平期间完成:
■ SCL 低电平:允许 SDA 改变,准备好下一个位。
■ SCL 上升→高电平中间:SDA 必须保持不变,供接收方采样。
○ 起始和停止是唯一允许在 SCL 高电平时改变 SDA 的特殊动作。
● 时钟拉伸(Clock Stretching)
○ 理论上时钟由主机产生,但从机可以在需要延时处理时“拉低 SCL 不放”,迫使主机等待。
○ 流程:
■ 主机准备把 SCL 拉高;
■ 从机把 SCL 线强制拉低(作为开漏输出),总线保持低电平;
■ 主机必须等到从机释放 SCL,线被上拉电阻拉回高电平后,才能继续下一个位的时序。
○ 用处:从机处理速度不够快时,保证不会丢数据。
六、整体回顾(从时序角度重新串一遍)
● 一句话:从时序来看,一帧 I2C 通信就是“起始 → 地址+R/W+ACK → 多个(数据+ACK/NACK) → 停止”的标准节拍流水线。
● 一帧基本流程
○ 空闲:SCL 和 SDA 都被上拉到高电平,所有器件处于监听状态;
○ 起始:主机在 SCL 高电平时拉低 SDA(S);
○ 地址阶段:7 位地址 + 1 位 R/W 位,在 8 个 SCL 周期内发送;
○ ACK:第 9 个 SCL 周期,目标从机拉低 SDA 表示应答;
○ 数据阶段:
■ 写:主机以字节为单位发送数据,从机在每个字节后给 ACK;
■ 读:从机以字节为单位发送数据,主机在每个字节后给 ACK 或最后一个给 NACK;
○ 停止:主机在 SCL 高电平时把 SDA 从低拉回高电平(P),一帧结束,总线回到空闲。
1万+

被折叠的 条评论
为什么被折叠?



