2. I2C协议基础:I2C总线物理层、电气特性、主从设备、地址、读写操作时序

I2C(Inter-Integrated Circuit)总线是由Philips公司(现NXP)开发的一种同步、多主从、串行通信总线。它仅需两根线(SCL与SDA)即可实现设备间的通信,广泛应用于嵌入式系统中连接微控制器与EEPROM、传感器、ADC/DAC等外设。本章将深入剖析I2C总线的物理层、电气特性、设备角色、地址机制以及完整的读写操作时序,为后续在S32K3平台上开发I2C驱动打下坚实基础。

2.1 I2C总线物理层与电气特性

I2C总线由两根双向信号线构成:

  • SCL(Serial Clock Line):串行时钟线,由主设备驱动,用于同步数据传输。
  • SDA(Serial Data Line):串行数据线,用于传输地址和数据。

两根线均通过上拉电阻连接到电源电压(VDD)。当总线空闲时,SCL和SDA均保持高电平。设备通过开漏(Open-Drain)或开集电极(Open-Collector)输出驱动总线为低电平,高电平则由上拉电阻实现。

关键电气特性:
  • 上拉电阻:典型值1kΩ~10kΩ,取决于总线电容和通信速率。高速模式需更小阻值。
  • 总线电容:受限于线长和设备数量,标准模式最大400pF。
  • 逻辑电平:VIL最大为0.3×VDD,VIH最小为0.7×VDD。
  • 最大速率:标准模式100kbit/s,快速模式400kbit/s,快速+模式1Mbit/s,高速模式3.4Mbit/s。
设计提示:在S32K3平台上,I2C模块内部集成了数字滤波和毛刺抑制功能,可有效提升抗干扰能力。但外部上拉电阻仍需根据总线负载合理选择,建议在原型设计时预留不同阻值的焊盘。
I2C总线物理连接示意图 主设备 (Master) S32K3 从设备 1 EEPROM (0x50) 从设备 2 温度传感器 (0x48) Rp Rp Rp VDD SDA SCL 所有设备通过开漏输出连接到SDA和SCL,空闲时总线被上拉电阻拉高

2.2 主设备与从设备角色

I2C总线是一种多主从总线,总线上可以挂载多个主设备和多个从设备。但在任意时刻,只能有一个主设备控制总线(即驱动SCL并产生起始条件)。

角色 功能描述 典型示例
主设备 (Master) 产生时钟信号SCL、发起起始条件、发送从设备地址、控制数据传输方向(读/写)、产生停止条件。 S32K3微控制器
从设备 (Slave) 监听总线、识别自身地址、响应主设备的读写请求、发送或接收数据。 EEPROM (AT24Cxx)、温度传感器 (LM75)
多主仲裁 当多个主设备同时尝试控制总线时,通过SDA线的线与逻辑进行仲裁,丢失仲裁的主设备转为从模式。 多MCU系统
注意事项:在S32K3的I2C驱动开发中,通常将S32K3配置为主设备,外设(如EEPROM)作为从设备。多主模式虽然硬件支持,但在实际汽车电子应用中较少使用,因为需要复杂的仲裁和总线管理逻辑。

2.3 设备地址机制

I2C总线上的每个从设备都有一个唯一的7位或10位地址。主设备通过发送地址来选择要通信的从设备。地址在起始条件之后立即发送,占用第一个字节的高7位(或10位地址的前两个字节)。

2.3.1 7位地址格式

7位地址是最常用的格式。地址字节的组成如下:

  • Bit[7:1]:7位从设备地址。
  • Bit[0] (R/W):读写位。0表示写操作,1表示读操作。

例如,常见的EEPROM AT24C02的7位地址为 0b1010000(即0x50)。其地址字节为:

  • 写操作:0b10100000 (0xA0)
  • 读操作:0b10100001 (0xA1)

2.3.2 10位地址格式

10位地址用于需要更多从设备的场景。第一个字节的高5位固定为 11110,后跟地址的高2位;第二个字节为地址的低8位。

地址分配注意事项:
  • 7位地址范围:0x00~0x7F,其中0x00为通用呼叫地址,0x01~0x03为保留地址。
  • 同一总线上每个从设备地址必须唯一,否则会导致总线冲突。
  • 许多从设备(如EEPROM)通过硬件引脚(A0、A1、A2)配置地址的低几位,允许同一总线上挂载多个相同型号的设备。
7位I2C地址字节结构 A6 A5 A4 A3 A2 A1 A0 R/W 7位从设备地址 (高7位) 读写控制位 示例:EEPROM地址0x50 → 写字节0xA0 (10100000) | 读字节0xA1 (10100001)

2.4 读写操作时序

I2C总线的数据传输遵循严格的时序协议。每次通信以起始条件(START)开始,以停止条件(STOP)结束。数据在SCL高电平时采样,在SCL低电平时变化。

2.4.1 基本信号定义

信号 定义 时序要求
起始条件 (S) SCL高电平时,SDA从高电平切换到低电平。 tHD;STA ≥ 4μs (标准模式)
停止条件 (P) SCL高电平时,SDA从低电平切换到高电平。 tSU;STO ≥ 4μs (标准模式)
数据有效 SCL高电平时,SDA上的数据必须保持稳定。 tHD;DAT ≥ 0ns
应答 (ACK) 接收设备在第9个SCL周期将SDA拉低,表示成功接收。 tSU;DAT ≥ 250ns
非应答 (NACK) 接收设备在第9个SCL周期保持SDA高电平,表示未接收或结束传输。 —

2.4.2 写操作时序(主设备写数据到从设备)

写操作流程如下:

  1. 主设备发送起始条件 (S)。
  2. 主设备发送7位从设备地址 + 写位 (0)。
  3. 从设备发送应答位 (ACK)。
  4. 主设备发送寄存器/内存地址(1字节或2字节,取决于设备)。
  5. 从设备发送应答位 (ACK)。
  6. 主设备发送数据字节(可连续发送多个字节)。
  7. 每发送一个字节,从设备发送应答位 (ACK)。
  8. 主设备发送停止条件 (P)。

2.4.3 读操作时序(主设备从从设备读取数据)

读操作通常需要先发送写操作来设置寄存器地址,然后重新发送起始条件进行读操作:

  1. 主设备发送起始条件 (S)。
  2. 主设备发送7位从设备地址 + 写位 (0)。
  3. 从设备发送应答位 (ACK)。
  4. 主设备发送寄存器/内存地址。
  5. 从设备发送应答位 (ACK)。
  6. 主设备发送重复起始条件 (Sr)。
  7. 主设备发送7位从设备地址 + 读位 (1)。
  8. 从设备发送应答位 (ACK)。
  9. 从设备发送数据字节(主设备读取)。
  10. 主设备发送应答位 (ACK) 表示继续读取,或发送非应答位 (NACK) 表示结束。
  11. 主设备发送停止条件 (P)。
实战要点:在S32K3的I2C驱动中,重复起始条件(Repeated START)是实现连续读写的关键。它允许在不释放总线的情况下切换数据传输方向,避免其他主设备介入,保证原子性操作。
I2C写操作时序图(主设备 → 从设备) SCL SDA S 地址 (0xA0) ACK 寄存器地址 ACK 数据字节1 ACK 数据字节2 ACK P 主设备发送起始条件 → 从设备地址+写位 → 从设备ACK → 寄存器地址 → 从设备ACK → 数据字节 → 从设备ACK → 停止条件 数据有效性规则 数据在SCL高电平时采样(稳定),在SCL低电平时允许变化

2.5 时序参数与速率选择

I2C总线定义了多种工作模式,不同模式下的时序参数不同。S32K3的I2C模块支持标准模式、快速模式和快速+模式。以下是标准模式和快速模式的关键时序参数对比:

参数 符号 标准模式 (100kHz) 快速模式 (400kHz) 单位
SCL时钟频率 fSCL 0 ~ 100 0 ~ 400 kHz
保持时间(起始条件) tHD;STA 4.0 0.6 μs
建立时间(停止条件) tSU;STO 4.0 0.6 μs
数据保持时间 tHD;DAT 0 0 μs
数据建立时间 tSU;DAT 250 100 ns
SCL低电平时间 tLOW 4.7 1.3 μs
SCL高电平时间 tHIGH 4.0 0.6 μs
上升时间 tR 1000 300 ns
下降时间 tF 300 300 ns
S32K3配置建议:在S32K3的I2C驱动初始化时,需要根据目标速率配置I2C模块的时钟分频器和SDA保持时间。对于EEPROM读写,通常使用标准模式(100kHz)或快速模式(400kHz)。如果总线负载较重(多个从设备或长走线),建议使用标准模式以保证信号完整性。

2.6 本章小结