引言
IIC是产品设计中最常用的通信接口,众多的传感器都会提供IIC接口来和主控连接,如陀螺仪、加速计、触摸屏等。所以IIC是嵌入式学习必须要掌握的。
本次只是讲解理论,不做实际实验操作,因为我现在在学Linux,使用的IMX6ULL大家手里面也可能没有这个板子,所以就不做演示啦。
IIC简介
IIC是很常见的一种总线协议,IIC是由NXP(恩智浦)公司设计的,IIC使用两条线在主控制器和从机之间进行数据通信。一根为SCL(串行时钟线),另一条为SDA(串行数据线)。通常这两根线都需要接上拉电阻,使总线空闲的时候SCLSDA都处于高电平状态。
IIC总线的标准速度可以达到100Kb/s,快速模式下可以达到400Kb/s。
IIC总线工作是按照一定协议来与运行的。IIC是支持多从机的。也就是一个IIC控制器下面可以挂多个IIC设备,这些不同的IIC从设备有不同的器件地址,这样IIC主控制器就可以通过IIC设备的器件地址访问指定的设备了。
如上图,SDA和SCL两根线都有一个上拉电阻,一般是4.7K。其余的IIC器件都挂在总线上。
协议术语
起始位
IIC通信起始标志,告诉IIC从机“我要开始IIC通信了”,SCL为高电平的时候,SDA出现下降沿就表示起始位。
停止位
停止IIC通信的标志位,和起始位的功能相反。当SCL处于高电平的时候,SDA由低变高出现上升沿为停止位。
数据传输
IIC总线在数据传输的时候要保证SCL高电平期间,SDA上的数据稳定,因此SDA的数据变化只能在SCL处于低电平的期间发生。
应答信号
当IIC主机发送完8位数据以后会将SDA设置为输入状态,等待IIC从机应答,也就是等IIC从机告诉主机它可以接收数据了。应答信号是由从机发起的,主机需要提供应答信号所需的时钟,主机发送完8位数据以后紧跟着一个时钟信号就是给应答信号使用的。从机通过将SDA拉低来表示发送应答信号,表示通信成功,否则表示失败。
时序
主机通过IIC总线与从机之间进行通信主要两个操作:读和写。
IIC写时序
具体步骤
- 开始信号
- 发送设备地址:每个IIC器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个IIC器件。发送8位数据,7位位设备地址,第8位为读写位(1表示读操作,0表示写操作)。
- 等待应答:等待从机发送ACK应答
- 重新发送开始信号
- 发送寄存器地址
- 等待应答
- 发送要写入的数据
- 等待应答
- 停止信号
IIC读时序
具体步骤
- 发送开始信号
- 发送设备地址7位,第8位为读写位,此时为写状态(0)
- 等待应答
- 重新发送开始信号
- 发送寄存器地址
- 等待应答
- 重新发送开始信号
- 重新发送设备地址,这里第8位置1(读状态)
- 等待应答
- 从IIC器件中读取到的数据
- 主机发送NOACK信号,表示读取完成
- 发送停止信号
如果我们需要读写多字节,那么在读写数据的时候可以连续发送多个自己的数据,其他的控制时序和单字节是一样的。