1. I2C总线协议基础
1.1 I2C总线物理层特性
I2C(Inter-Integrated Circuit)总线由Philips公司(现NXP)在1980年代发明,是一种同步、多主从、串行通信总线。其物理层采用开漏(Open-Drain)结构,通过两根线——串行数据线(SDA)和串行时钟线(SCL)——实现设备间的通信。
核心物理特性:
- 双线制:仅需SDA(数据)和SCL(时钟)两根信号线。
- 开漏输出:每个设备的SDA和SCL引脚内部为开漏结构,必须外接上拉电阻到VDD。
- 线与逻辑:多个设备可以同时驱动总线,低电平优先(“线与”),这是仲裁的基础。
- 双向传输:SDA和SCL均为双向信号线,主从设备均可控制。
- 上拉电阻:阻值通常为1kΩ~10kΩ,取决于总线电容和通信速率。
I2C总线支持多种传输速率模式:标准模式(100 kbit/s)、快速模式(400 kbit/s)、快速模式+(1 Mbit/s)和高速模式(3.4 Mbit/s)。速率越高,对上拉电阻和总线电容的要求越严格。
1.2 SCL与SDA信号
I2C总线的数据传输完全由SCL时钟同步。SDA线上的数据在SCL时钟的配合下逐位传输。理解SCL和SDA的时序关系是掌握I2C协议的第一步。
| 信号 | 方向 | 功能描述 | 空闲状态 |
|---|---|---|---|
| SCL | 主→从 | 串行时钟,由主设备产生,同步所有数据传输 | 高电平 |
| SDA | 双向 | 串行数据,传输地址、读写位、数据和应答信号 | 高电平 |
关键信号时序:
- 起始条件(START):SCL为高电平时,SDA从高电平切换到低电平。
- 停止条件(STOP):SCL为高电平时,SDA从低电平切换到高电平。
- 数据采样:SCL为高电平时,SDA上的数据必须保持稳定;SCL为低电平时,SDA允许变化。
- 应答位(ACK):每传输完一个字节(8位),接收方在第9个SCL周期将SDA拉低表示应答。
1.3 I2C总线拓扑结构
I2C总线采用多主从总线拓扑,所有设备通过SDA和SCL两条线并联连接。每个设备都有一个唯一的7位或10位地址,主设备通过地址选择通信对象。
拓扑要点:
- 主设备(Master):发起通信、产生时钟、发送地址和数据的设备。典型主设备包括MCU、SoC、DSP。
- 从设备(Slave):响应主设备请求的设备。典型从设备包括传感器、EEPROM、ADC/DAC、LCD控制器。
- 多主支持:总线上可以挂载多个主设备,通过仲裁机制决定总线控制权。
- 最大设备数:受限于总线电容(通常400pF)和地址空间(7位地址最多128个,10位地址最多1024个)。
| 拓扑特性 | 说明 | 工程限制 |
|---|---|---|
| 总线连接方式 | 所有设备SDA/SCL并联,共享两根线 | 总线电容随设备数增加而增大 |
| 地址分配 | 7位或10位地址,由硬件引脚或软件配置 | 7位地址最多128个,部分地址保留 |
| 通信方向 | 主设备控制时钟,数据双向传输 | 从设备不能主动发起通信 |
| 速率限制 | 标准100kHz,快速400kHz,高速3.4MHz | 高速模式需要特殊I/O缓冲 |
1.4 多主机仲裁机制
I2C总线支持多主设备同时存在于同一总线上。当多个主设备同时尝试发起通信时,通过仲裁(Arbitration)机制决定哪个主设备获得总线控制权。仲裁基于线与逻辑和数据比较实现。
仲裁核心规则:
- 多个主设备可以同时发送起始条件,只要SDA和SCL保持低电平,所有主设备都认为总线空闲。
- 在发送地址或数据时,每个主设备都会监控SDA电平。如果某个主设备试图发送高电平(释放SDA),但检测到SDA为低电平(被其他设备拉低),则该主设备失去仲裁,立即停止发送并转为从模式。
- 仲裁不会丢失数据,因为获胜的主设备继续发送,而失败的主设备退出。
- 仲裁可以在地址阶段或数据阶段发生。
仲裁过程示例:
- 主设备A和主设备B同时检测到总线空闲,同时发出起始条件。
- 两者开始发送各自的7位从设备地址,逐位比较。
- 在某个位,主设备A发送“1”(释放SDA),主设备B发送“0”(拉低SDA)。
- 主设备A检测到SDA为低电平(与自身发送的“1”不符),判定失去仲裁。
- 主设备A立即释放SDA和SCL,转为从模式,不再驱动总线。
- 主设备B继续完成剩余的地址和数据传输。
| 仲裁阶段 | 触发条件 | 结果 |
|---|---|---|
| 起始条件仲裁 | 多个主设备同时发出START | 所有主设备继续,进入地址仲裁 |
| 地址仲裁 | 多个主设备发送不同地址 | 发送高电平但检测到低电平的主设备失败 |
| 数据仲裁 | 多个主设备发送不同数据 | 发送高电平但检测到低电平的主设备失败 |
| 应答仲裁 | 主设备发送地址后等待应答 | 从设备应答(拉低SDA)或不应答(释放SDA) |