一、IIC 简介
IIC(全称Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,它是由数据线 SDA 和时钟线SCL构成的串行总线。
#注意:IIC通信有软件方式和硬件方式之分,软件IIC是一种通过软件模拟IIC通信协议的技术,它不依赖于硬件IIC外设,而是使用GPIO引脚来实现IIC通信的时序和信号,需要通过编程来模拟IIC信号,也就是说软件IIC需要用两个GPIO引脚来分别模拟SCL线和SDA线的时序和信号。硬件IIC则是指微控制器或处理器内部已集成IIC通信模块,它由专用的硬件电路组成,可以自动处理IIC通信的时序和信号,二者主要区别在于实现方式。
IIC总线的特点
①总线由数据线 SDA和时钟线 SCL构成,SDA用来传输数据,SCL用来同步数据收发。
②总线上每一个器件都有一个唯一的地址识别,只需要知道器件的地址,根据时序就可以实现微控制器与器件之间的通信。
③数据线 SDA 和时钟线 SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电 压,所以当总线空闲的时候,这两条线路都是高电平。
④总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s,在高速 模式下可达 3.4Mbit/s。
⑤总线支持多设备连接。在使用 IIC 通信总线时,可以有多个具备 IIC通信能力的设备挂载在上面,同时支持多个主机和多个从机,连接到总线的接口数量只由总线电容400pF 的限制决定。IIC总线挂载多个器件的示意图如下所示:
二、IIC 总线协议
IIC总线时序图如下所示:
① 起始信号:当 SCL 为高电平期间,SDA 由高到低的跳变。
起始信号是一种电平跳变时序信号,而不是一个电平信号。该信号由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传输。
② 停止信号:当 SCL 为高电平期间,SDA 由低到高的跳变。
停止信号也是一种电平跳变时序信号,而不是一个电平信号。该信号由主机发出,在停止信号发出后,总线就处于空闲状态。
③ 应答信号:发送器每发送一个字节,就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK 简称应答位),表示接收器已经成功地接收了 该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。观察上图标号③就可以发现,有效应答的要求是从机在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机,则在它收到最后一个字节后,发送一个NACK 信号,以通知被控发送器结束数据发送,并释放 SDA 线,以便主机接收器发送一个停止信号。
④数据有效性:
IIC 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。数据在 SCL 的上升沿到来之前就需准备好。并在下降沿到来之前必须稳定。
⑤ 数据传输:
在 I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
⑥ 空闲状态:
IIC 总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。
三、IIC 通讯过程
1、主机写数据到从机
(数据传输方向为由主机到从机,即主机写入数据)
①主机发送起始信号;
②主机发送从机地址+0(写操作)组成的8位数据;
③所有从机验证是否是自己的设备地址,假如是自己的设备地址,从机发送应答信号;
④主机开始发送待传输数据,主机每发送一位,从机发出应答信号,依次循环;
⑤最后一位数据发送完成后,主机等待从机的应答信号,收到从机发出的应答信号后,主机发送停止信号;
主机写操作通讯过程如下图所示:
2、主机读数据由从机
(数据传输方向为由从机到主机,即主机读出数据)
①主机发送起始信号;
②主机发送从机地址+1(写操作)组成的8位数据;
③所有从机验证是否是自己的设备地址,假如是自己的设备地址,从机发送应答信号;
④从机继续发出步骤②的8位数据,发送完之后,从机等待主机的应答信号;
⑤主机收到数据,发送应答信号,从机开始发送待传输数据,从机每发送一位数据,主机发出应答信号,依次循环,直到主机接收到所需数量的字节;
⑥主机完成数据接收后,主机发送非应答信号,停止接收数据。
主机读操作通讯过程如下图所示:
①主机发送起始信号;
②主机发送从机地址+0(写操作)组成的8位数据;
③所有从机验证是否是自己的设备地址,假如是自己的设备地址,从机发送应答信号;
④从机继续发出步骤②的8位数据,发送完之后,从机等待主机的应答信号;
⑤主机收到数据,发送应答信号,从机开始发送待传输数据,从机每发送一位数据,主机发出应答信号,依次循环,直到主机接收到所需数量的字节;
⑥主机完成数据接收后,主机发送非应答信号,停止接收数据。
主机读操作通讯过程如下图所示,