1. I2C协议概述
1.1 I2C总线起源
I2C(Inter-Integrated Circuit)总线由Philips公司(现NXP)于1982年推出,最初用于电视、音响等消费电子设备中板级芯片间的短距离通信。其设计目标是以最少的引脚数(仅需两根线)实现多设备互联,同时支持主从架构与多主机仲裁。经过40余年发展,I2C已成为嵌入式系统中最通用的低速串行总线之一,被广泛应用于传感器、存储器、I/O扩展、ADC/DAC、显示驱动等外设。
关键特性: I2C总线仅需两根双向信号线——串行数据线(SDA)和串行时钟线(SCL),即可挂载多达127个从设备(7位地址模式)或1024个从设备(10位地址模式)。
1.2 物理层特性
I2C物理层采用开漏(Open-Drain)输出结构,SDA和SCL线通过上拉电阻连接到VDD。当总线空闲时,两根线均为高电平。设备通过拉低总线来传输数据或时钟信号。
| 参数 | 标准模式 (Standard) | 快速模式 (Fast) | 高速模式 (High-Speed) |
|---|---|---|---|
| 最大时钟频率 | 100 kHz | 400 kHz | 3.4 MHz |
| 最大总线电容 | 400 pF | 400 pF | 100 pF |
| 上拉电阻典型值 | 4.7 kΩ | 1.5 kΩ | 0.5 kΩ |
| 逻辑低电平 (VIL) | 0.3 × VDD | 0.3 × VDD | 0.3 × VDD |
| 逻辑高电平 (VIH) | 0.7 × VDD | 0.7 × VDD | 0.7 × VDD |
设计提示: 上拉电阻的选择需平衡功耗与信号上升时间。电阻过小会导致低电平电流过大,电阻过大会使上升沿变缓,限制总线速率。对于100 kHz标准模式,4.7 kΩ是常用起始值。
1.3 主从架构
I2C总线采用严格的主从(Master-Slave)通信模型:
- 主设备(Master): 负责产生SCL时钟信号、发起START条件、发送从设备地址、控制数据传输方向(读/写)、产生STOP条件。一个I2C总线上可以有一个或多个主设备。
- 从设备(Slave): 被动响应主设备的寻址,根据地址匹配结果决定是否参与通信。从设备不能主动发起传输,但可以通过时钟拉伸(Clock Stretching)机制请求主设备等待。
| 角色 | 职责 | 时钟控制 | 典型示例 |
|---|---|---|---|
| 主设备 | 发起通信、产生时钟、决定方向 | 主动产生SCL | MCU、SoC、DSP |
| 从设备 | 响应寻址、发送/接收数据 | 可拉伸SCL(慢速设备) | 传感器、EEPROM、LCD驱动 |
常见误区: 初学者常误认为从设备可以主动发送数据。实际上,从设备只有在被主设备寻址并收到读命令后,才能将数据放到SDA线上。任何从设备都不能在未经主设备许可的情况下发起传输。
1.4 多主机仲裁概念
I2C支持多个主设备共享同一总线,通过仲裁(Arbitration)机制解决总线冲突。仲裁发生在SDA线上,基于开漏结构的“线与”特性:
- 仲裁过程: 当多个主设备同时尝试拉低SDA时,总线电平保持低。每个主设备在发送数据位后,会回读SDA实际电平。如果某个主设备试图发送高电平(释放SDA),但检测到SDA为低(被其他主设备拉低),则该主设备判定仲裁失败,立即释放总线。
- 仲裁不丢失数据: 仲裁失败的设备不会破坏正在进行的传输,因为总线上的数据始终是多个主设备输出数据的“线与”结果。失败的主设备会在检测到冲突时停止输出,成功的主设备继续完成传输。
- 仲裁与时钟同步: 多主机环境下,SCL线也采用线与逻辑。所有主设备共同产生SCL时钟,最慢的主设备决定SCL低电平持续时间(时钟拉伸),最快的主设备决定SCL高电平持续时间。
仲裁与多主机应用场景: 多主机仲裁机制使得I2C总线可以支持多个MCU或智能传感器同时工作,无需额外的片选信号。例如,两个MCU可以共享同一组传感器,通过仲裁决定哪个MCU获得总线控制权。仲裁失败的设备可以稍后重试,不会破坏正在进行的通信。
1.5 I2C协议核心要素总结
| 要素 | 描述 | 关键点 |
|---|---|---|
| 信号线 | SDA(数据)、SCL(时钟) | 双向、开漏、上拉电阻 |
| 通信模型 | 主从架构 | 主设备产生时钟,从设备响应 |
| 地址 | 7位或10位从设备地址 | 7位模式最多127个设备 |
| 数据传输 | 每个字节后跟ACK/NACK | 从设备通过ACK确认接收 |
| 多主机 | 仲裁机制解决冲突 | 线与逻辑,低电平优先 |
| 速率 | 标准100 kHz / 快速400 kHz / 高速3.4 MHz | 受总线电容和上拉电阻限制 |