目录
一、I2C通信简介
IIC支持总线挂载多设备,支持一主多从,多主多从。
一主多从:单片机作为主机,主导IIC总线的运行,挂载在IIC总线的所有外部模块都是从机,从机只有被主机点名之后才能控制IIC总线 ,不能在未经允许的情况下去碰IIC总线,防止冲突。
多主多从:在总线上任何一个模块都可以主动跳出来,作为主机。但是同一个时间只能有一个主机,不然会发生总线冲突,在总线冲突是,IIC协议会进行仲裁,仲裁胜利的一方取得总线控制权,失败的变回从机。
二、硬件电路
如图,是一个IIC的一个典型电路模型(一主多从),左边CPU就是我们的单片机,作为总线的主机,主机的权力很大,包括对SCL时钟线的完全控制,任何时候都是主机完全控制SCL线。 另外,在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机。
从机的权力比较小对于SCL时钟线,在任何时刻都只能被动的获取,从机不允许控制SCL线,对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机命令后,或者从机应答的时候,从机才能短暂地取得SDA的控制权。这是一主多从模型中协议的规定。
设备的SCL和SDA均配置成开漏输出模式:
SCL线:
主机拥有SCL的绝对控制权,所以主机的SCL可以可以配置成推挽输出。
所有从机的SCL都配置成浮空输入或者上拉输入,数据流向是主机发送,所有从机接收。
SDA线:
因为SDA是半双工协议,所以主机的SDA在发送的时候是输出,在接收的时候是输入。同样,从机的SDA也会在输入和输出之间反复切换,如果总线时序没协调好,可能会发生两个引脚同时处于输出的状态,如果两个引脚输出的是高低电平,那就会导致电源短路了。
所以为了防止这种情况出现,IIC的设计是,禁止所有输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构.
三、IIC时序基本单元
在IIC总线处于空闲状态时,SCL和SDA都处于高电平状态,也就是没有任何一个设备去碰SCL和SDA,SCL和SDA由外挂的上拉电阻拉至高电平,总线处于平静的高电平状态。
当主机需要进行数据收发时,首先就要打破总线的宁静,产生一个起始条件.
起始条件: SCL处于高电平,SDA产生一个下降沿,当从机捕获到这个信号时,就会进行自身的复位,等待主机的召唤,然后在SDA下降沿之后,主机要再把SCL拽下来,一方面是占用这个总线,另一方面也是方便基本单元的拼接,就是之后我们会保证,除了起始和终止条件,每个时序单元的SCL都是以低电平开始,低电平结束。
终止条件:SCL线回弹到高电平,SDA再回弹到高电平,产生一个上升沿,最后SCL和SDA都回到最初的高电平。
这个起始条件和终止条件就类似串口时序里的起始位和停止位。
在起始条件之后,这时就紧跟着一个发送一个字节的时序单元。
发送一个字节:
起始条件之后,第一个字节也必须是主机发送的,最开始SCL低电平,主机如果想发送0,就拉低SDA到低电平,如果想发送1,就让SDA回到高电平,在SCL低电平期间允许改变SDA的电平,当这一位放好之后,主机就让时钟线回到高电平,在高电平期间,从机读取SDA的时候,SDA不允许变化。SCL处于高电平之后,从机需要尽快读取SDA,一般都是在上升沿这个时刻,从机就已经读取完成了,因为时钟是主机控制的,从机并不知道上面时候就会产生下降沿了,你从机要是磨磨唧唧的,主机可不好等你的,所以从机在上升沿时,就会立刻把数据读走。主机也需要在SCL下降沿之后尽快把数据放在SDA上,但是主机有时钟的主导权,所以主机只需要在低电平的任意时刻把数据放在SDA上就行了,数据放完之后,主机再让SCL回到高电平,从机读取这一位。
另外,由于主机有时钟线同步,所以如果主机一个字节发送到一半,突然进中断了,不操作SCL和SDA了,那时序就会在中断的位置不断拉长,SCL和SDA电平都暂停变化,传输也完全暂停,等中断结束后主机回来继续操作。
注意:高位先行,第一位时一个字节的最高位B7。
图中SDA实线部分表示主机控制的电平,虚线部分表示从机控制的电平。
SCL全程由主机控制,所以从机的数据变换基本上都是贴着SCL下降沿进行的,而主机可以在SCL高电平的任意时刻读取。
接收一个字节:
与发送一个字节不同的是:主机在接收之前,需要释放SDA。让从机取得SDA的控制权来放数据。
接收应答:当我们在调用发送一个字节之后,就要紧跟着调用接收应答的用来判断从机有没有收到刚才給它的数据,如果收到了,那在应答为这里,主机释放SDA的时候,从机就应该立刻把SDA拉下来,然后在SCL高电平期间,主机读取应答位,如果应答位为0,就说明从机确实收到了。
发送应答:发送应答的目的是告诉从机,你是不是还要继续发,如果从机发送一个数据后,得到了主机的应答,那从机就还会继续发送,如果从机没得到主机的应答,那就不会继续发送了,然后释放SDA控制权,防止干扰主机后续操作。
四、IIC时序
1.指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
2.当前地址读
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
3.指定地址读
对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)