从零开始之驱动发开、linux驱动(四十六、IIC协议原理)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16777851/article/details/88880866

IIC协议是一个板级异步双向的串行协议。

只使用一根数据一根时钟两根线,通常频率都不会很高,通常我们使用在几百Khz,目前最高的器件能达到Mhz级别。

IIC协议的缺点:数据线只有一根既要主机传输又要从机传输,所以传输速度很慢。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。

主器件同时也负责终止一次传输。

主器件的每一次启动传输都是在时钟线的高电平期间,数据线从高到低。

主器件的每一次停止传输都是在时钟线的高电平期间,数据线从低到高。

扫描二维码关注公众号,回复: 5722177 查看本文章

一般情况下IIC总线上是可以接多个设备的,但所接设备数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容,而线路的电容会影响总线传输速度,当电容过大时有可能造成传输错误 。

关于IIC总线的器件地址

总线上的主机在发送数据前先发送要与之通讯的从机的器件地址,主机通过对这个地址的呼叫来确定对总线上拥有该地址的器件进行数据交换。

IIC从机的地址有7位,所以一个IIC主机最多可以接127个从机。

进行IIC通信时发送启动信号后发送的一字节地址数据,地址数据时规范的。

7 - 1位地址,第7位是地址的最高位,第0位表示数据的传送方向

= 0 ,表示写,数据从主机到从机

= 1,表示读,数据从从机到主机。

有一个特殊的地址叫广播地址,如果使用该地址进行通讯,则总线上所有的器件均能收到。广播地址全0.

IIC总线上的主机在启动信号之后发送一个或多个字节的数据,字节的高位在前,低位在后。

应答信号是在从机接收到主机发送的一个字节后在下一次时钟到来时,SDA信号线上给出一个低电平。主机必须等待从机回应一个应答信号,如果没有收到应答信号,则主机必须发送停止信号或者再次重新启动。

发送完一字节数据,主机如果还想继续发送数据,则可以继续发送数据。如果想向其他器件发送数据,则可以先给这个设备发生一个停止信号。之在发生其他器件地址,其后通讯流程同上。
 

数据传输信号
数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;
若SDA发生跳变,则用来表示一个会话的开始或结束(前面已经说了)
数据改变:SCL为低电平时,SDA线才能改变传输的bit,此时SDA数据无效,SCL为高时数据有效。

应答信号

Master每发送完8bit数据后等待Slave的ACK。
即在第9个clock,若从IC发ACK,SDA会被拉低。
若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示:

当然,对于主机读从机数据的情况,应该是主机开始发给从机指定地址和数据长度之后,从机给主机回应数据,此时应该是主机接收到数据后,给从机一个ACK信号。

举例:

这里以一个对某从机芯片的某个地址的写数据为例来分析。

主机最开始发生一个起始信号。

主机接下来发生7bit的器件地址。

因为这是一个写操作,所以主机在器件地址后面跟一个bit,值为0,表示是一个写操作。

接下来,从机如果收到消息,会回一个SCK信号。

主机收到了从机的ACK信号,接下来主机发送该从机内的寄存器地址,来选择要写的位置。

从机收到主机要写的位置,回应一个ACK信号。

主机收到了从机的ACK信号,接下来主机发送要在该从机的前面已经选择的寄存器要写的数据。

接下来,从机如果收到消息,会回一个SCK信号。

主机收到了从机的ACK信号,确认从机这个寄存器已经写好值,此时主机发送一个停止信号,表示此次通讯已经结束。

猜你喜欢

转载自blog.csdn.net/qq_16777851/article/details/88880866