1. I2C总线协议基础
1.1 I2C总线历史
I2C(Inter-Integrated Circuit)总线由飞利浦半导体(现恩智浦半导体)于1982年发明,最初用于电视接收机中微控制器与外设之间的低速通信。其设计目标是以最少的引脚数(仅需两根线)实现板级芯片间的可靠通信。
| 版本 | 发布年份 | 最大速率 | 主要特性 |
|---|---|---|---|
| I2C v1.0 | 1992 | 100 kbit/s | 标准模式(Standard-mode) |
| I2C v2.0 | 1998 | 400 kbit/s | 快速模式(Fast-mode) |
| I2C v2.1 | 2000 | 3.4 Mbit/s | 高速模式(High-speed mode) |
| I2C v3.0 | 2007 | 1 Mbit/s | 快速模式+(Fast-mode Plus) |
| I2C v4.0 | 2012 | 5 Mbit/s | 超快速模式(Ultra Fast-mode) |
| I2C v5.0 | 2014 | 5 Mbit/s | 仅单向传输,移除开漏要求 |
嵌入式开发要点:在Linux嵌入式系统中,最常用的I2C模式为标准模式(100 kHz)和快速模式(400 kHz)。高速模式(3.4 MHz)需要特殊的I2C控制器硬件支持,且对PCB布局和上拉电阻选择有更严格的要求。
1.2 物理层特性:SDA与SCL
I2C总线仅使用两根双向信号线:
- SDA(Serial Data Line):串行数据线,用于传输地址和数据。
- SCL(Serial Clock Line):串行时钟线,由主设备产生,用于同步数据传输。
两根线均采用开漏(Open-Drain)结构,即设备只能将线拉低(输出低电平),不能主动拉高。高电平由外部上拉电阻提供。这种设计允许多个设备共享总线,通过线与(Wired-AND)逻辑实现仲裁。
关键概念:开漏输出 + 上拉电阻 = 多主设备仲裁的基础。任何设备都可以拉低总线,但只有主设备能控制SCL的时钟节奏。
1.3 电气连接与上拉电阻
I2C总线的电气特性直接决定了通信的可靠性和最大传输距离。上拉电阻(Rₚ)的选择是I2C硬件设计中最关键的环节之一。
上拉电阻的作用
- 当所有设备释放总线(输出高阻)时,将SDA/SCL拉高至VDD电平。
- 限制总线拉低时的灌电流,保护设备输出级。
- 与总线电容共同决定信号上升时间(tᵣ),影响最大通信速率。
上拉电阻值的选择原则
| 参数 | 最小值(Rₚₘᵢₙ) | 最大值(Rₚₘₐₓ) | 典型值 |
|---|---|---|---|
| 标准模式(100 kHz) | 1.6 kΩ | 10 kΩ | 4.7 kΩ |
| 快速模式(400 kHz) | 1.0 kΩ | 4.7 kΩ | 2.2 kΩ |
| 快速模式+(1 MHz) | 0.5 kΩ | 2.0 kΩ | 1.0 kΩ |
| 高速模式(3.4 MHz) | 0.2 kΩ | 1.0 kΩ | 0.5 kΩ |
设计警告:上拉电阻过小会导致灌电流过大,可能损坏设备IO口;上拉电阻过大会导致上升时间过长,在高速通信时无法满足时序要求。实际设计中应使用示波器测量上升时间,确保tᵣ < 0.3 × t_SCL(时钟周期)。
总线电容与上升时间
I2C总线的最大从设备数量受限于总线电容(C_b)。标准模式允许最大总线电容为400 pF,快速模式为400 pF,快速模式+为550 pF。上升时间tᵣ ≈ 0.847 × Rₚ × C_b。
1.4 总线仲裁与时钟同步
I2C总线支持多主设备通信,其核心机制是总线仲裁(Arbitration)和时钟同步(Clock Synchronization)。
总线仲裁原理
- 多个主设备同时发送数据时,通过SDA线的线与逻辑进行仲裁。
- 发送高电平但检测到SDA为低电平的设备,判定仲裁失败,立即释放总线。
- 仲裁过程不丢失数据,失败的设备自动转为从设备模式。
时钟同步机制
- 所有主设备在SCL上产生自己的时钟。
- SCL的低电平时间由最慢的设备决定(所有设备拉低SCL)。
- SCL的高电平时间由最快的设备决定(所有设备释放SCL后开始计时)。
- 最终SCL的周期被同步为所有主设备时钟的“逻辑与”。
嵌入式驱动视角:在Linux I2C子系统中,总线仲裁由硬件自动完成,驱动开发者无需干预。但理解仲裁机制有助于排查多主设备冲突导致的通信异常,尤其是在同一总线上挂载多个传感器和MCU的场景。
1.5 I2C总线通信基本流程
一次完整的I2C数据传输包含以下阶段:
- 起始条件(START):SCL为高电平时,SDA由高变低。
- 发送从设备地址:7位或10位地址 + 读写位(R/W)。
- 从设备应答(ACK):从设备拉低SDA表示应答。
- 数据传输:每字节8位,MSB先行,后跟应答位。
- 停止条件(STOP):SCL为高电平时,SDA由低变高。
1.6 本章小结
| 知识点 | 核心要点 | 驱动开发关联 |
|---|---|---|
| 物理层 | SDA/SCL开漏输出 + 上拉电阻 | 设备树中需配置时序参数 |
| 上拉电阻 | 影响上升时间和最大速率 | 硬件设计决定驱动速率上限 |
| 总线仲裁 | 多主设备通过线与逻辑仲裁 | Linux内核自动处理,驱动透明 |
| 通信流程 | START → 地址 → ACK → 数据 → STOP | 驱动中通过i2c_msg结构体描述 |