串口通讯只能在两个设备之间进行 如果是3个设备互相通讯 那每个设备得需要两组串口 它其实是3组相互独立的串口通讯 如果是4个设备相互通讯就更加麻烦了 最突出的问题就是线路连接比较复杂 为了解决这个痛点 人们设计了一种总线通讯 总线通讯有很多种协议 今天给大家介绍一下简单易懂的I2C通讯 I2C的全称是Inter-Integrated Circuit 意思是芯片与芯片之间的通讯 可以看一下,使用I2C通讯之后 即使有很多芯片 线路连接显的也非常简单 I2C通讯一般采用一主多从模式 比如我们的单片机是主机 而其它设备都是从机 那它到底是如何通讯的呢? 以单片机向从设备写信息为例 可以看一下,这是一帧标准的写数据帧 串口通讯的两根线分别是发送和接收 而I2C这两根线分别是时钟线和数据线 我们的这一帧写数据是由时钟线和数据线共同作用的 也就是在同一时间 它要么是在发送信息,要么就是在读取信息 当处于空闲状态时 数据线和时钟线都处于高电平状态 而当开始传递信息时 比如传递第一位起始位 此时必须要在时钟信号为高电平期间 数据信号完成由高到低的跳变 也就是下降沿 这样起始信号就发送完成了 接下来是7位设备地址码 因为我们有很多从设备 每一个从设备的地址码都是唯一的 为了区别要和哪一个从设备通讯 需要先发送7位地址码 7位不同的0或者1的排列组合 一共可以表示128种结果 它的0或者1是这样表示的 当时钟线为高电平时 数据线上的数据必须保持稳定 比如时钟线为高时 数据线上的数据始终为高 这样就完成了逻辑1的传输 如果数据线上始终是低电平 则表示逻辑0 比如我们发送一串这样的数据 它就表示 1010 000 也就是要和地址为1010 000的设备通讯 假如24C02的地址就是1010 000 此时就是单片机和这个24C02通讯 接下来的一位是读/写数据位 如果我们想要写数据,就给它置0 读数据是置1(此时置0) 再下面一位是应答信号 这个信号是由从机发送给主机的 如果从机收到了之前的信息 它会回复0 没有收到或者(主机)读取接收完成回复1 下面的8位是设备寄存器的地址 因为我们是给24C02通讯的 24C02是一个存储器 它可以存储256个字节 而我们发送的8位寄存器地址正好可以访问这256个字节 比如我们写的寄存器地址是0X01(0X01的二进制就是0000 0001) 它就会往这里写入数据 然后单片机需要存储器返回一个应答信号(此时为0) 接下来的8位是给这个存储器的寄存器要写入的数据 比如我们发送0000 1111 则这8个位就会存储这8位信息 即使后来断电 它里面依旧会永久的保存这些信息 发送完数据之后,需要再给主机发送应答信号0 告诉主机写入成功 最后再写入停止位 它和起始位相反 是当时钟信号为高时 数据信号需要由低到高的跳变 这样一个标准的写数据帧就完成了 那怎么读取数据呢? 其实读数据和写数据差不多 可以看一下这是一个标准的读数据帧 它也是首先写入设备地址 然后是写数据 接下来写的是寄存器的地址 在收到从机的应答信号之后 主机需要再发送一个起始信号 然后需要再发送一遍设备的地址 然后才能发送读数据 接下来,存储器就会把寄存器里面的数据发送给单片机 这样就完成了一帧数据的读取(最后的应答信号为1,是由主机发给从机)