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
1.3 总线拓扑结构
I2C总线采用多主多从的共享总线拓扑结构。所有设备通过SDA和SCL两条线并联连接,每个设备都有一个唯一的地址(7位或10位)。
| 拓扑特性 | 描述 |
|---|---|
| 总线类型 | 共享总线,所有设备并联 |
| 主设备数量 | 可配置多个主设备(多主模式) |
| 从设备数量 | 理论最大112个(7位地址)或1024个(10位地址) |
| 通信方向 | 半双工,主设备控制时钟 |
| 最大总线长度 | 受总线电容限制,通常 ≤ 1米 |
| 设备角色 | 主设备发起通信,从设备响应 |
驱动开发注意: 在ARM平台设计I2C总线时,必须考虑总线电容。过长的PCB走线或过多的从设备会导致信号上升沿变缓,引发通信错误。建议在高速模式下将总线电容控制在100 pF以内。
1.4 多主从通信原理
I2C总线的多主从通信依赖于以下核心机制:
- 总线仲裁(Arbitration):当多个主设备同时尝试控制总线时,通过SDA线的线与逻辑进行仲裁。发送低电平的设备赢得仲裁,发送高电平但检测到低电平的设备自动退出。
- 时钟同步(Clock Synchronization):多个主设备通过SCL线的线与逻辑同步时钟。所有主设备同时拉低SCL,最慢的设备决定SCL低电平时间,最快的设备决定高电平时间。
- 地址匹配(Address Matching):主设备发送从设备地址后,所有从设备在内部比较地址,匹配的设备发送ACK响应。
- 数据方向控制(R/W Bit):地址字节的最低位为读写位(0=写,1=读),决定后续数据传输方向。
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(停止条件)
1.6 总线状态与信号完整性
在ARM平台驱动开发中,理解I2C总线的状态检测至关重要:
- 总线空闲:SDA和SCL均为高电平(由上拉电阻拉高)。
- 总线忙:至少有一根线被拉低,表示有设备正在通信。
- 仲裁丢失:主设备在发送数据时检测到SDA电平与预期不符,应立即释放总线。
- 时钟拉伸(Clock Stretching):从设备拉低SCL以延长时钟周期,用于处理数据或准备响应。主设备必须支持此特性。
常见驱动调试问题:
- 总线挂死:从设备未释放SDA导致总线一直为低。解决方法:发送9个时钟脉冲强制从设备复位。
- ACK缺失:从设备地址错误或设备未上电。检查设备地址和电源。
- 时钟拉伸超时:从设备拉伸时钟超过主设备等待时间。增加超时时间或检查从设备状态。