1)实验平台:正点原子Linux开发板
2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》
关注官方微信号公众号,获取更多资料:正点原子
![8477af77ea1ff802315af16632bf3338.png](https://img-blog.csdnimg.cn/img_convert/8477af77ea1ff802315af16632bf3338.png)
第二十六章I2C实验
I2C是最常用的通信接口,众多的传感器都会提供I2C接口来和主控相连,比如陀螺仪、加速度计、触摸屏等等。所以I2C是做嵌入式开发必须掌握的,I.MX6U有4个I2C接口,可以通过这4个I2C接口来连接一些I2C外设。I.MX6U-ALPHA使用I2C1接口连接了一个距离传感器AP3216C,本章我们就来学习如何使用I.MX6U的I2C接口来驱动AP3216C,读取AP3216C的传感器数据。
26.1 I2C & AP3216C简介
26.1.1 I2C简介
I2C是很常见的一种总线协议,I2C是NXP公司设计的,I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候SCL和SDA处于高电平。I2C总线标准模式下速度可以达到100Kb/S,快速模式下可以达到400Kb/S。I2C总线工作是按照一定的协议来运行的,接下来就看一下I2C协议。
I2C是支持多从机的,也就是一个I2C控制器下可以挂多个I2C从设备,这些不同的I2C从设备有不同的器件地址,这样I2C主控制器就可以通过I2C设备的器件地址访问指定的I2C设备了,一个I2C总线连接多个I2C设备如图26.1.1.1所示:
![0b1ff1a22c184bb7ab0b833f30d7d3c8.png](https://img-blog.csdnimg.cn/img_convert/0b1ff1a22c184bb7ab0b833f30d7d3c8.png)
图26.1.1.1 I2C多个设备连接结构图
图26.1.1.1中SDA和SCL这两根线必须要接一个上拉电阻,一般是4.7K。其余的I2C从器件都挂接到SDA和SCL这两根线上,这样就可以通过SDA和SCL这两根线来访问多个I2C设备。
接下来看一下I2C协议有关的术语:
1、起始位
顾名思义,也就是I2C通信起始标志,通过这个起始位就可以告诉I2C从机,“我”要开始进行I2C通信了。在SCL为高电平的时候,SDA出现下降沿就表示为起始位,如图26.1.1.2所示:
![b1a582ec2698a58767e7d316e8cd9b3c.png](https://img-blog.csdnimg.cn/img_convert/b1a582ec2698a58767e7d316e8cd9b3c.png)
图26.1.1.2 I2C通信起始位
2、停止位
停止位就是停止I2C通信的标志位,和起始位的功能相反。在SCL位高电平的时候,SDA出现上升沿就表示为停止位,如图26.1.1.3所示:
![fe6dd8266fcc1d19657b686b734ee3c2.png](https://img-blog.csdnimg.cn/img_convert/fe6dd8266fcc1d19657b686b734ee3c2.png)
图26.1.1.3 I2C通信停止位
3、数据传输
I2C总线在数据传输的时候要保证在SCL高电平期间,SDA上的数据稳定,因此SDA上的数据变化只能在SCL低电平期间发生,如图26.1.1.4所示:
![af2bb0a6d06a08eb4cb55dd4aa0354fe.png](https://img-blog.csdnimg.cn/img_convert/af2bb0a6d06a08eb4cb55dd4aa0354fe.png)
图26.1.1.4 I2C数据传输
4、应答信号
当I2C主机发送完8位数据以后会将SDA设置为输入状态,等待I2C从机应答,也就是等到I2C从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完8位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将SDA拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
5、I2C写时序
主机通过I2C总线与从机之间进行通信不外乎两个操作:写和读,I2C总线单字节写时序如图26.1.1.5所示: