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 标志。
示例: 若从机地址为 0x48(二进制 1001000),则发送字节为 0x90(写操作)或 0x91(读操作)。
3.1.2 10 位地址格式
当系统需要挂载超过 112 个从机设备时,可使用 10 位地址。10 位地址的传输需要两个字节:第一个字节的高 5 位固定为 11110,后跟 10 位地址的高 2 位和 R/W 位;第二个字节为 10 位地址的低 8 位。
| 字节序号 | 位 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 | 保留 | 未来扩展 / 测试模式 |
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 响应,从而发现已占用的地址。
- 地址映射表: 在驱动层维护一张静态地址分配表,确保每个从机地址唯一。
- 动态地址协商: 某些智能传感器支持通过专用命令分配临时地址,避免与现有设备冲突。
i2cdetect 工具可以扫描总线上的所有从机地址。驱动开发时,建议在 probe() 函数中验证地址是否已被占用,避免重复注册。
3.3.4 地址分配检查清单
- 确认从机数据手册中支持的地址范围与配置方式。
- 检查系统中所有 I2C 设备的地址是否重叠,包括保留地址。
- 为每个从机分配唯一的 7 位或 10 位地址,并记录在系统设计文档中。
- 在驱动初始化阶段,通过读取设备 ID 寄存器或执行地址扫描来验证地址正确性。
- 考虑未来扩展需求,预留部分地址空间。