3. I2C 寻址机制:7 位寻址与 10 位寻址、广播地址、保留地址、从机地址分配策略

I2C 总线上的每个从机设备都必须拥有一个唯一的地址,主设备通过发送目标地址来发起通信。本章节深入剖析 I2C 的寻址机制,包括 7 位与 10 位地址格式、特殊保留地址、广播地址以及实际工程中的地址分配策略。

3.1 7 位寻址与 10 位寻址

I2C 协议定义了两类从机地址格式:7 位地址(标准模式)和 10 位地址(扩展模式)。地址在总线传输时,总是以 8 位(1 字节)的形式出现在起始条件之后,其中最低位(LSB)为读写标志位(R/W)。

3.1.1 7 位地址格式

7 位地址是最常用的格式。主设备在起始条件后发送的第一个字节包含 7 位地址和 1 位 R/W 标志。

格式: [A6 A5 A4 A3 A2 A1 A0] [R/W]
示例: 若从机地址为 0x48(二进制 1001000),则发送字节为 0x90(写操作)或 0x91(读操作)。
7 位地址传输格式 S 7 位从机地址 R/W ACK 数据字节 P S = 起始条件,P = 停止条件,ACK = 从机应答位

3.1.2 10 位地址格式

当系统需要挂载超过 112 个从机设备时,可使用 10 位地址。10 位地址的传输需要两个字节:第一个字节的高 5 位固定为 11110,后跟 10 位地址的高 2 位和 R/W 位;第二个字节为 10 位地址的低 8 位。

工程提示: 10 位地址与 7 位地址在总线上是兼容的。7 位地址从机不会响应以 11110 开头的地址,因此两种设备可以共存于同一条 I2C 总线上。

3.2 广播地址与保留地址

I2C 规范保留了一些特殊地址,用于通用呼叫、特殊命令或未来扩展。主设备在发送这些地址时,所有从机(或特定类型的从机)必须做出响应。

3.2.1 广播地址(通用呼叫地址)

广播地址为 0x00(7 位地址全 0)。当主设备发送地址 0x00 + W(写操作)时,所有支持广播的从机设备都应应答并接收后续数据。广播地址常用于系统复位、状态同步或固件升级。

注意: 并非所有从机都支持广播地址。从机可以在接收到广播地址后选择不应答(NACK),从而忽略广播数据。驱动开发中,应检查从机数据手册是否支持通用呼叫。

3.2.2 保留地址列表

I2C 规范保留了 16 个特殊地址(0x00 ~ 0x0F),用于协议控制。以下为关键保留地址及其用途:

字节序号 位 7-3 位 2-1 位 0 说明
第 1 字节 11110(固定前缀) 地址位 [9:8] R/W 标识 10 位地址模式
第 2 字节 地址位 [7:0](低 8 位) 完整 10 位地址的低字节
7 位地址(二进制) 7 位地址(十六进制) 用途 说明
0000 000 0x00 通用呼叫地址 广播到所有从机
0000 001 0x01 起始字节 用于慢速 MCU 检测总线
0000 010 0x02 CBUS 地址 保留给 CBUS 兼容设备
0000 011 0x03 保留 未来扩展
0000 1xx 0x04 ~ 0x07 高速模式(HS)主码 用于进入高速模式
1111 0xx 0x78 ~ 0x7B 10 位地址前缀 标识后续为 10 位地址
1111 1xx 0x7C ~ 0x7F 保留 未来扩展 / 测试模式
I2C 地址空间分配(7 位地址) 保留地址 0x00 ~ 0x07 可用从机地址 0x08 ~ 0x77(共 112 个地址) 10 位前缀 0x78 ~ 0x7B 保留 0x7C~0x7F 7 位地址空间中,实际可供用户使用的地址为 0x08 ~ 0x77,共 112 个 10 位地址通过前缀 11110xx 扩展,可提供 1024 个地址,但需从机硬件支持

3.3 从机地址分配策略

在实际嵌入式系统中,从机地址的分配直接影响总线冲突概率、驱动兼容性和系统可扩展性。以下为工程中常用的地址分配策略:

3.3.1 硬件引脚配置

大多数 I2C 从机芯片提供多个地址配置引脚(如 AD0、AD1、A0、A1、A2),通过拉高或拉低这些引脚,可以为同一型号的多个设备分配不同地址。

引脚数量 可配置地址数 典型芯片 地址范围示例
1 个引脚 2 个地址 AT24C02(EEPROM) 0x50 / 0x51
2 个引脚 4 个地址 PCF8574(GPIO 扩展) 0x20 ~ 0x27
3 个引脚 8 个地址 MCP23017(GPIO 扩展) 0x20 ~ 0x27

3.3.2 软件可编程地址

部分高级 I2C 从机支持通过软件命令修改自身地址,例如通过写入内部寄存器来改变应答地址。这种策略适用于需要动态重配置的系统,但需注意掉电后地址是否保持。

3.3.3 地址冲突检测与避免

在多设备系统中,地址冲突会导致通信失败。以下为常用的检测与避免方法:

  • 总线扫描: 系统启动时,主设备依次向每个可能的地址发送读请求,检测是否有 ACK 响应,从而发现已占用的地址。
  • 地址映射表: 在驱动层维护一张静态地址分配表,确保每个从机地址唯一。
  • 动态地址协商: 某些智能传感器支持通过专用命令分配临时地址,避免与现有设备冲突。
最佳实践: 在 Linux 内核 I2C 子系统中,通过 i2cdetect 工具可以扫描总线上的所有从机地址。驱动开发时,建议在 probe() 函数中验证地址是否已被占用,避免重复注册。

3.3.4 地址分配检查清单

  1. 确认从机数据手册中支持的地址范围与配置方式。
  2. 检查系统中所有 I2C 设备的地址是否重叠,包括保留地址。
  3. 为每个从机分配唯一的 7 位或 10 位地址,并记录在系统设计文档中。
  4. 在驱动初始化阶段,通过读取设备 ID 寄存器或执行地址扫描来验证地址正确性。
  5. 考虑未来扩展需求,预留部分地址空间。
从机地址分配策略决策流程 开始地址分配 硬件引脚 可配置? 设置引脚电平 软件可编程? 写入配置寄存器 使用固定默认地址 ← 上一章 📖 返回目录 下一章 →