I2C协议

1、I2C总线通信协议介绍

1.1 I2C总线介绍

I2C(IIC,集成电路总线)是一种简单的双向同步(有一根时钟线SCL或CLK)串行总线,利用一根时钟线(SCL)和一根数据线(SDA)构成通信线路,利用上拉电阻将其拉成高电平,表示总线空闲。

I2C总线是一种主从结构(Master/Slave)总线,一个总线上可以有多个从设备,同一时刻只允许有一个主设备。主设备通常为CPU,用来产生时钟信号,从设备只能响应主设备发起的请求。

 

1.2 I2C从设备地址

每个从设备都有一个唯一的7位物理地址,通常固化在芯片内部,可以在芯片的datesheet上找到。 I2C总线7位寻址10位寻址两种模式,通常使用7bit模式。因此,理论上I2C总线寻址模式的最大节点数为128或1024个。但I2C有16个保留从机地址。

 

2、I2C通信时序

SDA和SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时,这两条线路都是高电平。总线要发送数据时,数据在SDA上从高位项低位依次串行传送每一位数据,每传输一个数据位,主机就在SCL线上产生一个时钟脉冲。

 

2.1 起始/停止位

起始位:当SCL保持高电平时,SDA出现一个下降沿,产生一个起始位

停止位:当SCL保持高电平时,SDA出现一个上升沿,产生一个停止位

 

2.2 数据位收发

对于I2C总线来说,发送的8位从机地址也是一个字节的数据:

1、芯片7位地址

2、读写方向位(R/W):0(W,写),表示主机发送数据给从机。1(R,读),表示从机发送数据给主机。

 

选中的从机回复ACK报文给主机。

 

 

2.3 I2C应答信号

I2C通信发送完一个字节的数据后,接收方应该在第9个位给发送方回复一个ACK/NAK信号,用来告知对方是继续通信还是结束通信。

继续:给出应答信号(ACK),SDA位低电平

结束:给出非应答信号(NAK),SDA位高电平

 

接收方发送ACK之前,发送方必须释放SDA线,大部分情况下,正常通信会回复ACK信号,但一下条件会导致NAK信号:

  • 主机从从设备读完数据,回复NAK通知从设备数据通信完成

  • 传输期间,接收方不能收到任何数据字节或收到它不能解析的命令或数据

  • 通信方尚未准备好与主站通信,如正忙看执行其他实时命令

 

2.4 主机发送数据流程

  1. 主机在检测到总线为空闲时,发送一个启动信号“S”,开始一次通信的开始;

  2. 主机接着发送一个从设备地址,它由7bit物理地址和 1bit 读写控制位 R/W组成(此时 R/W=0);

  3. 相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0);

  4. 主机收到从机的应答信号后开始发送第一个字节的数据;

  5. 从机收到数据后返回一个应答信号ACK;

  6. 主机收到应答信号后再发送下一个数据字节;

  7. 主机发完最后一个字节并收到 ACK后,向从机发送一个停止信号P结束本次通信并释放总线;

  8. 从机收到P信号后也退出与主机之间的通信。

 

2.5 主机接收数据流程

  1. 主机发送启动信号后,接着发送地址字节(其中 R/W=1);

  2. 对应的从机收到地址字节后,返回一个应答信号并向主机发送数据:

  3. 主机收到数据后向从机反馈一个应答信号ACK;

  4. 从机收到应答信号后再向主机发送下一个数据;

  5. 当主机完成接收数据后,向从机发送一个 NAK,从机收到非应答信号后便停止发送;

  6. 主机发送非应答信号后,再发送一个停止信号,释放总线结束通信。

 

2.6 时钟延展

I2C是一种同步通信模式,主设备通过SCL线给从设备提供精确的时钟信号和从设备通信,当从设备的通信速率跟不上主设备时就可以使用时钟延展(Clock Stretching)。

Clock Stretching只是I2C通信的一个可选项,通常在I2C接口的传感器中比较常见,如温湿度传感器SHT20/30。

在I2C的主从通信过程中,总线上的SCL时钟总是有主设备来产生和控制,如果从机跟不上主机的速率,主机可以在数据传输的第9个位时钟(ACK)时主动将SCL时钟拉低,通知主设备暂停此时的传输。当从设备准备好后再将SCL释放通知主设备数据已经就位,可以继续通信。

 

 

posted @ 2023-10-07 15:29  梨子Li  阅读(53)  评论(0编辑  收藏  举报