SDA使用上拉电阻?
设备的SDA中有一个三极管,使用开极/开漏电路(三极管是开极,CMOS管是开漏,作用一样),如下图:
真值表如下:
从真值表和电路图我们可以知道:
-
当某一个芯片不想影响SDA线时,那就不驱动这个三极管
-
想让SDA输出高电平,双方都不驱动三极管(SDA通过上拉电阻变为高电平)
-
想让SDA输出低电平,就驱动三极管
从下面的例子可以看看数据是怎么传的(实现双向传输)。 举例:主设备发送(8bit)给从设备
-
前8个clk
-
从设备不要影响SDA,从设备不驱动三极管
-
主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管
-
-
第9个clk,由从设备决定数据
-
主设备不驱动三极管
-
从设备决定数据,要发出回应信号的话,就驱动三极管让SDA变为0
-
从这里也可以知道ACK信号是低电平(从设备回应主设备)
-
从上面的例子,就可以知道怎样在一条线上实现双向传输,这就是SDA上要使用上拉电阻的原因。
SCL使用上拉电阻?
在第9个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把SCL拉低。假设IIC主设备发送一串数据给从设备,从设备接收到一段数据后处理不过来,这时就可以拉低SCL告诉主设备不要再发数据过来,从设备处理完毕后再把SCL拉成高电平,主设备继续发送数据给从设备。
当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。 当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。