嵌入式I2C信号线为何加上拉电阻
嵌入式I2C信号线为何加上拉电阻
在嵌入式系统设计中,I2C(Inter-Integrated Circuit)总线是一种常用的串行通信协议。在I2C信号线上,我们经常会看到上拉电阻的身影,但为什么需要这些电阻?它们的取值又是如何确定的?本文将为您详细解答这些问题。
IIC(I2C)是一个两线串行通信总线,包含一个SCL(时钟)信号和SDA(数据)信号。SCL信号由主设备发出,而SDA信号是一个双向信号,用于数据的发送和接收。
在设计IIC信号电路时,我们会在SCL和SDA线上加一个上拉电阻。这是为什么呢?
为什么需要上拉电阻?
主要原因在于IIC芯片的SDA和SCL引脚采用的是开漏输出方式,即只有一个NMOS管。这种输出方式与推挽输出(有两个MOS管)不同。
- 当芯片SDA和SCL引脚的MOS管导通时,IIC信号线电平为低电平。
- 当MOS管关闭时,如果没有上拉电阻,IIC信号线将处于高阻状态,电平是不确定的。因为开漏输出本身无法提供高电平输出能力。
因此,加上上拉电阻后,当MOS管关闭时,IIC信号线上的电平就能稳定在确切的高电平。
此外,当多个IIC设备通过总线连接时,需要实现“线与”逻辑。开漏输出正好能满足这个需求:只要有一个设备的引脚输出低电平,相应的总线信号就会变为低电平。如果使用推挽输出,多个设备共用一条总线很容易导致芯片损坏。
上拉电阻的取值原则
IIC信号的上拉电阻阻值不能太大,也不能太小。
- 阻值不能太大:IIC芯片的SCL和SDA引脚存在寄生电容,加上走线的寄生电容,整个总线相当于接了一个负载电容Cl。上拉电阻过大时,总线高电平的驱动能力会变差。总线电平从0到1变化时,等效为RC充电电路,电阻越大,波形上升沿越慢,可能影响IIC时序,导致误码。
IIC信号的上升时间可以通过公式计算:
Tr = 0.8473 * R * Cl
其中Cl是IIC总线的等效负载电容。
- 阻值不能太小:如果电阻太小,当IIC引脚输出低电平时,流过芯片的电流会增大,可能导致低电平抬升,严重时甚至烧坏芯片。通常要求IIC引脚低电平时的电流小于3mA。对于3.3V供电的系统,电阻值应大于:
R > (3.3 - VoL) / 3KΩ = 0.96KΩ
其中VoL是IIC引脚低电平时的最大电压,一般为0.4V。
综合考虑,IIC信号上拉电阻的常用值为4.7KΩ,一般在1KΩ到10KΩ之间。如果总线较长或连接设备较多,可以适当减小电阻值。
多个设备是否需要多个上拉电阻?
如果IIC总线上连接了多个设备,是否每个设备都需要加上拉电阻?
答案是否定的。实际上,我们只需要在SDA和SCL总线上合适的位置各加一个上拉电阻即可。如果每个设备都加上拉电阻,这些电阻实际上是并联的,会减小总电阻值。上拉电阻的位置一般没有严格要求,通常加在总线的末端。
通过本文的介绍,相信您已经对I2C总线上拉电阻的作用和选型有了清晰的认识。这不仅是硬件设计中的一个小细节,更是理解总线通信原理的重要一环。