IIC(Inter-Integrated Circuit),中文翻译为集成电路总线,它是一种串行通信总线。前面已经说过,数据是按逐位顺序传输的方式就是串行通信,那么IIC是如何通信的呢。
前面在讲UART时提到过通信传输所需要的几个必要条件,首先得知道什么时候通信开始,什么时候通信结束,然后就是如何去解析数据了,根据这几点,我们来谈谈IIC是如何实现通信的。
为了方便理解,我们拿UART中的RS232来做对比。我们知道RS232使用两根线通信,一个发,一个收,通信的开始和停止以及数据读取都是针对同一个通信线的。而IIC也使用了两根线,但却是一根作时钟信号线,另一根作数据线,这样判断通信开始和停止与解析数据就分开了。这样看起来,区分起止信号与数据电平是不是就更加容易些了,但是嘛由于只有一根数据线了,缺点就是无法同时收发了,因此它是半双工通信的。
下面直接说IIC的协议标准
从图上可以看到,IIC规定的
起始条件:在SCL为高时,SDA由高变低
停止条件:在SCL为高时,SDA由低变高
接下来就是数据收发了
对于发送端来说,在SCL为低时,发送端将数据位依次放到SDA线上,高位先行(MSB),放完一位后SCL拉高。等SCL再次为低时,发送端再将数据位放到SDA线上,循环8次,即可发出一个字节。
对于接收端来说,在SCL为低时,发送端正在发送数据,所以接收端保持静默,等SCL为高时,接收端读取SDA电平,之后循环8次,完成一个字节的读取。每次接收完一个字节后,必须发送一个应答告知发送端接收成功。
在此过程中,每次发送或读取一个位的时间,就跟通信速率有关了,这个也是需要收发双方提前确定好的。
讲完基本的通信原理,再说下IIC的实际应用吧。
由于IIC的特性,可以很方便的将多个设备级联到一起,且每个设备都可以收发,也就可以构成一主多从或多主多重的系统。那么这么多设备接在一起,总线又是共享的,如何找到想要通信的设备呢,答案是器件地址。
当一个IIC主机想要与IIC从机通信时,它会先发送一个字节寻址指令,其中7位为器件地址,1位为方向,即读还是写。此时其它设备收到后比对自身器件地址,发现不符后不做回应,只有匹配的设备才会发送应答。
然后主机在收到应答后继续发送后面的数据。一般的IIC器件,比如EEPROM,此时会发送要写入或读取的地址,如往0x0000地址写入数字1,那么会先发送0x0000,等到回码后再发送0x01,之后在收到应答后结束通信。(传输过程中每个字节发送后都有应答)
从上面可以知道,IIC使用了7位器件地址,也就是说总线最大只能容纳127种不同设备,是不是有点少了。其实IIC标准也考虑到这点,所以还有另一种10位地址方案,将器件7位地址与引脚3位地址相结合。但是这样的话,原先的寻址指令长度就得发生变化,需要使用2个字节。总共16位分两个字节发送,其中第一个字节的没用到的前5位被固定为“11110”,如下图所示。