使用I2C,可以实现多设备的数据通信,这些设备通过两根线连接,SCL和SDA。
SCL控制时钟,SDA控制数据。这些设备有着共同的时钟总线,因此I2C是同步的。
他们虽然可以相互传递数据,但是只有一条数据线进行数据传输,因此他I2C是半双工的。
如何通信?
地址确定
I2C总线上连接了许多设备,如果单片机要发送给某一个设备或者获取某一个设备上的数据那么要如何确定单片机的目标设备呢?
为了解决这个问题,我们其实会给I2C设备进行地址设置:
下面是一个AD24C02的芯片,它基于I2C协议进行通信。
A0、A1、A2、SCL、SDA都是用于I2C总线通信的。
下面是设置设备的地址:
前面的1010是芯片厂商规定的后面四位则是由用户自己决定,
1 0 1 0 A2 A1 A0 则就是代表了设备的地址,而R/W则决定单片机向芯片写入数据还是读取数据。写操作R/W=0,读操作R/W=1。
例如现在我为AD24C02的A2、A1、A0都接低电平,现在我想向这个设备写数据那么我首先应该向I2C总线上发送一个 1 0 1 0 0 0 0 0 的数据,即十六进制表示为0xC0。
发送数据
设备的地址确定了,那么我们如何向I2C总线发送数据呢?
在没有进行通信的空闲状态SCL和SDA都处于高电平。
当SCL处于高电平状态时,SDA变换为低电平,则是表示数据传输的开始。与之相对的结束信号则是SDA在SCL高电平期间变化为高电平。
发送完起始信号后,我们就可以进行发送 设备地址+读写位 来寻找到目标设备同时决定读写操作。
当发送为开始信号后,当SCL高电平的时候,从机会读取SDA上的数据,在SDA处于高电平期间如果SDA发生变化会导致重新发送开始信号或者结束信号。
发送1010000:
发送完 设备地址+读取位 后,从机会发送一位应答信号,如果为0表示应答,为1表示非应答(设备可能不存在,或者设备已经操作完毕)。
之后的操控就要看对应芯片的数据手册了。