I2C通信协议介绍

I2C是本人在实际项目中使用最多的一个通信协议,其只用两条线(SDA和SCL)在连接到总线上的设备之间传送数据。每一个设备都由唯一的地址来识别(不管是MCU、外部sensor、LCD驱动器、存储器或者键盘接口),并且可以依照设备的功能作为发送器或者接收器使用。LCD驱动器可能只是个接收器,而存储器可以发送和接受数据。除了发送器和接收器,当传送数据时设备还可以作为主机或者从机。主机就是初始化数据传输和产生时钟信号的设备,在那个时刻,任何被寻址的设备都是从机。
在这里插入图片描述

SDA和SCL信号
SDA和SCL都是双向线路,通过电流源或者上拉电阻连接到一个正向电压。当总线空闲时,两条线都是高电平.连接到总线的设备的输出级必须是OD(漏极开路)或者OC(集电极开路)门才能执行线与功能.在标准模式下I2C总线传输数据可以达到100kb/s的速度,而在快速模式下达到400kb/s的速度,高速模式下是3.4Mb/s的速度。时钟信号SCL通常是主机设备的责任。
数据有效性
在时钟SCL为高期间SDA线上的数据必须稳定.只有在SCL线上的时钟信号低时数据线才可以改变高低状态.每个数据位传输都需要一个时钟产生。

开始和终止条件
所有的传输都由一个START(S)开始,有一个STOP§终止。
START条件是当SCL高时,SDA从高到低
STOP条件是SCL高时,SDA从低到高
在这里插入图片描述

开始条件和终止条件一直由主机产生。在开始条件后总线就处于忙状态.在终止条件后隔上一个固定时间总线就处于空闲状态.如果没有终止条件产生,而是一个重复的开始条件(Sr),那总线依旧是忙状态.这种情况下S和Sr在功能上是一样的.如果连接到总线的设备包含了必须的接口硬件那么开始条件和终止条件的检测时很容易的.但是没有这样接口的微控制器在每个时钟周期内至少要采样两次SDA线来识别有没有电平变化.
数据传输的字节格式
发送到SDA线上的每个字节必须是8位.每次传输的字节数量是不受限制的.每个字节后必须跟着一个ACK应答位.数据从最高有效位(MSB)开始传输.如果从机要执行一些功能后才能接收或者发送新的完整数据,比如说服务一个内部中断,那么它可以将时钟线SCL拉低来强制使主机进入wait状态.当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行.
在这里插入图片描述

ACK和NACK
每个字节后都有ACK发生.ACK应答位允许接收器通知发送器字节成功接收了下一个字节可以发送了.主机产生所有的时钟脉冲,包括应答位的第9个时钟脉冲.
ACK应答信号是如下定义的:在ACK的第9个时钟脉冲中发送器释放SDA线,所以接收器可以将SDA拉低,使得在这个时钟脉冲的高电平期间保证SDA是低电平.建立和保持时间也应该计算在内.
在这里插入图片描述

当在第9个时钟脉冲期间SDA仍然是高,这时定义为NACK信号.这时主机可以产生一个终止条件来终止传输,或者一个重复的开始条件来开始一个新的传输.这里有5中情况导致NACK的产生:
1.总线当前的传输地址上没有接收器,所以没有设备用ACK来响应.
2.因为接收者正在处理一些实时的功能,尚未准备与主机的通信,所以接收者不能收发.
3.在传输期间,接收者收到不能识别的数据或者命令.
4.在传输期间,接收者无法接收更多的数据字节.
5.主-接收器要通知从-发送器传输的结束.

猜你喜欢

转载自blog.csdn.net/weixin_43704402/article/details/113756133