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时钟的配合下按位传输,遵循以下规则:
- 数据有效性:在SCL高电平期间,SDA上的数据必须保持稳定;只有在SCL低电平期间,SDA才允许变化。
- 起始条件(S):SCL为高电平时,SDA由高电平向低电平跳变,表示传输开始。
- 停止条件(P):SCL为高电平时,SDA由低电平向高电平跳变,表示传输结束。
- 应答(ACK/NACK):每传输完一个字节(8位),接收方在第9个时钟周期将SDA拉低(ACK)或保持高电平(NACK)以回应。
避坑提示: 起始条件和停止条件只能由主设备产生。从设备不允许主动产生起始或停止条件,否则会导致总线冲突。
1.3 I2C总线拓扑结构
I2C总线采用多主从总线拓扑,所有设备通过SCL和SDA两根线并联连接。每个设备都有一个唯一的地址(7位或10位),主设备通过地址选择要通信的从设备。
拓扑特点:
- 总线型:所有设备共享同一组SCL/SDA线,无星型或环型结构。
- 多主能力:多个主设备可以共存于同一总线,通过仲裁机制决定总线控制权。
- 从设备数量:7位地址最多支持127个从设备(地址0x00为广播地址,0x01~0x7F可用)。
- 线或逻辑:由于开漏结构,多个设备同时拉低SDA时不会短路,低电平优先。
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。
- 仲裁不会丢失数据,因为赢得仲裁的设备继续正常传输。
1.6 与传感器数据采集的关联
在《I2C外设驱动结合中断处理实现传感器数据采集》课程中,I2C总线协议是底层通信基础。传感器作为I2C从设备,通常具有以下特征:
- 固定或可配置的I2C地址:例如温度传感器LM75的地址为0x48(AD0引脚接地时)。
- 内部寄存器映射:通过I2C读写寄存器来配置采样率、读取转换结果、获取状态标志。
- 中断输出引脚:传感器通常提供INT引脚,当数据准备好或事件发生时触发中断,通知MCU读取数据。
- 多字节读取:传感器数据通常为16位或24位,需要连续读取多个字节。