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。
2.2 主设备与从设备角色
I2C总线是一种多主从总线,总线上可以挂载多个主设备和多个从设备。但在任意时刻,只能有一个主设备控制总线(即驱动SCL并产生起始条件)。
| 角色 | 功能描述 | 典型示例 |
|---|---|---|
| 主设备 (Master) | 产生时钟信号SCL、发起起始条件、发送从设备地址、控制数据传输方向(读/写)、产生停止条件。 | S32K3微控制器 |
| 从设备 (Slave) | 监听总线、识别自身地址、响应主设备的读写请求、发送或接收数据。 | EEPROM (AT24Cxx)、温度传感器 (LM75) |
| 多主仲裁 | 当多个主设备同时尝试控制总线时,通过SDA线的线与逻辑进行仲裁,丢失仲裁的主设备转为从模式。 | 多MCU系统 |
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)配置地址的低几位,允许同一总线上挂载多个相同型号的设备。
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 写操作时序(主设备写数据到从设备)
写操作流程如下:
- 主设备发送起始条件 (S)。
- 主设备发送7位从设备地址 + 写位 (0)。
- 从设备发送应答位 (ACK)。
- 主设备发送寄存器/内存地址(1字节或2字节,取决于设备)。
- 从设备发送应答位 (ACK)。
- 主设备发送数据字节(可连续发送多个字节)。
- 每发送一个字节,从设备发送应答位 (ACK)。
- 主设备发送停止条件 (P)。
2.4.3 读操作时序(主设备从从设备读取数据)
读操作通常需要先发送写操作来设置寄存器地址,然后重新发送起始条件进行读操作:
- 主设备发送起始条件 (S)。
- 主设备发送7位从设备地址 + 写位 (0)。
- 从设备发送应答位 (ACK)。
- 主设备发送寄存器/内存地址。
- 从设备发送应答位 (ACK)。
- 主设备发送重复起始条件 (Sr)。
- 主设备发送7位从设备地址 + 读位 (1)。
- 从设备发送应答位 (ACK)。
- 从设备发送数据字节(主设备读取)。
- 主设备发送应答位 (ACK) 表示继续读取,或发送非应答位 (NACK) 表示结束。
- 主设备发送停止条件 (P)。
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 |