1. I2C 总线简介

I2C(Inter-Integrated Circuit)是由 NXP 公司设计的一种串行通信总线协议,广泛应用于嵌入式系统中。它使用两条线进行通信:SCL(串行时钟线)SDA(串行数据线)。I2C 总线以其简单、灵活和多设备支持的特性,成为嵌入式开发中最常用的通信协议之一。

1.1 I2C 总线的特点

  • 双线通信:仅需 SCL 和 SDA 两条线即可实现通信。
  • 多设备支持:一个 I2C 总线可以连接多个从设备,每个设备有唯一的地址。
  • 速率灵活:标准模式下速率可达 100Kb/s,快速模式下可达 400Kb/s。
  • 上拉电阻:SCL 和 SDA 线需要接上拉电阻(通常为 4.7KΩ),以确保总线空闲时处于高电平。

1.2 I2C 总线连接结构

I2C 总线可以连接多个从设备,每个设备通过唯一的地址进行区分。总线的连接结构如下:

  • SCL:串行时钟线,由主机控制,用于同步数据传输。
  • SDA:串行数据线,用于双向数据传输。
  • 上拉电阻:SCL 和 SDA 线需要接上拉电阻,确保总线空闲时为高电平。

多个 I2C 设备可以挂接在同一个总线上,通过设备地址进行通信。例如,一个 I2C 总线上可以连接多个传感器、EEPROM 等设备。


2. I2C 协议详解

I2C 协议定义了通信的起始、停止、数据传输和应答等信号。以下是 I2C 协议的关键术语和时序。

2.1 起始位(START)

起始位是 I2C 通信开始的标志。当 SCL 为高电平时,SDA 出现下降沿表示起始位。起始位的作用是告诉从设备:“主机要开始通信了!”

时序特点

  • SCL 为高电平。
  • SDA 从高电平变为低电平。

2.2 停止位(STOP)

停止位是 I2C 通信结束的标志。当 SCL 为高电平时,SDA 出现上升沿表示停止位。停止位的作用是告诉从设备:“通信结束了!”

时序特点

  • SCL 为高电平。
  • SDA 从低电平变为高电平。

2.3 数据传输

I2C 总线在数据传输时,数据在 SCL 的低电平期间变化,并在 SCL 的高电平期间保持稳定。每个字节(8 位)传输后,接收方需要发送一个应答信号(ACK)。

数据传输规则

  • 数据位在 SCL 低电平时变化。
  • 数据位在 SCL 高电平时保持稳定。

2.4 应答信号(ACK/NACK)

每传输一个字节后,接收方需要通过 SDA 线发送一个应答信号:

  • ACK:接收方将 SDA 拉低,表示成功接收数据。
  • NACK:接收方保持 SDA 高电平,表示未成功接收数据或通信结束。

3. I2C 通信时序

I2C 通信分为写操作和读操作,以下是两种操作的详细时序。

3.1 I2C 写时序

I2C 写操作用于主机向从设备写入数据。以下是写时序的步骤:

  1. 起始信号:主机发送起始位。
  2. 发送设备地址:主机发送 7 位设备地址和 1 位写标志(0)。
  3. 应答信号:从机发送 ACK。
  4. 发送寄存器地址:主机发送要写入的寄存器地址。
  5. 应答信号:从机发送 ACK。
  6. 发送数据:主机发送要写入的数据。
  7. 应答信号:从机发送 ACK。
  8. 停止信号:主机发送停止位。

写时序示例

START -> 设备地址(写) -> ACK -> 寄存器地址 -> ACK -> 数据 -> ACK -> STOP

3.2 I2C 读时序

I2C 读操作用于主机从从设备读取数据。读时序比写时序复杂,分为以下步骤:

  1. 起始信号:主机发送起始位。
  2. 发送设备地址:主机发送 7 位设备地址和 1 位写标志(0)。
  3. 应答信号:从机发送 ACK。
  4. 发送寄存器地址:主机发送要读取的寄存器地址。
  5. 应答信号:从机发送 ACK。
  6. 重新发送起始信号:主机发送起始位。
  7. 发送设备地址:主机发送 7 位设备地址和 1 位读标志(1)。
  8. 应答信号:从机发送 ACK。
  9. 读取数据:主机读取从机发送的数据。
  10. 无应答信号:主机发送 NACK 表示读取完成。
  11. 停止信号:主机发送停止位。

读时序示例

START -> 设备地址(写) -> ACK -> 寄存器地址 -> ACK -> 
重新START -> 设备地址(读) -> ACK -> 读取数据 -> NACK -> STOP

4. I2C 多字节读写

I2C 支持多字节读写操作,时序与单字节操作类似,只是在数据传输阶段可以连续发送或接收多个字节。例如:

  • 多字节写:主机连续发送多个数据字节,每个字节后从机发送 ACK。
  • 多字节读:主机连续读取多个数据字节,最后一个字节后发送 NACK。

5. I2C 总线的优势与应用

5.1 优势

  • 简单易用:仅需两条线即可实现通信。
  • 多设备支持:支持多个从设备共享同一总线。
  • 灵活性高:速率可调,适用于多种应用场景。

5.2 应用场景

  • 传感器通信:如温度传感器、加速度传感器等。
  • 存储器访问:如 EEPROM、Flash 等。
  • 显示控制:如 OLED、LCD 显示屏。

6. 总结

I2C 总线是一种简单、灵活且广泛应用的通信协议。通过掌握起始位、停止位、数据传输和应答信号等关键概念,开发者可以轻松实现主机与从设备之间的通信。无论是读写单个字节还是多个字节,I2C 都能提供高效的解决方案。希望本文能帮助你更好地理解 I2C 总线协议,并在实际项目中灵活运用!


参考资料

  • NXP I2C 协议文档
  • 《I.MX6UL 参考手册》