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 主机发送数据流程
-
主机在检测到总线为空闲时,发送一个启动信号“S”,开始一次通信的开始;
-
主机接着发送一个从设备地址,它由7bit物理地址和 1bit 读写控制位 R/W组成(此时 R/W=0);
-
相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0);
-
主机收到从机的应答信号后开始发送第一个字节的数据;
-
从机收到数据后返回一个应答信号ACK;
-
主机收到应答信号后再发送下一个数据字节;
-
主机发完最后一个字节并收到 ACK后,向从机发送一个停止信号P结束本次通信并释放总线;
-
从机收到P信号后也退出与主机之间的通信。
2.5 主机接收数据流程
-
主机发送启动信号后,接着发送地址字节(其中 R/W=1);
-
对应的从机收到地址字节后,返回一个应答信号并向主机发送数据:
-
主机收到数据后向从机反馈一个应答信号ACK;
-
从机收到应答信号后再向主机发送下一个数据;
-
当主机完成接收数据后,向从机发送一个 NAK,从机收到非应答信号后便停止发送;
-
主机发送非应答信号后,再发送一个停止信号,释放总线结束通信。
2.6 时钟延展
I2C是一种同步通信模式,主设备通过SCL线给从设备提供精确的时钟信号和从设备通信,当从设备的通信速率跟不上主设备时就可以使用时钟延展(Clock Stretching)。
Clock Stretching只是I2C通信的一个可选项,通常在I2C接口的传感器中比较常见,如温湿度传感器SHT20/30。
在I2C的主从通信过程中,总线上的SCL时钟总是有主设备来产生和控制,如果从机跟不上主机的速率,主机可以在数据传输的第9个位时钟(ACK)时主动将SCL时钟拉低,通知主设备暂停此时的传输。当从设备准备好后再将SCL释放通知主设备数据已经就位,可以继续通信。
本文作者:梨子Li
本文链接:https://www.cnblogs.com/LiBlog--/p/17746445.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步