协议详解:IIC协议入门指南

        IIC简介

        IIC是一种同步串行通信接口,采用半双工模式,即同一时刻只能是输入模式或者输出模式。

        如下图所示为IIC结构图:

                                                                图1 IIC总线结构图

        简单总结IIC特性如下:

        1、IIC由SCL和SDA组成,并配有上拉电阻,上拉电阻阻值一般为4.7K;

        2、SDA线用于数据的双向传输,‌而SCL线由主设备控制,‌生成时钟信号以同步通信过程。

        3、IIC总线可以挂多个主从设备,每个设备公用两条总线,,一般由主设备发起读写访问,上图以FPGA作为主设备访问多个从设备读写操作;

        4、每个从设备都有自己的唯一地址,地址不可以重复;

        5、IIC速度一般在100~400KHz,最高时钟频率在1MHz左右。

        IIC设备内部硬件设计:

        SCL和SDA均设置为开楼模式输出,如下图所示为IIC内部设计图:

                                                        图2 IIC设备内部设计图

        如上图所示,IIC总线设计的开漏输出,其工作原理如下:

        1、当设备输出低电平时,经过反向电路后到CMOS管的G端为1,CMOS导通,输出到总线OUT端的点平稳定在低电平。

        2、设备输出高电平时,CMOS管G端为0,CMOS管不导通,OUT处于断开状态,经过上拉电阻后输出高电平。

        开漏设计的优点很明显,多个设备可能会同时尝试控制总线。由于开漏设计,任何设备都可以安全地将总线拉低而不会对其他设备造成伤害,任何一个设备需要输出低电平,该设备的CMOS管导通,可以令总线拉低。

        上拉电阻的特点如下:

        1、提供拉高电平:

        设备将总线释放时,上拉电阻将SDA和SCL线拉高到正逻辑电平(通常是Vcc),确保线路在非驱动状态时为高电平。

        2、限制电流:

        当总线设备将SDA或SCL线拉低时,上拉电阻起到限流的作用,防止电流过大导致设备损坏。

        3、增强信号完整性:

        上拉电阻也有助于维护信号的完整性,减少因为长线路或者其他电气特性引起的信号退化。

        选择合适的上拉电阻值是很重要的。电阻值太大,电流太小,导致总线拉高速度变慢,影响通信速率;电阻值太小,可能导致电流过大,浪费功率,且拉低总线时可能会对设备造成损害。通常,上拉电阻的选择取决于总线容量(总线上设备的数量和总线长度)和系统工作的电源电压。常见的电阻值范围从1.8kΩ到10kΩ不等。

        IIC协议

这里先了解IIC的四个标志信号特性,分别是起始信号、终止信号、应答信号、非应答信号。如下图所示:

                                                        图3 IIC 信号标志

        SCL在高电平期间 SDA由高到低代表起始始信号;

        SCL在高电平期间 SDA由低搭到高代表终止信号;

        应答信号ACK=1;代表从设备通信成功;

        非应答信号NACK=0,代表从设备未通信成功;

       IIC通信图如下图所示:

                                                                图4 IIC通信图

        通信过程中,SCL为高电平时需要保证数据已稳定并采样,SCL为低电平时数据可变化。比较稳妥的设计时SCL在上升沿到来之前,SDA已经准备好数据。

        如下图所示位数据通信时序图:

                                                        图5 IIC数据传输时序图

        IIC通信写动作要比读流程简单,单个Byt写操作流程如下(绿色代表主到从,蓝色代表从到主):

Start

addr

0

ack

data

ack

stop

                                                   

多个Byte写流程如下:

Start

addr

0

ack

data

ack

data

ack

……

stop

        不同于单个Byte操作的是会连续编写多个data,每个写data后面会紧跟着一个ack应答。

        以BMP581传感器举例,如下图所示代表寄存器单个Byte写操作:

                                                            图6 BMP581IIC单个Byte写操作

        写操作和上面介绍的一致,需要注意的是上图中由于register寄存器地址只有7位,所以register地址最高位X是无效的意思,0或者1都可以。

        如下图所示BMP581连续写操作

                                                        图7 BMP581IIC多个Byte写操作

        多个写操作数据的地址会自动在起始写地址的基础上累加,传感器寄存器读写配置基本都符合该操作。

        读操作相比较会复杂一些,依然用bmp581传感器为例,IIC读操作如下图所示:

                                                图8 RESTART IIC读操作

        IIC读操作需要先进行写地址配置,只有确认要读的地址后,再进行读操作。上图黄色的代表主设备输出,蓝色的代表从设备返回的数据,操作流程如下:

        1、主设备发起IIC起始位;

        2、主设备发送要操控的从设备地址+写(0);

        3、主设备释放SDA总线,从设备返回ACK表示已接收到命令;

        4、主设备发送要访问的寄存器地址;

        5、主设备释放SDA总线,从设备返回ACK表示已接收到命令;

        到这里读操作的第一步已经完成,接下来进行指定寄存器读操作:

        1、主设备发送RESTART信号,该信号和START信号一样;

        2、主设备发送要操控的从设备地址+读(1);

        3、主设备释放SDA总线,从设备返回ACK表示已接收到命令;

        4、从设备返回前面指定的寄存器地址所存储的值;

        5、主设备返回ACK;

        6、主设备持续发送SCL时钟,从设备返回地址+1寄存器的值以此类推;

        7、主设备发送停止位,读通信结束;

        如果对上面RESTART不好理解,读操作也可进行如下通信:

                                        图9 STOP-START IIC读操作

        这里操作上和RESTART基本类似,不同的是每一个START都配有一个STOP,首先写指定要读的地址,再对指定地址读操作。

        

        如有疑问可以留言。

        

作者:热爱学习地派大星

物联沃分享整理
物联沃-IOTWORD物联网 » 协议详解:IIC协议入门指南

发表回复