您的位置 首页 汽车

零根底学FPGA(十)初入江湖之i2c通讯

相信学过单片机的同学对I2C总线都不陌生吧,今天我们来学习怎么用verilog语言来实现它,并在FPGA学习版上显示。i2c总线在近年来微电子通信控制领域广泛采用的一种新型的总线标准,他是

  信任学过单片机的同学对I2C总线都不生疏吧,今日咱们来学习怎样用verilog言语来完成它,并在FPGA学习版上显现。

  i2c总线在近年来微电子通讯操控范畴广泛选用的一种新式的总线规范,他是同步通讯的一种特别方法,具有接口少,操控简略,器材封装方法小,通讯速率高级长处。在主从通讯中,能够有多个i2c总线器材一起接到i2c总线上,一切与i2c兼容的器材都有规范的接口,经过地址来辨认通讯目标,使他们能够经由i2c总线相互直接通讯。

  i2c总线由两条线操控,一条时钟线SCL,一条数据线SDA,这儿以E2PROM芯片AT24C08来介绍i2c通讯方法。这是我学习版上的E2PROM芯片

  

360桌面截图20140708101550.jpg

 

  下面是AT24系列芯片的器材地址阐明

  

360桌面截图20140708101803.jpg

 

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

  下面是AT24C08的写时序

  

360桌面截图20140708102226.jpg

 

  想要了解这段时序,让咱们来渐渐将它分化来看,从上到下,从左到右

  1、SCL

  由芯片的datasheet咱们能够知道芯片的作业频率规模,一般是100KHZ到400KHZ,这儿咱们用100KHZ的作业频率。由于咱们的FPGA芯片是50MHZ的频率,所以要用到分频,周期是20ns,所以计数500次便是10us,也便是100KHZ了,下面是分频部分的代码

  

360桌面截图20140708102827.jpg

 

  

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的存储容量为1024×8,也便是能够写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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/117241.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部