1.IIC总线
IIC总线是飞利浦公司推出的一种串行、半双工的总线协议,主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步,IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。
IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,从而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7位),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的期间增加和删除不影响其他器件的正常工作;IIC总线在通信时总线上发送数据的器件作为发送器,接收数据的器件作为接收器。
2.IIC通信总线通信过程
- 主机发送起始信号启用总线。
- 主机发送一个字节数据指明从机地址和后续字节的传递方向,发送的一个字节,前7位是指明从机的地址,最后1位是指明数据传输的方向(最后一位写0是主机给从机发,最后一位写1是从机给主机发)。
- 被寻址的从机发送应答信号回应主机。
- 发送器发送一个字节数据。
- 接收器发送应答信号回应发送器。
…(循环4、5步) - 通信完成后主机发送停止信号释放总线。
3.IIC总线寻址方式
主机在发送起始信号后必须先发送一个字节的数据,该数据前7位时从机的地址信息,后1位表示后续字节的传送方向。
4.IIC的起始信号和停止信号
SCL为高电平,SDA由高变低表示起始信号。
SCL为高电平,SDA由低变高表示停止信号。
起始信号和停止信号都是由主机发出,起始信号产生后总线处于占用状态,停止信号产生后,总线处于空闲状态。
5.字节的传送与应答
IIC总线通信时,每次必须发送一个字节即8位,数据传送时,先传送最高位,后传送低位,发送器发送完一个字节数据后,接收器必须发送1位应答来回应发送器,即一帧有9位。
如果接收器接收到信号回应应答,那么接收器向发送器发送低电平数据,如果没有接收到信号,那么就回应高电平。
6.IIC的同步信号
IIC总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间,接收器从数据线上读取一位数据,在此期间数据线上的信号不允许变化,必须保持稳定。这样就可以通过SCL信号来一位一位在发送器和接收器之间传输数据,这样就能很好地区分发送器向接收器发送的是01信号还是0011信号。
当发送器将一个字节的数据发送完成后,SCL会再次变低,当SCL变低后,接收器此时可以将信号进行变化,来应答发送器,如果SCL稳定高电平以后,接收器想要应答,那么接收器就可以变为低电平,如果不想应答,就变为高电平。
7.典型的IIC时序
图片备注:
阴影部分表示数据由主机向从机传送,无阴影部分表示从机向主机传送;A表示应答,A非表示非应答,S表示起始信号,P表示停止信号。
1.主机向从机发送数据
主机发送起始信号,后发送7位从机地址和传送方向0,后从机向主机发送应答信号,后主机向从机发送数据。当发送到最后一个字节的时候,有两种情况:
- 主机不再向从机发送信号,当主机向从机发送完最后一个字节数据后,从机应答,主机随后发送停止信号,此次通信结束。
- 从机不再向接收信号,此时,主机向从机接收完最后一个信号以后,从机不再发送应答信号,随后主机发送停止信号,通信结束。
2.从机向主机发送数据
主机发送起始信号,后发送7位从机地址和传送方向1,后从机向主机发送应答信号,后从机向主机发送数据,主机发送应答信号。当从机发送到最后一个字节后,若主机不行再接收数据,那么主机就不会发送应答信号,主机随机发送停止信号。
3.主机先向从机发送数据,然后从机再向主机发送数据
这样数据传输方向不同的时候,第一次主机向从机发送信号后,不用发送停止信号,(不发送停止信号的话,IIC总线就不会被释放,这样就可以保持数据传递方向变化后的传送。)直接发送起始信号,开启下一次的数据传输。
8.stm32中IIC的实现方式
在stm32中的固件库函数中,其实没有多少IIC的库函数,就三个库函数,还是用来获取标志位或者清除标志位的,所以,这些库函数并不能帮助我们实现IIC起始信号、停止信号以及数据的传输的内容,所以对于起始信号、停止信号和数据传输需要我们自己写函数来实现。
具体的实现方式我会在后期专门写一篇博客来进行实现。
总结:
以上内容就是我对IIC知识的一些理解,如果有不妥的地方,请各位大佬批评指正,不胜感激!!!!