IIC详解
本文若有不够严谨的地方,欢迎大家指出,一起进步~~
一、背景
作为才入职的一枚萌新(刚毕业,因为学校里出了一点事情所以现在才找工作入职),进了一家行业内不错的公司。因为走的是社招流程,所以导师培养我的方法不太一样,第一周就直接做实际项目了(我也不知道应届生的培训是怎样的,但估计要比我全面的多555555)。 我做的第一个项目是关于IIC的项目,可是我在大学期间并没有很深入的了解IIC,这可怎么办呀…还好导师给了我足够的时间去学习(万幸)。
二、IIC概念
IIC是一种同步串行的总线。IIC有两条线,分别是数据线SDA和时钟线SCL。所有数据都是通过SDA线传递的,SCL线并不传输数据,它只是提供时钟周期。
三、IIC具体信号
IIC的起始信号:SCL为高电平时,SDA出现下降沿,代表起始信号;
IIC发送数据“1”:SDA为高电平时,SCL也为高电平。注意是要在SDA为高电平时,SCL也为高电平,这中间有个包含关系;
IIC发送数据“0”:SDA为低电平时,SCL为高电平。同样的,这里也有一个包含关系。
IIC发送停止信号:SCL为高电平时,SDA为上升沿。
总结一下:当SCL为高电平时,SDA的改变代表了起始或停止信号;若SDA线想传输数据,必须在SCL为低电平时进行改变;只有在SDA线与SCL线均保持稳定时才能代表发送了一个数据。
四、IIC实际应用
起始很多小伙伴是知道我上面所说的那些部分的,但一到具体应用上面就卡壳了,这是因为大家没有实践过,对IIC的理解不够深导致的,下面我来带领大家完成一个利用IIC协议完成的具体操作。
我们以8025T为例,这个器件和我们常用的ds12c887一样是读写时间的一个芯片,不同之处在于它使用了IIC通讯。 下图是它的读写时序:
上面是写时序,下面是读时序。 我们先从写时序看起:
(1)发送起始信号;
(2)发送7位从机地址;
(3)发送读写标志位;
(4)等待从机返回的ACK;
(5)发送要写入的寄存器地址;
(6)等待从机返回的ACK;
(7)发送8位数据;
(8)等待从机返回的ACK;
(9)发送停止信号;
注:若要连续发送数据,可以重复第七步与第八步操作,寄存器地址会自动加1。
下面来看读时序:
(1)发送起始信号;
(2)发送7位从机地址;
(3)发送读写标志位;
(4)等待从机返回的ACK;
(5)发送要写入的寄存器地址;
(6)等待从机返回的ACK;
(7)发送起始信号;
(8)发送7位从机地址;
(9)发送读写标志位;
(10)等待从机返回的ACK;
(11)发送8位数据;
(12)向从机发送ACK/NOACK;
(13)发送停止信号;
注:当只读一个字节的数据时,我们只用在最后发一个NOACK即可,若是连续读(寄存器地址自动增加),要在处最后一组数据外发送ACK,在最后一组数据后面发送NOACK,最后发送停止信号即可。