1. 什么是 I2C?
I2C (Inter-Integrated Circuit),发音为 "I-squared-C" 或 "I-two-C",是由飞利浦(Philips,现 NXP)公司在 1980 年代开发的一种简单、双向、二线制同步串行总线。
它主要用于系统内部短距离通信,连接微控制器(MCU)与低速外围设备,如:
- 传感器(温度、加速度计、陀螺仪)
- EEPROM 存储器
- RTC(实时时钟)
- ADC / DAC
- 电源管理芯片 (PMIC)
- 触摸屏控制器
2. 物理层接口
I2C 总线只需要两条信号线:
- SDA (Serial Data):串行数据线,用于传输数据。
- SCL (Serial Clock):串行时钟线,用于同步数据传输。
关键特性:
- 开漏输出 (Open-Drain):SDA 和 SCL 都是开漏(或开集)输出结构。这意味着设备只能将总线拉低(输出 0),不能主动将总线拉高(输出 1)。
- 上拉电阻:总线上必须接上拉电阻(Pull-up Resistor),通常连接到 VCC(3.3V 或 1.8V)。当所有设备都释放总线(不拉低)时,上拉电阻将总线电平拉高至逻辑 1。
- 线与逻辑 (Wired-AND):如果任一设备将总线拉低,总线即呈现低电平。只有所有设备都释放,总线才为高电平。这使得 I2C 天然支持多主仲裁和时钟延展。
3. 协议层
3.1 主从模式
- Master (主设备):发起通信、产生时钟信号 (SCL)、终止通信的设备。通常是 MCU 或 SoC。
- Slave (从设备):被寻址的设备,响应主设备的命令。
3.2 传输时序
一次完整的 I2C 传输包含以下阶段:
- 起始条件 (Start Condition, S):当 SCL 为高电平时,SDA 从高变低。标志着传输开始,总线进入忙状态。
- 地址传输:主设备发送 7 位从设备地址 + 1 位读/写位 (R/W)。
- R/W = 0: 写 (Master -> Slave)
- R/W = 1: 读 (Slave -> Master)
- 应答 (ACK / NACK):每传输 8 位数据(地址或数据),接收方必须在第 9 个时钟周期反馈一位应答。
- ACK (0): 接收方成功接收,SDA 被拉低。
- NACK (1): 接收方未响应或不再接收,SDA 保持高电平。
- 数据传输:每次传输 8 位(1 字节),高位在前 (MSB first)。
- 停止条件 (Stop Condition, P):当 SCL 为高电平时,SDA 从低变高。标志着传输结束,总线释放。
3.3 7 位与 10 位寻址
- 7 位寻址:最常用。总线上理论上可挂载
个设备(实际上保留了一些地址,约 112 个可用)。 - 10 位寻址:用于设备较多的系统,兼容 7 位模式。
3.4 速率
- Standard-mode (Sm): 最高 100 kbit/s
- Fast-mode (Fm): 最高 400 kbit/s (最常见)
- Fast-mode Plus (Fm+): 最高 1 Mbit/s
- High-speed mode (Hs): 最高 3.4 Mbit/s
- Ultra Fast-mode (UFm): 最高 5 Mbit/s (单向)
4. 特殊机制
- 时钟延展 (Clock Stretching):从设备如果处理数据的速度跟不上主设备,可以将 SCL 线强制拉低,迫使主设备进入等待状态,直到从设备释放 SCL,主设备才继续产生时钟。
- 多主仲裁 (Multi-Master Arbitration):当多个主设备同时尝试控制总线时,通过 SDA 线的电平进行仲裁。发送“1”但检测到“0”的主设备会认为自己丢失了仲裁,自动退出并切换到从机模式,保证数据不被破坏。
5. 优缺点
| 优点 | 缺点 |
|---|---|
| 仅需 2 根线,节省 IO 资源 | 速度相对较慢(对比 SPI) |
| 支持多主多从 | 开漏结构导致功耗相对较高(上拉电阻) |
| 有应答机制 (ACK),通信可靠 | 协议相对复杂(起始、停止、仲裁) |
| 硬件标准统一 | 距离受限(总线电容限制) |
6. 总结
I2C 是嵌入式系统中极其重要的总线,RK3566 等 SoC 内部集成了多个 I2C 控制器,Linux 内核提供了完善的 I2C 子系统驱动支持。