I2C由一条时钟线和一条数据线组成,我们先看两张图。
I2C的波形
I2C协议基本形式 I2C的输入输出结构采用的是开漏的结构 。 开漏结构 不能够自主得到高电平,所以需要通过外部上拉电阻 来的实现 I2C 通信过程中的高电平。上拉电阻 的大小取决于 I2C 不同模式时的灌电流大小。这种结构作为逻辑输出时候,必须要有外部上拉,一般是通过电阻加到VCC电源,平时保持高电平,当输入低电平时也可被拉低,也就是说此时的开漏输出的可以作为外部的输入I/O口。 因为多个设备共用一条I2C总线,如果 I2C 使用的是推挽输出,假设在某个时间,A设备和B设备刚好在不同的电平输出,则会引起短路。
下图是I2C 获得高低电平的情景。
如果我们不接上拉电阻,设备的I2C SCL SDA引脚是浮空状态,浮空的意思是没有确定的电平,可能是高,也可能是低。而根据I2C的协议,在总线空闲期间,SDA和SCL都是高电平,当SDA出现下降沿时信号传输开始,如果没有确定的电平,一旦有外部的干扰,则可能会误启动I2C。 上拉电阻取值上面我们已经说到,由于I2C开漏输出需要输出高电平我们就需要加上拉电阻。那上拉电阻该如何取值呢?通常情况下我们使用4.7kΩ,就能适用于大多数应用场景。如果需要更精确的电阻值,我们可以使用以下公式: Rmin = (Vcc - Vol) / Iol Rmax=Tr / (0.8473 * Cb) R 是所需的上拉电阻值(Ω); Vcc 是供电电压(伏特,V); Vol 是I2C总线上的输出电平电压(通常是0.4V); Iol 是I2C总线上的输出电流(通常是3mA); Tr是上升沿时间,Cb是总线电容,0.8473是标准上升沿时间; 通过上面这个公式可以计算出合适的取值。由上可知,供电电压决定上拉电阻的最小值,总线负载电容决定上拉电阻的最大值。 常见的上拉电阻阻值有1k、1.5k、2.2k、4.7k、5.1k、10k等。 |