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的时钟节奏。
I2C总线物理连接结构图 主设备 (Master) 从设备1 (Slave 0x50) 从设备2 (Slave 0x68) SDA SCL Rₚ Rₚ Rₚ Rₚ VDD (3.3V / 5V) 开漏输出 + 上拉电阻 = 线与逻辑 任何设备都可以将SDA或SCL拉低;高电平由Rₚ上拉至VDD

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。

上拉电阻选择流程 确定总线速率 计算Rₚₘᵢₙ = VDD / Iₒₗₘₐₓ 计算Rₚₘₐₓ = tᵣ / (0.847 × C_b) 选择Rₚ:Rₚₘᵢₙ < Rₚ < Rₚₘₐₓ

1.4 总线仲裁与时钟同步

I2C总线支持多主设备通信,其核心机制是总线仲裁(Arbitration)和时钟同步(Clock Synchronization)。

总线仲裁原理

  • 多个主设备同时发送数据时,通过SDA线的线与逻辑进行仲裁。
  • 发送高电平但检测到SDA为低电平的设备,判定仲裁失败,立即释放总线。
  • 仲裁过程不丢失数据,失败的设备自动转为从设备模式。

时钟同步机制

  • 所有主设备在SCL上产生自己的时钟。
  • SCL的低电平时间由最慢的设备决定(所有设备拉低SCL)。
  • SCL的高电平时间由最快的设备决定(所有设备释放SCL后开始计时)。
  • 最终SCL的周期被同步为所有主设备时钟的“逻辑与”。
嵌入式驱动视角:在Linux I2C子系统中,总线仲裁由硬件自动完成,驱动开发者无需干预。但理解仲裁机制有助于排查多主设备冲突导致的通信异常,尤其是在同一总线上挂载多个传感器和MCU的场景。

1.5 I2C总线通信基本流程

一次完整的I2C数据传输包含以下阶段:

  1. 起始条件(START):SCL为高电平时,SDA由高变低。
  2. 发送从设备地址:7位或10位地址 + 读写位(R/W)。
  3. 从设备应答(ACK):从设备拉低SDA表示应答。
  4. 数据传输:每字节8位,MSB先行,后跟应答位。
  5. 停止条件(STOP):SCL为高电平时,SDA由低变高。
I2C单次写操作时序 SCL SDA START 地址 + W ACK 数据字节 ACK STOP 每个字节后跟一个ACK/NACK位;STOP后总线释放,可发起下一次通信

1.6 本章小结

知识点 核心要点 驱动开发关联
物理层 SDA/SCL开漏输出 + 上拉电阻 设备树中需配置时序参数
上拉电阻 影响上升时间和最大速率 硬件设计决定驱动速率上限
总线仲裁 多主设备通过线与逻辑仲裁 Linux内核自动处理,驱动透明
通信流程 START → 地址 → ACK → 数据 → STOP 驱动中通过i2c_msg结构体描述