12 I2C编程
I2C(Inter-Integrated Circuit BUS)是I2C BUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。
12.1 I2C协议
12.1.1 概述
I2C是一种串行通信总线,使用多主从架构,最初设计目的为了让主板、嵌入式系统或手机用来连接低速周边设备。多用于小数据量的场合,有传输距离短,任意时刻只能有一个主机等特性。严格意义上讲,I2C应该是软硬件结合体,所以我们将分物理层和协议层来介绍该总线。
I2C总线结构如下图:

传输数据时,我们需要发数据,从主设备发送到从设备上去;也需要把数据从从设备传送到主设备上去,数据涉及到双向传输。
对于I2C通信的过程,下面使用一个形象的生活例子进行类比。

体 育老师:可以把球发给学生,也可以把球从学生中接过来。
1. 发球:
- a. 老师说:注意了(start);
- b. 老师对A学生说,我要球发给你(A就是地址);
- c. 老师就把球发出去了(传输);
- d. A收到球之后,应该告诉老师一声(回应);
- e. 老师说下课(停止)。
2. 接球:
- a. 老师说注意了(start);
- b. 老师说:B把球发给我(B是地址);
- c. B就把球发给老师(传输);
- d. 老师收到球之后,给B说一声,表示收到球了(回应);
- e. 老师说下课(停止)。
我们就使用这个简单的例子,来解释一下I2C的传输协议:
① 老师说注意了,表示开始信号(start)
② 老师告诉某个学生,表示发送地址(address)
③ 老师发球/接球,表示数据的传输
④ 老师/学生收到球,回应表示:回应信号(ACK)
⑤ 老师说下课,表示I2C传输接受(P)
**12.2.2 物理层
1) 特性1:半双工(非全双工)
I2C总线中只使用两条线路:SDA、SCL。
① SDA(串行数据线):
主芯片通过一 根SDA线既可以把数据发给从设备,也可以从SDA上读取数据。在I2C设备内部有两个引脚(发送引脚/接受引脚),它们都连接到外部的SDA线上,具体可以参考下图device端里面的I2Cn_SDA(output/input)。
② SCL(串行时钟线):
I2C主设备发出时钟,从设备接收时钟。
SDA和SCL引脚的内部电路结构一致,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。这样结构有如下特性:
a. 由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;
b. 引脚在输出信号的同时还作用输入信号供内部进行检测,当输出与输入不一致时,就表示有问题发生了。这为 “时钟同步”和“总线仲裁”提供硬件基础。
SDA和CLK连接线上连有两个上拉电阻,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低。
物理层连接如下图所示:

2) 特性2:地址和角色可配置
每个连接到总线的器件都可以通过唯一的地址和其它器件通信,主机/从机角色和地址可配置,主机可以作为主机发送器和主机接收器。