1.概念:串行的、半双工的总线,主要应用于近距离,低速的芯片之间的通信,IIC有两根线,
SDA------->数据收发
SCL------->通信双方的时钟的同步
想这样两个芯片都挂到对应的总线上就可以实现通信
IIC总线上可以挂很多的器件,这些器件即可以作为主机也可以作为从机,那么总线是如何区分这些器件?通过器件的地址
2.通信的过程:
由主机发起启用总线,这个时候其他器件就会知道总线被占用就不会去启动总线
-
主机发送一个字节:字节里面指明要和谁通信和通信的方向是读还是写,这个时候其他器件就回去比较自己的器件地址,看看是不是自己,这个时候确定通信方向之后后面就不能改变通信方向知道通信结束
-
从机对比自己是在叫自己之后就会回应主机
-
发送器发送数据
-
接收器发送回应信号
-
不断循环4、5
-
主机发起停止信号,释放总线
3.信号
1)起始信号
2)停止信号
3)应答信号
4)发送数据信号:寻址或者数据
4.总线在空闲的时候SDA和SCL都处在高电平
起始:在SCL为高电平时,SDA由高变低
停止:在SCL为高电平时,SDA由低变高
字节发送和应答
数据为是8位,先发高为再发低位(1表示高,0表示低),之后接收器会发一位应答位(SCL为低的时候发),0表示应答
4.解决同步问题
比如发送方发送数据1111 0000 接收方怎么知道连续发了几个1几个0,这里解决的方法不同于串口,串口主要是依靠波特率,和每次只能发送一个字节来解决时差问题但是IIC是使用同步解决。
在SCL为低的时候发送方修改自己的电信号为自己想要发送的信号,在SCL为高的时候接收方就会去总线上读取SDA的数据,这个时候发送方的电信号不能变,不然接收方就不知道你是1还是0,这样就发一个数据位就接收方就收一个bit,不会存在时间误差。
5.典型的IIC时序
1)主机发从机收
2)主机收从机发
3)先主机发几个数从机接收后,想让从机发主机收
这里重新启动之前之所以没有P是因为,发起停止信号后总线使用权可能被抢走
一般的通信流程是:
主机发起起始信号---->主机发送目标器件的地址+读写方向--->器件应答------主机发送从机的寄存器地址----->器件应答。