10.1. 概述

I2C(Inter-Integrated Circuit)是一种可配置、可综合和可编程的控制总线,旨在为系统中集成电路之间的通信提供支持。它是一种简单的双线总线,配备用于系统控制的软件定义协议,广泛应用于温度传感器、电压电平转换器、通用 I/O 设备、A/D 和 D/A 转换器、COREC 以及多种类型的微处理器。

10.1.1. I2C 协议

10.1.1.1. 简介

I2C,也称为 IIC,是一种由飞利浦公司发明的多主从串行总线。它属于半双工同步传输类总线,仅需两条线即可完成多机通信:一条是 SCL(时钟线),另一条是 SDA(双向数据线)。I2C 总线要求每个设备的 SCL/SDA 线采用漏极开路模式,因此必须使用上拉电阻以确保正常工作。I2C 协议占用引脚少,硬件实现简单,具有良好的可扩展性。I2C 数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps)。所有连接到 I2C 总线的设备的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。I2C 总线上的每个设备都有一个唯一的地址,以确保不同设备之间访问的准确性。在任何时刻,只有一个主控设备可以控制总线,且 SCL 由主控设备控制。

I2C 总线拓扑图

10.1.1.2. I2C 协议时序

I2C 的时序图如下所示:

I2C 数据传输时序图

  • 数据有效性:在 I2C 总线进行数据传送时,每个 SCL 时钟脉冲期间传输一个数据位。在 SCL 为高电平期间,数据线 SDA 上的数据必须保持稳定;只有在 SCL 为低电平期间,数据线 SDA 的高低电平状态才允许变化。SCL 为高电平时,数据线 SDA 的变化被视为控制命令(如起始信号和停止信号)。

  • 空闲状态 (IDLE):空闲状态表示总线处于空闲状态,此时 SCL 和 SDA 均为高电平,表示没有 I2C 设备在工作。时钟线(SCL)和数据线(SDA)通过上拉电阻连接到高电平,以表示总线处于空闲状态。

  • 起始信号 (START):起始信号表示通信的开始。在空闲状态下,SCL 继续保持高电平,SDA 线由高电平转换为低电平,产生一个起始信号。此时,连接到总线的 I2C 设备会检测到起始信号,并进入准备接收控制字节的状态。

I2C 起始信号

  • 停止信号 (STOP):停止信号由主设备发出,SCL 保持高电平,SDA 由低电平跳变到高电平,表示通信结束。

I2C 停止信号

  • 应答(ACK)与非应答 (NACK):应答信号是接收端在收到有效数据后向发送端发送的响应信号。发送端每发送一个字节(8 位)数据后,在第 9 个时钟周期释放数据线以接收对方的应答。在第 9 个时钟周期:

    • 当 SDA 为低电平时,表示有效应答(ACK),表示对方成功接收数据;

    • 当 SDA 为高电平时,表示无效应答(NACK),表示对方未能成功接收数据。

I2C 应答信号

10.1.1.3. I2C 协议数据传输

  • 7 位/10 位设备地址:I2C 通常使用 7 位地址,最多支持 127 个不同的 I2C 设备。然而,实际上 I2C 设备的类型可能远多于此,因此许多设备通过外部配置引脚使用双地址或 10 位地址方案。10 位地址方案对 I2C 协议有两个影响:

    • 地址帧现在有两个字节,而不是一个字节。

    • 第一个字节的前五个最高有效位用于标识 10 位地址,约定为“11110”。

  • 数据帧:在发送地址帧并且主设备从从设备接收到 ACK 位后,将开始传输 8 位长的数据,首先发送最高有效位(MSB)。当主设备定期生成时钟脉冲时,数据由主设备或从设备根据读/写位在 SDA 上发送。每个数据帧后面都有一个 ACK/NACK 位,以表明数据是否已成功接收。在发送下一个数据帧之前,主机或从机必须接收到 ACK 位。完成此过程后,主设备将向从设备发送停止条件,从而结束传输。

  • 主设备向从设备写入数据

I2C 写入数据

  • 主设备从从设备读取数据

I2C 读取数据

  • 写寄存器的标准流程(以 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 信号。

10.2. 芯片配置

  • I2C 数量:1 路

  • 最高支持速率:1 Mbit/s