1. I2C总线概述

1.1 I2C总线历史

I2C(Inter-Integrated Circuit)总线由飞利浦半导体(现恩智浦半导体)于1982年发明,最初用于电视接收机中微控制器与外设之间的低速通信。其设计目标是以最少的引脚数(仅需两根线)实现芯片间的高效数据交换。

时间节点 版本/标准 关键特性
1982年 原始I2C总线 100 kbit/s标准模式,7位地址
1992年 I2C规范1.0 增加快速模式(400 kbit/s),10位地址
1998年 I2C规范2.0 增加高速模式(3.4 Mbit/s)
2007年 I2C规范3.0 增加超快速模式(5 Mbit/s),仅单向传输
2012年 I2C规范4.0 增加超快速模式+(1 Mbit/s),双向
2014年 I2C规范5.0 增加快速模式+(1 Mbit/s),明确电气参数
嵌入式开发提示: 在ARM平台驱动开发中,最常配置的是标准模式(100 kHz)和快速模式(400 kHz)。高速模式(3.4 MHz)需要特殊的I/O缓冲器设计,并非所有ARM SoC都支持。

1.2 物理层特性:SDA与SCL

I2C总线仅使用两条双向信号线:

  • SDA(Serial Data Line):串行数据线,用于传输地址和数据。
  • SCL(Serial Clock Line):串行时钟线,由主设备产生,同步数据传输。

两条线均采用开漏(Open-Drain)输出结构,通过外部上拉电阻连接到VDD。这种设计允许多个设备共享总线,实现线与逻辑(Wired-AND)。

关键电气参数:
  • 逻辑低电平:VIL ≤ 0.3 × VDD
  • 逻辑高电平:VIH ≥ 0.7 × VDD
  • 上拉电阻典型值:1 kΩ ~ 10 kΩ(取决于总线电容和速率)
  • 总线电容限制:标准模式 ≤ 400 pF,快速模式 ≤ 200 pF
I2C总线物理层连接拓扑 主设备 (ARM SoC) 从设备1 (传感器) 从设备2 (EEPROM) 从设备3 (ADC) 从设备4 (RTC) RP RP SDA SCL VDD VDD 物理层要点 • 开漏输出 • 线与逻辑 • 上拉电阻 • 双向传输 • 多设备共享 • 同步时钟 • 地址仲裁

1.3 总线拓扑结构

I2C总线采用多主多从的共享总线拓扑结构。所有设备通过SDA和SCL两条线并联连接,每个设备都有一个唯一的地址(7位或10位)。

拓扑特性 描述
总线类型 共享总线,所有设备并联
主设备数量 可配置多个主设备(多主模式)
从设备数量 理论最大112个(7位地址)或1024个(10位地址)
通信方向 半双工,主设备控制时钟
最大总线长度 受总线电容限制,通常 ≤ 1米
设备角色 主设备发起通信,从设备响应
驱动开发注意: 在ARM平台设计I2C总线时,必须考虑总线电容。过长的PCB走线或过多的从设备会导致信号上升沿变缓,引发通信错误。建议在高速模式下将总线电容控制在100 pF以内。

1.4 多主从通信原理

I2C总线的多主从通信依赖于以下核心机制:

  1. 总线仲裁(Arbitration):当多个主设备同时尝试控制总线时,通过SDA线的线与逻辑进行仲裁。发送低电平的设备赢得仲裁,发送高电平但检测到低电平的设备自动退出。
  2. 时钟同步(Clock Synchronization):多个主设备通过SCL线的线与逻辑同步时钟。所有主设备同时拉低SCL,最慢的设备决定SCL低电平时间,最快的设备决定高电平时间。
  3. 地址匹配(Address Matching):主设备发送从设备地址后,所有从设备在内部比较地址,匹配的设备发送ACK响应。
  4. 数据方向控制(R/W Bit):地址字节的最低位为读写位(0=写,1=读),决定后续数据传输方向。
I2C多主从通信仲裁与时钟同步流程 主设备A (发送 0x50) 主设备B (发送 0x51) 总线仲裁 (线与逻辑) 仲裁胜出 (主设备A继续) 从设备 (地址 0x50) 时钟同步机制 1. 所有主设备同时拉低SCL 2. 最慢设备决定SCL低电平时间 3. 最快设备决定SCL高电平时间

1.5 通信协议帧格式

I2C总线上的每次通信由以下基本单元组成:

帧段 位数 说明
起始条件(S) 1 SCL高电平时,SDA从高到低跳变
从设备地址 7 或 10 目标从设备的唯一地址
读写位(R/W) 1 0=写操作,1=读操作
应答位(ACK) 1 接收设备拉低SDA表示应答
数据字节 8 × N 传输的数据,每个字节后跟ACK
停止条件(P) 1 SCL高电平时,SDA从低到高跳变
通信流程示例(主设备向从设备写入1字节数据):
主设备: S + 0x50(地址) + W(0) + 等待ACK
从设备: 发送ACK
主设备: 发送数据字节(0xAB) + 等待ACK
从设备: 发送ACK
主设备: P(停止条件)
I2C单字节写操作时序 SDA SCL S 地址(0x50) W ACK 数据(0xAB) ACK P 时序说明 S: SCL高时SDA下降沿 P: SCL高时SDA上升沿 数据在SCL低时变化 数据在SCL高时采样

1.6 总线状态与信号完整性

在ARM平台驱动开发中,理解I2C总线的状态检测至关重要:

  • 总线空闲:SDA和SCL均为高电平(由上拉电阻拉高)。
  • 总线忙:至少有一根线被拉低,表示有设备正在通信。
  • 仲裁丢失:主设备在发送数据时检测到SDA电平与预期不符,应立即释放总线。
  • 时钟拉伸(Clock Stretching):从设备拉低SCL以延长时钟周期,用于处理数据或准备响应。主设备必须支持此特性。
常见驱动调试问题:
  • 总线挂死:从设备未释放SDA导致总线一直为低。解决方法:发送9个时钟脉冲强制从设备复位。
  • ACK缺失:从设备地址错误或设备未上电。检查设备地址和电源。
  • 时钟拉伸超时:从设备拉伸时钟超过主设备等待时间。增加超时时间或检查从设备状态。