在 I²C 硬件设计中,通信异常不一定是软件配置问题。总线电容过大、上拉电阻选择不合理、电平不兼容,都可能导致通信失败。
理解 I²C,不能只停留在通信时序,还需要从电气特性、RC 充放电、总线控制机制等方面分析。
本文重点讨论几个实际设计中容易遇到的问题。
一、为什么 I²C 的通信速率会受到总线电容限制?
I²C 的 SDA 和 SCL 通常采用开漏输出结构,并通过上拉电阻连接到电源。
这种结构有一个重要特点:
- 输出低电平:器件主动将总线拉低。
- 输出高电平:器件释放总线,由上拉电阻将总线拉高。
因此,I²C 总线的高电平不是由器件主动驱动产生的,而是通过上拉电阻对总线电容充电形成的。
1. 总线电容如何影响上升时间?
总线电容主要来自:
- 芯片引脚的输入电容;
- PCB 走线和过孔的寄生电容;
- 连接器、线缆及其他器件带来的电容。
当器件释放总线后,上拉电阻开始给总线电容充电,其过程可以近似看作 RC 充电过程。
总线电压随时间变化:
V(t)=VDD(1−e−t/(RpCbus)) V(t)=V_{DD}\left(1-e^{-t/(R_pC_{bus})}\right)V(t)=VDD(1−e−t/(RpCbus))
其中:
- (R_p):上拉电阻;
- (C_{bus}):总线等效电容;
- (V_{DD}):上拉电源电压。
可以看出,上拉电阻越大、总线电容越大,电压上升越慢。
I²C 规范中的上升时间通常定义为总线电压从 30% 上升到 70% 所需的时间,可近似表示为:
tr≈0.8473RpCbus t_r \approx 0.8473R_pC_{bus}tr≈