集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 9182|回复: 11

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

[复制链接]
小墨同学 该用户已被删除
小墨同学 发表于 2014-11-20 13:36:10 | 显示全部楼层 |阅读模式
本帖最后由 小墨同学 于 2014-12-10 14:28 编辑

相信学过单片机的同学对I2C总线都不陌生吧,今天我们来学习怎么用verilog语言来实现它,并在FPGA学习版上显示。
    i2c总线在近年来微电子通信控制领域广泛采用的一种新型的总线标准,他是同步通信的一种特殊方式,具有接口少,控制简单,器件封装形式小,通信速率高等优点。在主从通信中,可以有多个i2c总线器件同时接到i2c总线上,所有与i2c兼容的器件都有标准的接口,通过地址来识别通信对象,使他们可以经由i2c总线互相直接通信。
   i2c总线由两条线控制,一条时钟线SCL,一条数据线SDA,这里以E2PROM芯片AT24C08来介绍i2c通信方式。这是我学习版上的E2PROM芯片


下面是AT24系列芯片的器件地址说明

前四位是已经默认的地址,接下来三位是可编程部分,可以自己拟定器件的地址,就像上面的芯片,A0,A1,A2全部接地,所以我的开发板上的E2PROM的地址就为1010_000x,最后一位是读写标志位,若为1,则表示我要从E2PROM里读数据,若为0,则表示我要往里面写数据。

下面是AT24C08的读时序

想要理解这段时序,让我们来慢慢将它分解来看,从上到下,从左到右
1、SCL
       由芯片的datasheet我们可以知道芯片的工作频率范围,一般是100KHZ到400KHZ,这里我们用100KHZ的工作频率。因为我们的FPGA芯片是50MHZ的频率,所以要用到分频,周期是20ns,所以计数500次就是10us,也就是100KHZ了,下面是分频部分的代码


       由芯片的资料可知,在SCL是低电平器件数据才可以变化,也就是说,只有在SCL在低电平器件才可以向E2PROM里面写数据,在SCL高电平期间数据稳定,所以我们可以从里面读数据,所以我们将SCL的一个时钟周期分为四部分,分别是高电平中间时刻(用于读数据),下降沿,低电平中间时刻(用于写数据),上升沿。上升沿和下降沿来控制SCL的时序。
2、START
     开始信号,在SCL为高电平期间,SDA有一个从高电平到低电平的跳变
3、DEVICE-ADDRESS
      器件地址,当开始信号作用后,就可以将器件的地址送人数据总线SDA,由于SDA是串行的,所以要一位一位的送,而且要从高位开始送,下面是状态机寻器件地址部分代码,注意地址的最后一位是读写位,这里要送写地址,即1010_0000;


下面我来解释一下上图的代码为什么这样写

(1)首先在SCL在低电平期间属于数据稳定期,我们可以向里面写数据。
(2)进入ADD1状态后,sda_num就开始计数,由于我们用的是非阻塞赋值,所以第一个时钟周期case捕获的sda_num的值是0而不是1,有些朋友可能不明白这里,总是觉得case语句上来不就捕获了1嘛,在这里给大家讲解一下
(3)这样一连送8个时钟周期的器件地址,送完之后sda_num清零,并释放sda总线,进入下一个状态

4、ACK
       应答信号,当器件地址发送完毕后,主机要向从机要一个应答信号,用来表示从机已经接收到了主机发送的数据,如果一段时间内主机没有收到从机发来的应答信号,则主机默认从机收到的主机发送的数据。
5、WORD_ADDRESS
数据地址,当找到要往哪个器件里写数据之后,就要开始寻址往这个器件的哪个地址里写数据了,AT24C08的存储容量为1024x8,也就是可以写1024个字节,共有1024个地址,往哪个地址里写呢,需要我们自己确定。和上面发送器件地址一样,直接将地址数据发送至SDA总线即可。


          接下来从机再给主机一个应答信号,如果此时我们按下键1的话那么就会进入写状态,然后我们就可以写数据了,具体代码和上面寻址的代码类似,直接将数据发送到数据总线SDA。

        下面是读时序

      读时序和写时序的唯一不同点就是当发送玩数据地址后,接收到应答信号后,如果想要执行读命令,那还要进行一次开始信号,即START2,然后再发送一次器件地址,当再收到应答信号后就可以从里面读数据了,注意读数据的时候我们是在scl的高电平期间,因为这个时候数据稳定,而在写数据的时候,我们是在scl的低电平器件,因为这个器件数据才允许变化,代码如下


还有一点要注意,因为SDA是输入输出信号inout,所以为了当数据线作为输出或者输入时不被干扰,这里定义了一个变量sda_link,来控制它,当sda作为输入信号时,我们让它处于高阻态,当sda作为输出信号时,将其赋予sda_r的值

下面是生成的RTL视图


下面是状态机的模型


下面是板子上实验



此外,以后小墨同学的文章将在EDNchina和北京至芯科技官方技术论坛同时更新,至芯科技的官方技术论坛也有很多的资料供大家下载,里面也有小墨的专题板块,希望广大网友和爱好者的大力支持~
http://www.fpgaw.com/
小墨同学专版网址
http://www.fpgaw.com/thread-78527-1-1.html
下面是至芯科技官方网站,夏宇闻教授和那里的老师都超好的~有意愿接受FPGA培训的可以找工作人员咨询
http://www.zxopen.com/
       以后小墨同学的教程会跟这款开发板配套,想跟小墨同学一起学习,一起进步的的可以考虑一下购买一块开发板,毕竟学习要舍得投资嘛,下面是开发板淘宝链接
http://item.taobao.com/item.htm? ... ;abbucket=13#detail

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
@孙波 发表于 2014-12-3 18:55:45 | 显示全部楼层
每人回复吗????????????
duoxindefeng 发表于 2014-12-6 10:52:00 | 显示全部楼层
对于时钟那块设计挺有意思的,我感觉还可以直接检测下降沿或上升沿也可以
心有猛虎 发表于 2016-11-5 11:07:43 | 显示全部楼层
时钟设计很新
BGbird 发表于 2017-9-2 23:21:50 | 显示全部楼层
仔细学习了一下,楼主挺用心的,要是早几年能够看到就好了
admin 发表于 2017-9-3 23:46:18 | 显示全部楼层
要是早几年能够看到就好了
4798345 发表于 2017-9-4 10:44:25 | 显示全部楼层
感谢楼主分享
hellokity 发表于 2017-12-7 09:36:50 | 显示全部楼层
做的不错,谢谢分享!
大鹏 发表于 2017-12-10 09:54:45 | 显示全部楼层
支持小墨,继续更新!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-24 00:10 , Processed in 0.106318 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表