I2C协议

I2C通信

​I²C 总线​​ 由两根信号线构成:​​SCL(Serial Clock,串行时钟线)​​ 和 ​​SDA(Serial Data,串行数据线)​​。

对于SDA总线的数据电平只能在 ​​SCL 低电平期间​​ 改变,而在 ​​SCL 高电平期间必须保持稳定​​。因为接收方是在SCL的上升沿(或者高电平中点)采样SDA数据。

SCL  ______/¯¯¯¯\______/¯¯¯¯\______/¯¯¯¯\__
SDA  __/¯¯¯¯\________/¯¯¯¯\________/¯¯¯¯\__
          ↑           ↑           ↑
         采样时刻     采样时刻     采样时刻

如果数据位在SCL高电平期间发生变化,可能会被误认为起始或者停止条件,导致信号中断。

2 通信的步骤详解

I2C通信的步骤可以分为以下步骤:

  1. 发送START

  2. 发送从设备地址

  3. 从设备应答

  4. 数据传输

  5. 数据读/写

  6. 发送STOP

下面会结合时序图讲解上述的通信步骤。首先需要先解释下START/STOP信号,这两个信号分别表示通信的开始和结束。

2.1 START信号

主设备在SCL高电平时,将SDA从高拉低。此时表示通信开始,通知总线上的所有设备准备接受数据。

SCL  __/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\____
SDA  ¯¯¯¯¯¯¯\____________/¯¯¯¯

2.2 发送从设备地址

主设备在发送完START信号后,会在总线上发送从设备的地址,从设备收到地址后会和自己的地址进行比较,如果和自己的地址匹配会返回ACK。其他地址不匹配的从设备会把SDA引脚保持高阻态,不再监听SDA总线,避免干扰。而地址匹配的从设备会继续监听SDA总线。

地址的格式是:7bit的设备地址和1个bit的读写位(0:主设备写,1:主设备读)

2.3 从设备应答

从设备在接受到主设备发送的设备地址后,会和自己的设备地址进行比较,如果地址相同则返回ACK,并且继续监听SDA总线,否则进入静默模式。从设备返回ACK是在第9个SCL时钟周期把SDA总线拉低。

2.4 数据传输

数据传输主要包括读数据和写数据。这里数据的读写都是从主设备的角度进行分析的。

2.4.1 写数据

主设备发送8bit的数据,从设备在第9个SCL时钟周期返回ACK。重复此操作直到数据发送完成。

2.4.2 读数据

主设备释放总线(切换为输入模式)。从设备开始驱动SDA总线,逐位发送数据。主设备在接受到数据回复ACK(第9个SCL时钟控制SDA)。主设备发送STOP条件,结束传输。

3 时序图分析

结合时序图分析主设备的读写流程,可以对比第二章节的流程,进一步加深对I2C设备读写的理解。在分析时序图的时候,要抓住一个关键点:I2C是在SCL上升沿采集SDA数据的

3.1 写数据

  1. 在SCL高电平期间,将SDA拉低,此时发送START信号。

  2. 发送地址帧。主设备发送7bit的从设备地址+1bit的读写位。这里R/W位等于0,表示主设备写数据。

  3. 从设备接收到地址帧后,会和自己的设备地址进行比较,两者相同,会主动把SDA拉低,此时返回ACK。

  4. 开始发送数据帧,这里的例子是把8bit的寄存器地址发送给从设备。在从设备接收到数据后,第9个SCL时钟周期拉低SDA,返回ACK

  5. 把要写入的寄存器数据发送给从设备,从设备接收到数据后,在第9个SCL时钟返回ACK

  6. 紧接着把8bit的CRC数据发送给从设备,从设备收到数据后,返回ACK

  7. 主设备在SCL高电平期间,把SDA拉高,此时表示发送STOP信号。

3.2 读数据

  1. 在SCL高电平期间,将SDA拉低,此时发送START信号。

  2. 发送地址帧。主设备发送7bit的从设备地址和1bit的读写位。这里R/W位为0,表示主设备要写数据。

  3. 从设备接收到地址帧,与自己的设备地址进行比较,两者相同会主动把SDA拉低,此时返回ACK

  4. 这里是发送重复启动信号,表示主设备切换成读模式。

  5. 主设备发送地址帧,从设备接收到后返回ACK。从地址帧可以看出R/W位为1,表示主设备要读数据。

  6. 主设备读取数据,这时主设备是释放SDA总线,由从设备驱动SDA总线的。

  7. 主设备读取到数据后返回ACK

  8. 主设备读取数据,重复步骤6,7。

  9. 主设备在SCL高电平期间把SDA拉高,此时发送STOP信号。

4 总线仲裁

I2C总线上是允许多主设备的,所以在某一时刻上可能会出现两个或者两个以上的主设备同时在SDA上传输数据,这时就会出现总线竞争问题。

I2C仲裁主要遵循三个机制:

  1. 线与机制:多主机时,总线具有“线与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。

  2. SDA回读机制:总线被启动后,多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,就会继续占用总线。

  3. 低电平优先机制:由于线与的存在,当多主机发送时,谁先发送低电平谁就会掌握对总线的控制权。

线与机制和SDA回读机制需要结合在一起理解。假设Master1发送"10010101"的数据,Master2发送"11001101"的数据。根据线与机制,Master1发送的第2个bit为0,Master2发送的第2个bit为1,线与之后,SDA总线上为0。再根据SDA回读机制,此时Master2发送第2个bit数据与自己发送的不一致,就不会再继续占用SDA总线。而Master1则继续发送数据

5 Reference

  1. I2C通信时序图解析 - 北丐BeiGai - 博客园

  2. I2C协议详解(图文并茂+超详细)-CSDN博客

  3. https://zhuanlan.zhihu.com/p/362287272

posted @ 2025-06-05 09:20  cockpunctual  阅读(248)  评论(0)    收藏  举报