2. I2C基础:协议概述、两线制功能、半双工通信原理、开漏输出与上拉电阻
2.1 I2C协议概述
I2C(Inter-Integrated Circuit)总线由Philips(现NXP)于1980年代开发,是一种同步、多主从、半双工的串行通信协议。在车载嵌入式系统中,I2C广泛用于连接传感器(如温度、压力)、EEPROM、ADC/DAC、触摸控制器、音频编解码器等中低速外设。其核心优势在于仅需两根信号线即可挂载多个设备,极大节省了MCU的GPIO引脚资源。
车载应用场景: 在车载信息娱乐系统、T-Box、域控制器中,I2C常用于读取环境光传感器、控制音频音量、配置PMIC寄存器等。标准模式(100kHz)和快速模式(400kHz)最为常见,高速模式(3.4MHz)在车载中较少使用,因其对总线电容和信号完整性要求更高。
2.2 两线制:SCL与SDA功能
I2C总线仅由两根双向信号线构成:
| 信号线 | 全称 | 功能描述 | 方向 |
|---|---|---|---|
| SCL | Serial Clock Line | 由主设备产生的时钟信号,同步数据传输。每个时钟脉冲传输1位数据。 | 主设备→从设备 |
| SDA | Serial Data Line | 传输地址、读写标志、数据以及应答位。数据在SCL低电平时变化,高电平时采样。 | 双向(主↔从) |
所有连接到I2C总线的设备都通过这两根线进行通信。每个从设备拥有唯一的7位或10位地址,主设备通过发送地址来选择目标从设备。总线上的设备数量仅受限于最大总线电容(通常为400pF)和地址空间。
2.3 半双工通信原理
I2C采用半双工通信模式,即在同一时刻,数据只能在一个方向上进行传输。主设备与从设备之间通过SDA线交替发送和接收数据。通信过程由主设备发起,并始终控制SCL时钟。
一次典型的I2C数据传输流程如下:
- 起始条件(START): SCL为高电平时,SDA由高电平切换到低电平。
- 发送从设备地址: 主设备发送7位或10位地址,后跟1位读写标志(0=写,1=读)。
- 从设备应答(ACK): 从设备在第9个SCL周期将SDA拉低,表示确认。
- 数据传输: 每8位数据后跟随1位应答位。写操作时主设备发送数据;读操作时从设备发送数据。
- 停止条件(STOP): SCL为高电平时,SDA由低电平切换到高电平。
半双工 vs 全双工: 与SPI的全双工(同时发送和接收)不同,I2C在半双工模式下,主设备发送地址后必须等待从设备应答,然后才能继续发送或接收数据。这种机制简化了总线仲裁,但降低了理论吞吐量。
2.4 开漏输出与上拉电阻
I2C总线的物理层核心是开漏输出(Open-Drain)结构。每个设备的SCL和SDA引脚内部都是一个N沟道MOSFET,漏极开路连接到总线。设备只能将总线拉低(输出低电平),而不能主动驱动总线为高电平。总线的高电平由外部上拉电阻提供。
| 特性 | 开漏输出 | 推挽输出(对比) |
|---|---|---|
| 输出高电平 | 依赖外部上拉电阻 | 由内部电路主动驱动 |
| 输出低电平 | 内部MOSFET导通,拉低总线 | 内部MOSFET导通,拉低总线 |
| 多设备冲突 | 支持“线与”逻辑,不会短路 | 多个设备同时输出不同电平会导致短路 |
| 电平转换 | 通过选择不同VDD,可轻松实现3.3V与5V设备混合连接 | 需要额外的电平转换电路 |
上拉电阻的选型直接影响I2C总线的信号质量和最大通信速率。电阻值的选择需平衡上升时间、功耗和噪声容限:
- 最小电阻值(Rₚₘᵢₙ): 由VOL(最大低电平电压,通常0.4V)和IOL(最大灌电流,通常3mA)决定。Rₚₘᵢₙ = (VDD - VOL) / IOL。例如VDD=3.3V时,Rₚₘᵢₙ ≈ (3.3 - 0.4) / 0.003 ≈ 967Ω。
- 最大电阻值(Rₚₘₐₓ): 由总线电容Cb和要求的上升时间tr决定。Rₚₘₐₓ = tr / (0.8473 × Cb)。标准模式(100kHz)要求tr ≤ 1000ns,快速模式(400kHz)要求tr ≤ 300ns。
- 典型值: 对于大多数车载I2C应用(总线电容50~200pF),上拉电阻通常选择4.7kΩ(标准模式)或2.2kΩ(快速模式)。
车载设计注意事项: 在车载环境中,I2C总线可能受到电磁干扰(EMI)。过大的上拉电阻会使上升沿变缓,增加信号对噪声的敏感度;过小的上拉电阻会增加功耗并可能导致VOL超标。建议在PCB布局时,将上拉电阻靠近主设备放置,并确保SCL和SDA走线长度尽量相等,以减少信号偏移。
2.5 关键时序参数速查
下表列出了I2C标准模式和快速模式的关键时序参数,供驱动开发时参考:
| 参数 | 符号 | 标准模式 (100kHz) | 快速模式 (400kHz) | 单位 |
|---|---|---|---|---|
| SCL时钟频率 | fSCL | 0 ~ 100 | 0 ~ 400 | kHz |
| 保持时间(起始条件) | tHD;STA | 4.0 | 0.6 | μs |
| 低电平周期 | tLOW | 4.7 | 1.3 | μs |
| 高电平周期 | tHIGH | 4.0 | 0.6 | μs |
| 数据上升时间 | tr | ≤ 1000 | ≤ 300 | ns |
| 数据下降时间 | tf | ≤ 300 | ≤ 300 | ns |
| 总线电容 | Cb | ≤ 400 | ≤ 400 | pF |