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)。速率越高,对上拉电阻和总线电容的要求越严格。

I2C总线物理连接拓扑 主控制器 从设备 1 从设备 2 从设备 3 SDA SCL R R VDD(上拉电源) 说明: 所有设备的SDA和SCL引脚均为开漏结构,通过上拉电阻连接到VDD。总线空闲时,SDA和SCL均为高电平。

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拉低表示应答。
I2C起始条件与停止条件时序 SCL SDA START SDA↓ while SCL=H STOP SDA↑ while SCL=H 数据采样区

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缓冲
I2C多主从总线拓扑结构 主设备 1 主设备 2 从设备 1 从设备 2 从设备 3 从设备 4 SDA SDA SCL SCL R R VDD 多个主设备和从设备共享同一组SDA/SCL总线,通过地址和仲裁机制协调通信。

1.4 多主机仲裁机制

I2C总线支持多主设备同时存在于同一总线上。当多个主设备同时尝试发起通信时,通过仲裁(Arbitration)机制决定哪个主设备获得总线控制权。仲裁基于线与逻辑和数据比较实现。

仲裁核心规则:
  • 多个主设备可以同时发送起始条件,只要SDA和SCL保持低电平,所有主设备都认为总线空闲。
  • 在发送地址或数据时,每个主设备都会监控SDA电平。如果某个主设备试图发送高电平(释放SDA),但检测到SDA为低电平(被其他设备拉低),则该主设备失去仲裁,立即停止发送并转为从模式。
  • 仲裁不会丢失数据,因为获胜的主设备继续发送,而失败的主设备退出。
  • 仲裁可以在地址阶段或数据阶段发生。

仲裁过程示例:

  1. 主设备A和主设备B同时检测到总线空闲,同时发出起始条件。
  2. 两者开始发送各自的7位从设备地址,逐位比较。
  3. 在某个位,主设备A发送“1”(释放SDA),主设备B发送“0”(拉低SDA)。
  4. 主设备A检测到SDA为低电平(与自身发送的“1”不符),判定失去仲裁。
  5. 主设备A立即释放SDA和SCL,转为从模式,不再驱动总线。
  6. 主设备B继续完成剩余的地址和数据传输。
仲裁阶段 触发条件 结果
起始条件仲裁 多个主设备同时发出START 所有主设备继续,进入地址仲裁
地址仲裁 多个主设备发送不同地址 发送高电平但检测到低电平的主设备失败
数据仲裁 多个主设备发送不同数据 发送高电平但检测到低电平的主设备失败
应答仲裁 主设备发送地址后等待应答 从设备应答(拉低SDA)或不应答(释放SDA)
I2C多主机仲裁流程 主设备 A 主设备 B 线与仲裁 获胜主设备 失败主设备 仲裁过程说明: 1. 主设备A和B同时检测到总线空闲,同时发出START条件。 2. 两者逐位发送地址,主设备A发送"1",主设备B