IIC总线协议时序介绍 IIC总线程序设计

接口/总线/驱动

1117人已加入

描述

IIC总线是一个双向的两线连续总线,它为集成电路之间提供通信线路。其意思是完成集成电路或功能单元之间信息交换的协议。

01IIC协议时序介绍

IIC协议的时序简单来说就是两条线之间的关系,分别为时钟线SCL和数据线SDA,先看IIC协议的时序图。

总线协议

上图为IIC的时序图,该时序图的状态分为空闲态、起始位、停止位还有数据的读/写状态。

1、空闲状态:数据线SDA为高电平,时钟线SCL为高电平;

2、起始位:时钟线SCL为高电平,数据线SDA出现一个下降沿,由此产生一个起始位;

3、停止位:时钟线SCL为高电平,数据线SDA出现一个上升沿,由此产生一个停止位;

4、数据读/写状态:数据的读写状态主要包括串行数据的输入和输出以及应答信号,读写数据的具体的时序图如下所示。

总线协议

当两个设置之间采用IIC通信时(其中一个为主机,另一个为从机),当主机向从机写入数据时,SDA上的每一位数据均在SCL的高电平期间被写入从机中。因此在主机需要在数据线SCL为低电平期间改变SDA上要写入的数据。当主机需要读取从机上的数据时,从机则需要在SCL为低电平期间将数据输出到SDA数据线上,在SCL为高电平期间保持数据的稳定,而主机则需要在SCL为高电平时将SDA线上的数据读取并存储起来。

每当一个字节的数据传输完成时,数据接收方都会向数据发送方发送一位的应答信号,即响应位。在响应应答位时,数据发送方将SDA线设置为三态门输入,在IIC总线上,数据线SDA都有一个上拉电阻,即一般情况下SDA都默认为高电平,若数据接收方正确接收到数据后,则数据接收方将会将SDA线的电平拉低,表示正确应答。

02IIC程序设计

首先来看需要定义的端口,分别为时钟源clk,复位端rst,cmd为指定此次传输是否需要加起始位或停止位,go为启动IIC的信号,rx_data为发送的数据,tx_data为接收的数据,trans_done为IIC数据传输完成标志,ack_o为应答信号,i2c_scl为时钟线SCL,i2c_sda为数据线SDA。定义如下图所示。

总线协议

接下来便是分配上述端口的输入、输出类型。

总线协议

首先clk和rst都为输入端口。cmd为我们自己设置,但是我们这里写的不是顶层文件,cmd具体的值需要在顶层文件中设置,所以此处也为input输入类型。同理控制IIC启动的go端口也是在顶层文件中设置,此处为input输入。发送数据存储器tx_data中的数据也是在顶层文件中写进去,为input输入。rx_data为接收到的数据,在顶层文件中接收,接收到后这里再将其输出来查看处理,所以为output输出端。

其它端口信号,发送完成标志位和应答信号还有时钟信号都是输出的信号。数据线SDA的端口i2c_sda,因为其又要写数据也要读数据,所以为inout,输入输出端,即可输入又可输出。

总线协议

然后此处定义系统外接的50M系统时钟,定义IIC的工作速度为400K(这里IIC的工作速度分三种,标准模式为100K,快速模式为400K,高速模式为3.4M),然后计算计数器计数的最大值SCL_CNT_M。

总线协议

然后此处定义的便是数据线SDA的三态门输入,当i2c_sda_oe为1时i2c_sda输出i2c_sda_o的值,当i2c_sda_oe为0时i2c_sda输出高阻抗。

总线协议

此处写的是计数器,用来书写时钟线SCL,当计数值div_cnt未达到IIC工作速度的最大值时,div_cnt自加,达到最大值时则清零,该计数器由使能端en_div_cnt控制。下面的sclk_plus则是一次计数满后置1,用作一个标志信号。

接下来便是状态机的书写,首先定义如下几个常量。

总线协议

上面的一组分别为,wr为写请求,sta为起始位请求,rd为读请求,sto为停止位请求,ack为应答位请求,nack为无应答请求,当系统符合相应位请求时便会跳转到相应的状态。

下面的一组数据则是对应相应的状态,idle为默认初始状态,gen_sta则为产生起始信号状态,wr_data则为写数据状态,rd_data则为读数据状态,check_ack为核对应答位信号状态,gen_ack为产生应答信号状态,gen_sto为产生停止信号状态。

总线协议

首先看在状态idle下的时序,首先将传输完成标志信号清零,然后打开三态输出端i2c_sda_oe置1,等待IIC开启信号go置1,开启信号go置1后打开计数器的使能端en_div_cnt,计数器开始为时钟信号SCL计时。然后便开始匹配选择有没有起始信号,以及是写状态还是读状态,当有起始信号时,状态机便跳转置产生起始信号的状态,即gen_sta。

总线协议

此处为产生起始信号状态,在cnt的计数值下书写每一个信号的状态,cnt为0初始时打开三态输入端,i2c_sda输出i2c_sda_o的状态高电平1,cnt为1时,将时钟线SCL拉高为1,cnt为2时将数据线SDA拉低,产生下降沿,数据线SCL持续为高,如此便产生了起始信号,cnt为3时将SCL拉低,如此为时钟线SCL的时钟周期。

接下来当cnt为3时便判断下一个状态为写状态或者读状态。此处需要说明一下,因为此处为时序逻辑,赋值方式采用的是非阻塞赋值,所以赋值的状态有点特殊,即当前赋的值都是在下一个时钟周期才生效。

总线协议

此处为读写状态,上面为写状态,当sclk_plus为1时cnt自加1,cnt计数4次为一个SCL时钟周期,在写数据时,一个数据为8位(二进制),逐次将每一位数据存储到i2c_sda_o中,然后打开三态门i2c_sda_oe,cnt加1后将SCL时钟线拉高,cnt再加1SCL时钟线电平保持高电平,此时根据IIC主从机协议,数据线SDA上的数据将被从机读取,然后cnt再加1便将SCL时钟线上的电平拉低。写数据完成之后状态机便跳转到等待应答信号的状态check_ack。

下面的便是读数据,读数据和写数据类似,也是cnt逐次自加,cnt从0自加到3,中间四次便是一个SCL时钟线的周期。首先关闭SDA的三态门,将i2c_sda_oe置0,将时钟线scl拉低,cnt自加1之后将SCL时钟线拉高,cnt在此自加之后SCL时钟线保持高电平,将SDA上读取到的数据通过移位的方式存储到rx_data存储器中,cnt再次自加后便将SCL时钟线拉低。

总线协议

这里便是等待应答的状态,等待应答的过程也相当于等待接收1位的数据,当cnt为0时,关闭i2c_sda的三态门,将i2c_sda_oe置0,时钟线SCL置0,cnt自加1后将SCL时钟线拉高,cnt再次自加1之后便开始读取SDA数据线上接收到的数据,将接收到的数据赋给端口ack_o,用来判断应答信号是否正确,cnt再次自加之后便将SCL时钟线拉低。cnt自加到3之后,便开始判断当前的IIC通信是否需要加停止位。

总线协议

产生应答的过程也为一次输出的过程,cnt为0时打开三态使能端,将i2c_sda_oe置1,将时钟线SCL拉低,然后判断应答信号是否发送,需要发送则i2c_sda的取值i2c_sda_o赋0,无应答则将i2c_sda_o赋1。因为应答信号ack为0有效。cnt自加后将时钟线SCL拉高,cnt再次自加后时钟线SCL保持高电平,cnt自加到3时,将时钟线SCL拉低。cnt为3后开始判断是否需要停止位,用来判断下一个跳转状态。

总线协议

根据停止位的时序,当SCL时钟线为高电平时,SDA数据线产生一个上升沿便为停止位,即当cnt为0时打开i2c_sda的三态使能端,将i2c_sda_oe置1,将i2c_sda_o置0,这样SDA数据线便先输出低电平,cnt自加1后将时钟线SCL拉高,cnt再次自加后将i2c_sda_o的值赋1,使SDA数据线输出高电平,如此便产生了一个上升沿,cnt再次自加置3时,SCL数据线保持高电平,如此IIC的停止位便产生了。

03 IIC仿真波形

首先便是老生常谈的例化该程序。

总线协议

定义相匹配的寄存器,然后例化过程写的文件,这里pullup是将引脚上拉的意思,在电路中都存在上拉电路,SDA在电路中都是被上拉电阻拉至高电平状态。

总线协议

然后此处便是产生50M的时钟源。

总线协议

这里还写了task调用程序,首先写的是写字节的task,输入三个数据,每一个数据都是8位,然后分别仿真了有起始位、无起始位无停止位、和有停止位的过程,先将开始IIC的信号go拉高开启,然后将需要写入的数据赋给寄存器tx_data中保存,然后关闭go,延时一段时间后便开始捕获发送完成信号trans_done的上升沿,下面两组数据的方式同理。

总线协议

然后便是读取数据的task语句仿真,这里输入两个,同样也是仿真是否需要起始位、停止位,然后开启IIC开始信号go,开始时给go赋1,然后将数据存入寄存器,延时后关闭开启信号go,然后再延时等待捕捉传输完成标志的上升沿。

下面是仿真波形图

总线协议

整体波形如图所示。接下来为发送一个数据的仿真波形图。

总线协议

首先最头上的光标表示的是本次发送的数据为10100000,第二个光标处表示的是起始位,SCL为高,SDA产生下降沿,后面两个光标之间便是传输的数据,SCL高电平时看SDA上发送的数据。

总线协议

然后这个图便是接收数据的波形图,SCL为高电平时读取SDA上的数据,并通过移位的方式将读取的数据存储到rx_data寄存器中。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分