分享

零基础学FPGA(十一)初入江湖之i2c通信

 果宝战士书屋 2015-04-26
360桌面截图20140708102910.jpg
       由芯片的资料可知,在SCL是低电平器件数据才可以变化,也就是说,只有在SCL在低电平器件才可以向E2PROM里面写数据,在SCL高电平期间数据稳定,所以我们可以从里面读数据,所以我们将SCL的一个时钟周期分为四部分,分别是高电平中间时刻(用于读数据),下降沿,低电平中间时刻(用于写数据),上升沿。上升沿和下降沿来控制SCL的时序。
2、START
     开始信号,在SCL为高电平期间,SDA有一个从高电平到低电平的跳变,大家可以参考上传的源代码,从一上电开始,SCL就按照100KHZ的频率在变化,我们需要控制的只是SDA即可。
3、DEVICE-ADDRESS
      器件地址,当开始信号作用后,就可以将器件的地址送人数据总线SDA,由于SDA是串行的,所以要一位一位的送,而且要从高位开始送,下面是状态机寻器件地址部分代码,注意地址的最后一位是读写位,这里要送写地址,即1010_0000;
360桌面截图20140708103940.jpg
下面我来解释一下上图的代码为什么这样写
(1)首先在SCL在低电平期间属于数据稳定期,我们可以向里面写数据。
(2)进入ADD1状态后,sda_num就开始计数,由于我们用的是非阻塞赋值,所以第一个时钟周期case捕获的sda_num的值是0而不是1,有些朋友可能不明白这里,总是觉得case语句上来不就捕获了1嘛,在这里给大家讲解一下
(3)这样一连送8个时钟周期的器件地址,送完之后sda_num清零,并释放sda总线,进入下一个状态
4、ACK
       应答信号,当器件地址发送完毕后,主机要向从机要一个应答信号,用来表示从机已经接收到了主机发送的数据,如果一段时间内主机没有收到从机发来的应答信号,则主机默认从机收到的主机发送的数据。在这里我们利用状态机等待一个时钟周期,作为应答等待时间,并在这个时间内给db_r寄存器送数据地址
5、WORD_ADDRESS
数据地址,当找到要往哪个器件里写数据之后,就要开始寻址往这个器件的哪个地址里写数据了,AT24C08的存储容量为1024x8,也就是可以写1024个字节,共有1024个地址,往哪个地址里写呢,需要我们自己确定。和上面发送器件地址一样,直接将地址数据发送至SDA总线即可。
        接下来从机再给主机一个应答信号,如果此时我们按下键1的话那么就会进入写状态,然后我们就可以写数据了,具体代码和上面寻址的代码类似,直接将数据发送到数据总线SDA。
        下面是读时序
360桌面截图20140708105124.jpg
       读时序和写时序的唯一不同点就是当发送玩数据地址后,接收到应答信号后,如果想要执行读命令,那还要进行一次开始信号,即START2,然后再发送一次器件地址,当再收到应答信号后就可以从里面读数据了,注意读数据的时候我们是在scl的高电平期间,因为这个时候数据稳定,而在写数据的时候,我们是在scl的低电平器件,因为这个器件数据才允许变化,代码如下
360桌面截图20140708105456.jpg
还有一点要注意,因为SDA是输入输出信号inout,所以为了当数据线作为输出或者输入时不被干扰,这里定义了一个变量sda_link,来控制它,当sda作为输入信号时,我们让它处于高阻态,当sda作为输出信号时,将其赋予sda_r的值
360桌面截图20140708105838.jpg
下面是生成的RTL视图
360桌面截图20140708105928.jpg
下面是状态机的模型
360桌面截图20140708110049.jpg
下面是板子上实验
qq图片20140708110528.jpg

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多