串口通信只能在两个设备之间进行,如果是四组串口通信,那每个设备都需要三组串口,其线路连接相当繁琐(如下图)。
为了解决这个痛点,人们设计了一种总线通信,总线通信有很多种协议(如USB/SPI/CAN/IIC),今天介绍的就是IIC通信协议。
可以看到在使用IIC通信后,即使有很多芯片,线路连接显的非常简单。IIC通信一般采用一主多从模式,比如单片机是主机,其他设备为从机。
以单片机向从设备发送信息为例(图二是一帧标准的写数据帧),图二的一帧数据是由时钟线和数据线共同作用完成。也就是在同一时间,它要么是在发送信息,要么就是在读取信息。
当处于空闲状态时,数据线和时钟线都处于高电平状态。
而当开始传递信息时,比如传递第一位的起始位,此时必须要在时钟信号为高电平期间,数据信号完成由高到低的跳变,也就是下降沿,这样起始信号就发送完成了。
接下来是7位设备地址码,每个从设备的地址码都是唯一的。为了区别要和哪个设备进行通信,需要先发送7位地址码(7位不同的0或1的排列组合,一共可以排成128种不同的结果)。它的0或者1表示如下:当时钟线为高电平时,数据线上的数据线必须保持稳定。比如时钟线为高时,数据线上的数据始终为高,这样就完成了逻辑1的传输。如果数据线上,始终是低电平,则表示逻辑0。
比如我们发送一串下面的数据,也就是主设备要和地址为1010 000的设备进行通信。
接下来一位是读/写数据位,如果想要给从设备写数据,就给该位置0,读数据就是置1。再下面一位,就是应答信号。该信号是由从机发送给主机的。若从机收到主机发送的信息,它会回复0;没有收到主机发送的信息或者读取完成,则回复1。再后面的8位是从设备的数据寄存器的地址,然后单片机需要存储器返回一个应答信号0;再后面的8位是给这个存储器的寄存器要写入的数据,发送完数据之后,从设备需要给主机发送应答信号0,告诉主机写入成功。
最后再写入停止位,它与起始位相反;当时钟信号为高时,数据信号需要由低到高的跳变(如下图),这样一个标准的写数据帧就完成了。
标准的读数据帧与写数据帧相似,存储器会把寄存器里面的数据发送给单片机(如下图)注意:最后的应答信号为1,是由主机发给从机。
视频教程来自B站UP:爱上半导体