IIC 概述
IIC(Inter-Integrated Circuit),也叫 I2C(Inter-IC Communication)总线,是一种串行通信协议,由 Philips 公司在 1980 年代初开发。IIC 总线用于连接微控制器、传感器和其他集成电路,它具有以下特点:
- 双线制结构简单:由一条数据线(SDA)和一条时钟线(SCL)组成。
- 多主机并行通信:多个 Master 设备可同时接入同一条 IIC 总线上进行数据交换。
- 硬件资源占用少:只要两根线就可以连接多个器件。
- 数据传输速率快:现代 IIC 总线的最高传输速率可达到 400Kbps。
- 低功耗设计:使用者可以通过软件控制设备进入睡眠模式以减少功耗。
传输协议
写操作
- 主机要发出一个起始信号
- 主机发出一个设备地址用来确定是往那一个芯片写数据,以及写标记(0)
- 从设备回应(用来确定这个设备是香存在,然后就可以传输数据)
- 主设备发送一个字节数据给从设备,并等待回应
- 每传输一字节故据,接收方要有一个回应信号(确定故据是否接受完成),然后再传输下一个故据。
- 数据发送完之后,主机就会发送一个停止信号。
读操作
- 主机要发出一个起始信号
- 主机发出一个设备地址用来确定是往那一个芯片读数据,以及读标记(1)
- 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
- 从设备发送一个字节放据给主设备,并等待回应
- 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个放据。
- 数据发送完之后,主芯片就会发送一个停止信号。
状态
空闲状态
- SCL 和 SDA 都为高电平
此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
起始状态
- SCL 为高电平,SDA 由高电平变为低电平
标志着一次数据传输的开始。起始信号是由主控器主动建立的,在建立该信号之前 I2C 总线必须处于空闲状态。
结束状态
- SCL 为高电平,SDA 由低电平变为高电平
数据传输状态
- SCL 高电平期间,SDL 保持稳定
- SDL 为高电平表示 1,低电平表示 0
在 IIC 总线上传送的每一位数据都有一个时钟脉冲相对应 (或同步控制),即在 SCL 串行时钟的配合下,数据在 SDA 上从高位向低位依次串行传送每一位的数据。进行数据传送时,在 SCL 呈现高电平期间,SDA 上的电平必须保持稳定,低电平为数据 0,高电平为数据 1。只有在 SCL 为低电平期间,才允许 SDA 上的电平改变状态。下图是 0xaa
在 IIC 总线上有效传输 (有效传输是指第 9 个时钟的高电平期间,从机给主机反馈了一个有效的应答位 0) 的图示
在时序图中,MSB 代表的是 Most Significant Bit(最高位)。它表示二进制数中最左边的一位,也就是最高位。在一个 n 位的二进制数中,最高位的权值为 2^(n-1)。因此,MSB 在时序图中通常用来指示二进制数或数据字的最高位。同理,LSB 代表的是 Least Significant Bit(最低位)。它表示二进制数中最右边的一位,也就是最低位。
应答状态
- SCL 为高电平,SDA 由高电平变为低电平(上图最后的 ACK 标记)
I2C 总线上的所有数据都是以 8 位字节传送的,发送器 (主机) 每发送一个字节,就在第 9 个时钟脉冲期间释放数据线,由从设备反馈一个应答信号。应答信号为低电平时,规定为有效应答位 (ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位 (NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位 ACK 的要求是,接收器在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。
以下四种情况 IIC 通信过程中会产生非应答位(NACK):
- 从机正在处理某些实时的操作无法与主机实现 IIC 通信的时候,从机会给主机反馈一个非应答 (NACK)
- 主机发送数据的过程中,从机无法解析发送的数据,从机也会给主机反馈一个非应答位 (NACK)
- 主机发送数据的过程中,从机无法再继续接收数据,从机也会给主机反馈一个非应答位 (NACK)
- 主机从从机中读取数据的过程中,主机不想再接收数据,主机会给从机反馈一个非应答位 (NACK),注意,这种情况是主机给从机反馈一个非应答位 (NACK)