1. I2C总线协议基础

1.1 I2C总线物理层特性

I2C(Inter-Integrated Circuit)总线是由Philips公司(现NXP)开发的一种同步、多主从、串行通信总线。它仅需两根双向信号线即可完成设备间的数据交换,广泛应用于嵌入式系统中连接微控制器与各类传感器、存储器、I/O扩展芯片等外设。

特性参数 标准模式 (Standard) 快速模式 (Fast) 高速模式 (High-Speed)
最大时钟频率 100 kHz 400 kHz 3.4 MHz
最大总线电容 400 pF 400 pF 100 pF
最大从设备数量 127(7位地址) 127(7位地址) 127(7位地址)
输出级 开漏/集电极开路 开漏/集电极开路 开漏 + 电流源
上拉电阻典型值 4.7 kΩ 2.2 kΩ 1.0 kΩ
关键物理层要点: I2C总线使用开漏(Open-Drain)输出结构,所有设备的SCL和SDA引脚内部为MOSFET漏极开路,必须通过外部上拉电阻连接到VDD(通常为3.3V或5V)。总线空闲时,SCL和SDA均被上拉至高电平。

1.2 SCL与SDA信号

I2C总线的两根信号线各自承担明确的功能:

  • SCL(Serial Clock Line):串行时钟线,由主设备驱动,用于同步所有设备的数据传输。每个时钟脉冲传输一个数据位。
  • SDA(Serial Data Line):串行数据线,用于在主设备和从设备之间双向传输地址、数据和应答信号。

数据在SCL时钟的配合下按位传输,遵循以下规则:

  1. 数据有效性:在SCL高电平期间,SDA上的数据必须保持稳定;只有在SCL低电平期间,SDA才允许变化。
  2. 起始条件(S):SCL为高电平时,SDA由高电平向低电平跳变,表示传输开始。
  3. 停止条件(P):SCL为高电平时,SDA由低电平向高电平跳变,表示传输结束。
  4. 应答(ACK/NACK):每传输完一个字节(8位),接收方在第9个时钟周期将SDA拉低(ACK)或保持高电平(NACK)以回应。
避坑提示: 起始条件和停止条件只能由主设备产生。从设备不允许主动产生起始或停止条件,否则会导致总线冲突。
I2C总线数据传输时序图 SCL SDA S 起始 P 停止 D7 D6 D5 D4 D3 D2 D1 D0 ACK SCL高电平:数据稳定 SCL低电平:数据允许变化

1.3 I2C总线拓扑结构

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

拓扑特点:
  • 总线型:所有设备共享同一组SCL/SDA线,无星型或环型结构。
  • 多主能力:多个主设备可以共存于同一总线,通过仲裁机制决定总线控制权。
  • 从设备数量:7位地址最多支持127个从设备(地址0x00为广播地址,0x01~0x7F可用)。
  • 线或逻辑:由于开漏结构,多个设备同时拉低SDA时不会短路,低电平优先。
I2C总线拓扑结构图 Rₚ 4.7kΩ Rₚ 4.7kΩ VDD (3.3V) SCL SDA 主设备 MCU / SoC 从设备1 温度传感器 从设备2 加速度计 从设备3 EEPROM 从设备4 RTC时钟 地址: 0x48 地址: 0x68 地址: 0x50 地址: 0x68

1.4 数据传输流程

一次完整的I2C数据传输遵循固定的字节序列:

步骤 发送方 数据内容 说明
1 主设备 起始条件 (S) SCL高时SDA下降沿
2 主设备 7位从地址 + R/W位 高7位为地址,最低位为读写方向(0=写,1=读)
3 从设备 应答位 (ACK) 从设备拉低SDA表示确认
4 主设备 寄存器地址 (1~2字节) 指定要读写的内部寄存器
5 从设备 应答位 (ACK) 从设备确认收到寄存器地址
6 主/从设备 数据字节 (1~N字节) 根据R/W位决定数据流向
7 接收方 应答位 (ACK/NACK) 每字节后接收方应答
8 主设备 停止条件 (P) SCL高时SDA上升沿
常见错误: 在读取传感器数据时,主设备必须在最后一个数据字节后发送NACK(不应答),然后发送停止条件,以通知从设备停止发送。如果发送ACK,从设备会继续发送下一个字节,导致总线挂死。

1.5 地址与仲裁机制

设备地址: I2C从设备地址通常为7位,在传输时左移1位,最低位为读写标志位。例如,地址0x48(7位)在写操作时发送0x90(0x48 << 1 | 0),读操作时发送0x91(0x48 << 1 | 1)。

总线仲裁: 当多个主设备同时尝试控制总线时,通过SDA线的“线与”特性进行仲裁。每个主设备在发送数据的同时监测SDA电平,如果发现自己发送高电平而SDA为低电平,则判定失去仲裁,立即释放总线。

仲裁规则:
  • 仲裁在SCL高电平期间进行。
  • 发送低电平的主设备赢得仲裁。
  • 失去仲裁的主设备必须转为从模式,不再驱动SDA。
  • 仲裁不会丢失数据,因为赢得仲裁的设备继续正常传输。
I2C总线仲裁过程示意图 主设备A 主设备B SDA总线(线与结果) A发送低电平,B发送高电平 A赢得仲裁,B释放总线 仲裁无损:数据不丢失 赢得仲裁的设备继续传输

1.6 与传感器数据采集的关联

在《I2C外设驱动结合中断处理实现传感器数据采集》课程中,I2C总线协议是底层通信基础。传感器作为I2C从设备,通常具有以下特征:

  • 固定或可配置的I2C地址:例如温度传感器LM75的地址为0x48(AD0引脚接地时)。
  • 内部寄存器映射:通过I2C读写寄存器来配置采样率、读取转换结果、获取状态标志。
  • 中断输出引脚:传感器通常提供INT引脚,当数据准备好或事件发生时触发中断,通知MCU读取数据。
  • 多字节读取:传感器数据通常为16位或24位,需要连续读取多个字节。