# 概述 I2C(Inter-Integrated Circuit)是一种可配置、可综合和可编程的控制总线,旨在为系统中集成电路之间的通信提供支持。它是一种简单的双线总线,配备用于系统控制的软件定义协议,广泛应用于温度传感器、电压电平转换器、通用 I/O 设备、A/D 和 D/A 转换器、COREC 以及多种类型的微处理器。 ## I2C 协议 ### 简介 I2C,也称为 IIC,是一种由飞利浦公司发明的多主从串行总线。它属于半双工同步传输类总线,仅需两条线即可完成多机通信:一条是 SCL(时钟线),另一条是 SDA(双向数据线)。I2C 总线要求每个设备的 SCL/SDA 线采用漏极开路模式,因此必须使用上拉电阻以确保正常工作。I2C 协议占用引脚少,硬件实现简单,具有良好的可扩展性。I2C 数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps)。所有连接到 I2C 总线的设备的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。I2C 总线上的每个设备都有一个唯一的地址,以确保不同设备之间访问的准确性。在任何时刻,只有一个主控设备可以控制总线,且 SCL 由主控设备控制。 ![I2C 总线拓扑图](../../../../gximage/gximage29_i2c_bus_topology_diagram.png) ### I2C 协议时序 I2C 的时序图如下所示: ![I2C 数据传输时序图](../../../../gximage/gximage30_data_transfer_on_the_i2c_bus.png) - **数据有效性**:在 I2C 总线进行数据传送时,每个 SCL 时钟脉冲期间传输一个数据位。在 SCL 为高电平期间,数据线 SDA 上的数据必须保持稳定;只有在 SCL 为低电平期间,数据线 SDA 的高低电平状态才允许变化。SCL 为高电平时,数据线 SDA 的变化被视为控制命令(如起始信号和停止信号)。 - **空闲状态 (IDLE)**:空闲状态表示总线处于空闲状态,此时 SCL 和 SDA 均为高电平,表示没有 I2C 设备在工作。时钟线(SCL)和数据线(SDA)通过上拉电阻连接到高电平,以表示总线处于空闲状态。 - **起始信号 (START)**:起始信号表示通信的开始。在空闲状态下,SCL 继续保持高电平,SDA 线由高电平转换为低电平,产生一个起始信号。此时,连接到总线的 I2C 设备会检测到起始信号,并进入准备接收控制字节的状态。 ![I2C 起始信号](../../../../gximage/gximage31_i2c_start.png) - **停止信号 (STOP)**:停止信号由主设备发出,SCL 保持高电平,SDA 由低电平跳变到高电平,表示通信结束。 ![I2C 停止信号](../../../../gximage/gximage32_i2c_stop.png) - **应答(ACK)与非应答 (NACK)**:应答信号是接收端在收到有效数据后向发送端发送的响应信号。发送端每发送一个字节(8 位)数据后,在第 9 个时钟周期释放数据线以接收对方的应答。在第 9 个时钟周期: - 当 SDA 为低电平时,表示有效应答(ACK),表示对方成功接收数据; - 当 SDA 为高电平时,表示无效应答(NACK),表示对方未能成功接收数据。 ![I2C 应答信号](../../../../gximage/gximage33_i2c_ack.png) ### I2C 协议数据传输 - **7 位/10 位设备地址**:I2C 通常使用 7 位地址,最多支持 127 个不同的 I2C 设备。然而,实际上 I2C 设备的类型可能远多于此,因此许多设备通过外部配置引脚使用双地址或 10 位地址方案。10 位地址方案对 I2C 协议有两个影响: - 地址帧现在有两个字节,而不是一个字节。 - 第一个字节的前五个最高有效位用于标识 10 位地址,约定为“11110”。 - **数据帧**:在发送地址帧并且主设备从从设备接收到 ACK 位后,将开始传输 8 位长的数据,首先发送最高有效位(MSB)。当主设备定期生成时钟脉冲时,数据由主设备或从设备根据读/写位在 SDA 上发送。每个数据帧后面都有一个 ACK/NACK 位,以表明数据是否已成功接收。在发送下一个数据帧之前,主机或从机必须接收到 ACK 位。完成此过程后,主设备将向从设备发送停止条件,从而结束传输。 - **主设备向从设备写入数据**: ![I2C 写入数据](../../../../gximage/gximage34_i2c_write.png) - **主设备从从设备读取数据**: ![I2C 读取数据](../../../../gximage/gximage35_i2c_read.png) - **写寄存器的标准流程**(以 7 位地址和 8 位寄存器地址为例): - 主设备发起 START 信号。 - 主设备发送 I2C 地址(7 位)和写操作位(0),等待 ACK。 - 从设备发送 ACK。 - 主设备发送寄存器地址(8 位),等待 ACK。 - 从设备发送 ACK。 - 主设备发送数据(8 位),即要写入寄存器中的数据,等待 ACK。 - 从设备发送 ACK。 - 第 6 步和第 7 步可以重复多次,以顺序写入多个寄存器。 - 主设备发起 STOP 信号。 - **读寄存器的标准流程**: - 主设备发起 START 信号。 - 主设备发送 I2C 地址(7 位)和写操作位(0),等待 ACK。 - 从设备发送 ACK。 - 主设备发送寄存器地址(8 位),等待 ACK。 - 从设备发送 ACK。 - 主设备发起 START 信号。 - 主设备发送 I2C 地址(7 位)和读操作位(1),等待 ACK。 - 从设备发送 ACK。 - 从设备发送数据(8 位),即寄存器中的值。 - 主设备发送 ACK。 - 第 9 步和第 10 步可以重复多次,以顺序读取多个寄存器。 - 主设备接收的最后一个字节发送 NACK(告知从设备通信结束)。 - 主设备发起 STOP 信号。 # 芯片配置 - **I2C 数量**:1 路 - **最高支持速率**:1 Mbit/s