3. I2C 总线协议进阶:多主机仲裁、时钟同步、10 位地址模式、高速模式
在掌握了 I2C 基本的数据传输流程后,本章深入探讨 I2C 总线的高级特性。这些特性是 I2C 从简单传感器通信迈向复杂多主系统、大容量存储及高速外设的关键。理解多主机仲裁、时钟同步、10 位地址模式与高速模式,对于设计健壮、高性能的嵌入式系统至关重要。
3.1 多主机仲裁与时钟同步
I2C 总线支持多个主机同时尝试控制总线。为了避免数据冲突,总线内置了分布式仲裁与时钟同步机制。
3.1.1 多主机仲裁机制
仲裁发生在 SDA 线上,基于“线与”特性:当多个主机同时输出数据时,任何一个主机输出低电平,SDA 线就会被拉低。仲裁规则为:输出低电平的主机赢得仲裁,输出高电平但检测到 SDA 为低的主机则失去仲裁,并立即释放总线。
- 仲裁过程: 发生在数据位(包括地址位和数据位)的传输过程中。每个主机在输出数据位后,都会读取 SDA 线的实际电平。如果读取的电平与自己输出的不同,则判定为仲裁失败。
- 仲裁失败处理: 失败的主机必须立即将其 SDA 输出切换为高阻态(释放 SDA),并停止产生 SCL 时钟,直到总线再次空闲(检测到 STOP 条件)。
- 无数据丢失: 由于仲裁过程不破坏数据,赢得仲裁的主机可以继续完成其未完成的传输,而不会丢失任何数据帧。
关键点: 仲裁只在 SDA 线上进行,SCL 线由所有主机共同参与时钟同步。地址头部的 R/W 位也参与仲裁,这意味着多个主机可以同时尝试读取同一个从机,但最终只有一个主机能成功。
3.1.2 时钟同步机制
时钟同步通过 SCL 线的“线与”特性实现。所有主机都会产生自己的 SCL 时钟,但 SCL 线的实际低电平时间由所有主机中低电平周期最长的主机决定,高电平时间由高电平周期最短的主机决定。
- 低电平同步: 当某个主机开始拉低 SCL 时,其他主机检测到 SCL 为低,也会立即开始计数自己的低电平周期。SCL 线保持低电平,直到所有主机都结束其低电平周期。
- 高电平同步: 当所有主机都释放 SCL 后,SCL 线被上拉电阻拉高。此时,每个主机开始计数自己的高电平周期。第一个结束高电平周期的主机会再次拉低 SCL,从而开始下一个时钟周期。
这种机制确保了所有主机在同一个同步时钟下工作,避免了时钟竞争,为仲裁提供了稳定的时序基础。
时钟同步与仲裁的关系: 时钟同步为仲裁提供了稳定的时序环境。在同步的 SCL 下,所有主机在 SDA 线上进行位级别的仲裁,保证了多主机系统的有序运行。
3.2 10 位地址模式
标准 I2C 使用 7 位地址,最多支持 112 个从机(保留 16 个地址)。为了满足更复杂系统的需求,I2C 规范引入了 10 位地址模式,将地址空间扩展到 1024 个。
3.2.1 地址格式与传输序列
10 位地址的传输分为两个阶段,使用保留的 1111 0XX 作为首字节头部。
| 阶段 | SDA 数据内容 | 说明 |
|---|---|---|
| 第 1 字节 | 1111 0 A9 A8 R/W | 前 5 位固定为 11110,后跟地址最高 2 位 (A9, A8) 和读写位 |
| 第 2 字节 | A7 A6 A5 A4 A3 A2 A1 A0 | 地址的低 8 位 |
| 从机应答 | ACK / NACK | 从机在每字节后应答,第 2 字节应答后开始数据传输 |
3.2.2 传输序列示例(写操作)
主机发送: S 11110 A9 A8 W ACK A7-A0 ACK Data ACK P
|-- 第1字节 --| |-- 第2字节 --| |-- 数据 --|
- S: START 条件。
- 11110: 10 位地址标识符。
- A9, A8: 10 位地址的最高两位。
- W: 写位 (0)。
- ACK: 从机应答(可能来自多个匹配地址的从机,但最终只有一个会继续)。
- A7-A0: 地址的低 8 位。
- Data: 数据字节。
- P: STOP 条件。
兼容性注意: 10 位地址模式与 7 位地址模式在总线上可以共存。主机通过首字节的 11110 前缀来区分。7 位地址的从机不会响应 11110 开头的地址,因此两种设备可以安全地挂载在同一条 I2C 总线上。
3.3 高速模式 (Hs-mode)
标准模式 (100 kHz) 和快速模式 (400 kHz) 对于现代高带宽外设(如高分辨率图像传感器、高速 ADC)已显不足。I2C 高速模式 (Hs-mode) 将传输速率提升至 3.4 MHz,同时保持与现有设备的兼容性。
3.3.1 高速模式的关键特性
| 特性 | 标准/快速模式 | 高速模式 (Hs-mode) |
|---|---|---|
| 最大速率 | 100 kHz / 400 kHz | 3.4 MHz |
| 主从机电流源 | 开漏输出 + 上拉电阻 | 开漏输出 + 上拉电阻 + 从机电流源 |
| 传输启动 | 直接 START 条件 | 主码 (0000 1XXX) + NACK + 重复 START |
| SCL 上升沿 | 由上拉电阻决定 | 由从机电流源加速,上升时间极短 |
| 兼容性 | 所有设备 | 需 Hs-mode 从机支持,可与标准设备共存 |
3.3.2 高速模式传输协议
高速模式传输分为两个阶段:
- 主码阶段: 主机以快速模式 (400 kHz) 发送一个 8 位主码 (0000 1XXX),后跟 NACK。这用于唤醒总线上所有支持 Hs-mode 的从机,并通知它们即将进入高速传输。
- 高速传输阶段: 主机发送重复 START 条件,然后以 3.4 MHz 的高速进行地址和数据传输。在此阶段,从机必须提供电流源来加速 SCL 的上升沿。
主机发送: S 0001 1XXX NACK Sr 7位/10位地址 R/W Data ... P
|-- 主码阶段 (F/S模式) --| |-- 高速传输阶段 (Hs模式) --|
电流源的作用: 在高速模式下,传统的上拉电阻无法在 3.4 MHz 下快速将 SCL 拉高。因此,每个支持 Hs-mode 的从机内部都集成了一个可编程电流源,在 SCL 上升沿时主动注入电流,从而将上升时间从微秒级缩短至纳秒级。
3.4 本章小结
本章深入剖析了 I2C 总线的高级特性:
- 多主机仲裁与时钟同步 保证了多个主机可以安全共享总线,通过 SDA 线与仲裁和 SCL 线与同步机制,实现了无冲突的分布式总线控制。
- 10 位地址模式 将地址空间从 112 个扩展到 1024 个,通过两字节地址传输序列,解决了大型系统中地址不足的问题,并保持了与 7 位地址设备的向后兼容。
- 高速模式 (Hs-mode) 通过主码唤醒和从机电流源技术,将传输速率提升至 3.4 MHz,满足了高带宽外设的需求,同时通过主码阶段保持了与标准/快速模式设备的共存。