I2C协议说明及verilog实现读写I2C器件_第1页
I2C协议说明及verilog实现读写I2C器件_第2页
I2C协议说明及verilog实现读写I2C器件_第3页
I2C协议说明及verilog实现读写I2C器件_第4页
I2C协议说明及verilog实现读写I2C器件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、K2FPGA 开发板实验教程类别关键词摘 要 通过PCF8563时钟芯片,了解FPGA读写IIC时序的方法本教程大部分资料取自网络,笔者仅做整理以做助学之用。 哈三英卓越科技发展有限公司尔滨三声明 英内容 IIC 卓越修改历史版本日期 2011.4.21 原因 创建 作者 哈产品用户手册 三英卓越科技发展有限公司i 尔滨三英购买方式三英卓越科技发展地址:哈尔滨市南岗区学府路52号邮编:150040电话宝地址:诚招代理事宜! 对我们公司产品感兴趣的公司及个人均可与我们联系商议代理哈产品用户手册 三英卓越科技发展有限公司ii 尔滨三英卓越目 录1. I2C协议简介 .

2、 11.11.2I2C串行总线概述 . 1I2C总线的数据传送 . 11.2.1起始和终止信号 . 11.2.2数据位的有效性规定 . 21.2.3数据传送格式 . 21.2.4I2C总线寻址 . 4概述. 5特性. 5应用电路. 5硬件连接. 62. PCF8563应用 . 54. 故障分析. 17哈产品用户手册 哈尔滨三英卓越科技发展有限公司1 尔滨三英卓3. 代码示例. 7越2.12.22.32.41. I2C协议简介1.1 I2C串行总线概述I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。如图 1-1所示,I2C总

3、线只有两根双向信号线:一根是数据线SDA,另一根是时钟线SCL。越卓图 1-1 I2C总线尔滨三图 1-2 I2C总线连接方式每个接到I2C总线上的器件都有唯一的地址,主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。在嵌入式应用系统的串行总线扩展中,我们经常遇到的是以嵌入式微处理器为主机,其它接口器件为从机的单主机情况。 哈1.2 I2C总线的数据传送1.2.1 起始和终止信号如图 1-3所示,SCL线为高电

4、平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。产品用户手册 三英卓越科技发展有限公司1 英如图 1-2所示,I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。图 1-3 I2C总线起始和终止信号起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。接收器件收到一个完整的数据

5、字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。1.2.2 数据位的有效性规定尔滨三图 1-4 有效的数据位传输哈1.2.3 数据传送格式1) 字节传送与应答如图 1-5所示,每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。产品用户手册 三英卓越科技发展有限公司2 英如图 1-4所示,I2C总线进行数据传送时,时钟信号为高电平

6、期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。即,若想改变SDA信号线上的数据位,只能在SCL信号线低电平的时候改变,否则将会是从机器件认为是起始或终止信号。 卓越图 1-5 I2C信号格式2) 数据帧格式在总线的一次数据传送过程中,可以有以下几种组合方式:a) 主机向从机发送数据,数据传送方向在整个传送过程中不变,如图 1-6所示。图 1-6 方式1哈注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A表示应答,A非表示非应答(高电平)。S表示起始信号,P表示终止信号。b) 主机在第一个字节后,立即从从

7、机读数据,如图 1-7所示。图 1-7 方式2c) 在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相,如图 1-8所示。产品用户手册 三英卓越科技发展有限公司3 尔滨I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。 三英当主机接收数

8、据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。 卓如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。 越由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。图 1-8 方式31.2.4 I2C总线寻址I2C总线协议有明确的规定:采用7位的寻址字节(寻

9、址字节是起始信号后的第一个字节),其格式如图 1-9所示,D7D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。图 1-9 寻址字节位定义哈产品用户手册 三英卓越科技发展有限公司4 尔滨三英从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。 卓主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则

10、认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。 越2. PCF8563应用2.1 概述PCF8563是低功耗的CMOS实时时钟/日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传输。最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动产生增量。2.2 特性z 低工作电流:典型值为0.25A(VDD=3.0V,Tamb=25时)。z 世纪标志。z 大工作电压范围:1.05.5。z 低休眠电流;典型值为0.25A(VDD=3.0V,Tamb=25)。z 400KHz的I2C总线接口(VDD=1.85.5V时

11、)。z 报警和定时器。z 掉电检测器。z 内部集成的振荡器电容。z 片内电源复位功能。z 开漏中断引脚。 z 可编程时钟输出频率为:32.768KHz,1024Hz,32Hz,1Hz。 z I2C总线从地址:读,0A3H;写,0A2H。2.3 应用电路PCF8563的SCL、SDA、/INT引脚分别与FPGA的134、133、135引脚相连。数码管显示部分的引脚连接,位选依次为(G1G8):86、84、82、81、80、77、76、75;段选依次为(ADP):96、95、94、92、90、89、88、87。哈尔滨PCF8563的应用电路如图 2-1所示。该应用中为芯片提供了两种电源,即电池和板

12、载3.3V电源,用户可以自行选择供电方式。同时,中断输出和可编程时钟输出引脚也被独立印出来,这样可以方便用户用来做相关实验。 三英5 图 2-1 PCF8563应用电路 产品用户手册 三英卓越科技发展有限公司 卓越2.4 硬件连接图 2-2所示,在进行实验之前,请先确保供电正常,根据图中提示的方法,将相应引脚短接即可。卓图 2-2 硬件连接图 越哈产品用户手册 三英卓越科技发展有限公司6 尔滨三英3. 代码示例本例中,顶层模块包含了两个部分,即I2C通信部分和数码管显示部分。z 顶层模块:/*顶层模块输出端口*/ module top(input clk, /系统时钟output SCL, /

13、I2C时钟inout wire SDA, /I2C数据,双向output 7:0grid_out /数码管位选);* I2C驱动模块iic_test iic_test(.clk(clk),.SCL(SCL),.SDA(SDA),.data_read_wire(data_trans), output 7:0seg_out, /数码管段码 /*/.sda_data_addr(8ha2), /I2C总线从地址,写A2,读A3.sda_data_word(data_word),.finish_bit(finish_bit);/*数码管显示模块test4 test4( */.seg(seg_out),哈

14、 .grid(grid_out),.clk(clk),.seg_sec(sec),.seg_mnt(mnt),.seg_hur(hur);/*/ wire 7:0data_trans;wire finish_bit;reg 7:0data_word;reg 7:0sec;reg 7:0mnt;产品用户手册 三英卓越科技发展有限公司7 尔滨三英卓越reg 7:0hur;reg 7:0code_ctl;parameter SEC_TIMEparameter MNT_TIMEparameter HUR_TIMEalways (posedge clk)begin = case(code_ctl) =

15、SEC_TIME:begin = 8d0; = 8d1; = 8d2; = if(finish_bit1b0)begindata_word8h02; /发送秒寄存器的地址 secdata_trans; = endelsecode_ctlMNT_TIME; /等待发送秒寄存器的地址 = enddata_word8h03; /发送分寄存器的地址end end else mnt=data_trans; 三英8 MNT_TIME: = begin =1b0)begin if(finish_bit HUR_TIME: begin if(finish_bit end data_word8h04; /发送小

16、时寄存器的地址 尔滨end else code_ctlHUR_TIME;/等待发送分寄存器的地址 1b0)begin 哈hur=data_trans; code_ctlSEC_TIME; /等待发送小时寄存器的地址 endcase end endmodule z IC通信部分 /*I2C通信模块接口 */ 2产品用户手册 三英卓越科技发展有限公司 卓 越=module iic_test(input clk, /20MHz= output SCL, /I2C串行时钟inout wire SDA, /I2C双向数据线 =output 7:0data_read_wire, = input 7:0sd

17、a_data_addr, = /I2C总线从地址= /发送寄存器地址 input 7:0sda_data_word,output reg finish_bit /数据更新 =); = =reg sda_io_flag; /SDA双向数据口方向选择寄存器reg read_flag; /读标记reg sda_r; = /SDA寄存器reg scl_r;reg 7:0scl_ctr;reg 2:0scl_sts;reg 3:0iic_sts;reg 7:0sda_data_a;reg 3:0data_bit;reg 7:0data_read;reg 23:0 timer;assign SDA= as

18、sign SCL scl_r; /SCL寄存器 sda_io_flag?sda_r:1bz;define scl_pos (scl_stsdefine scl_neg (scl_stsdefine scl_high (scl_stsdefine scl_low (scl_sts哈parameter IDLE 4d0;parameter START 4d1;parameter SEND_A 4d2;parameter SLV_ACK1parameter SLV_ACK2parameter SLV_ACK3 = 4d3; = 4d5; = 4d7;= 4d8;= 4d9; parameter SE

19、ND_D 4d4; parameter SEND_DD 4d6; parameter READ_BYTE parameter MASTER_ACKparameter STOP 4d10;产品用户手册 三英卓越科技发展有限公司9 尔滨assign data_read_wire = data_read; 三3d0) /时钟上升沿 3d1) /高电平 3d3) /低电平 3d2) /下降沿 英卓越=/*=*设置I2C一个时钟周期的四个不同时刻,即下降沿、低电平脉冲中点、上升沿、高电平脉冲中点。 */ always(posedge clk)beginif(scl_ctr8d200) scl_ctrsc

20、l_ctr+1; /1MHz的时钟 200*50nS =1uSelse scl_ctr = 0;=end= always(posedge clk)begin = case(scl_ctr) =8d49: scl_sts3d1; /高电平 8d99: scl_sts3d2; /下降沿 8d149: scl_sts3d3; /低电平8d199: scl_sts3d0; /时钟上升沿=default: scl_sts3d5; /这条语句很重要,否则除case条件的值外,scl_sts仍会 =/被赋值endcase end/*if(scl_sts end3d2)scl_r 1b0;*/ always(

21、posedge clk)begin if(timer0)beginiic_sts IDLE; /初始化,进入初始状态 data_bit 0; sda_io_flag 1b1;sda_r= 1b1;read_flag 1b0; endIDLE:begin/初始状态 /判断主机读写状态if(read_flag=1b1) elsecase(iic_sts)哈sda_data_a sda_data_addr+1; /地址+1,即为读状态(A3) sda_data_a sda_data_addr; /地址不加1,即为写状态(A2)iic_sts= START;/进入开始读写状态产品用户手册 三英卓越科技

22、发展有限公司10尔滨/*=/读写I2C三英*I2C时钟信号线,即scl_sts=3d0时刻后时钟信号应为高电平,scl_sts=3d2时刻后时钟信号应为低电平=*/ = always(posedge clk)begin =if(scl_sts3d0)scl_r 1b1; =卓越end START:begin endbeginend elseiic_sts = START; =/等待启动I2C /发地址状态=/启动I2C=if(scl_high)beginsda_io_flag= 1b1; sda_r iic_sts= 1b0;= SEND_A; /启动后,跳转到发送地址状态SEND_A:4d4

23、: sda_r sda_data_a3; 4d5: sda_r sda_data_a2; 4d6: sda_r sda_data_a1;三4d7: endcase endend elsesda_r = sda_data_a0;英114d3: sda_r sda_data_a4;卓=1b0;if(scl_low)begin = case(data_bit) = /8位串行地址数据=4d0: sda_r sda_data_a7; = 4d1: sda_r sda_data_a6; =4d2: sda_r sda_data_a5; =越data_bit data_bit+1;尔滨endend els

24、eSLV_ACK1:beginif(data_bit4d8)begin /发送地址完毕/SDA做输入口sda_io_flag =1b0; data_bit = 4d0;iic_sts SLV_ACK1; /读从机应答信号哈iic_sts = SEND_A; /等待发地址 /从机应答if(scl_high)beginsda_io_flag 1b0;if(SDA=0)begin1b1)begin= READ_BYTE;iic_stsif(read_flagsda_io_flag产品用户手册 三英卓越科技发展有限公司endend else=begin =iic_sts = SLV_ACK1;=end

25、 = =begin = iic_stssda_r= SEND_D; =1b1; = 1b0;= sda_data_word;sda_io_flag sda_data_aendendSEND_D:beginif(scl_low)begincase(data_bit)/8位串行地址数据4d0: sda_r sda_data_a7; 4d1: sda_r sda_data_a6; 4d2: sda_r sda_data_a5; 4d3: sda_r sda_data_a4; 4d4: sda_r sda_data_a3; 4d5: sda_r sda_data_a2; 4d6: sda_r sda_

26、data_a1;data_bit data_bit+1; if(data_bitend/发送数据完毕,应答beginend elseiic_sts = SEND_D;4d8)beginsda_io_flag 1b0;iic_sts = SLV_ACK2; data_bit = 4d0;哈if(scl_high)begin sda_io_flag 1b0;if(SDA=0)beginiic_sts = STOP;sda_io_flag 1b1;产品用户手册 三英卓越科技发展有限公司12尔滨SLV_ACK2:4d7: sda_r sda_data_a0;endcase三end英卓越/发送数据sda

27、_r = 1b0;endend elseendiic_sts = SLV_ACK2;/读从机数据READ_BYTE:beginif(scl_high)beginsda_io_flag=1b0;data_read (data_read1)|SDA;endendenddata_bit iic_sts=0;= MASTER_ACK;begin= if(scl_low)begin=sda_io_flag =1b1;data_bit data_bit+1;if(data_bit=1)beginiic_sts=STOP; =0;data_bit尔滨end end STOP:begin endend三sda

28、_rendsda_r = 1b1; read_flag=1b1; else英= 0;13MASTER_ACK:哈if(scl_high)beginif(read_flag=1b0)iic_sts= IDLE; iic_sts = STOP;endcase end产品用户手册 三英卓越科技发展有限公司卓越/主机应答 /停止I2Cdata_bit data_bit+1;= if(data_bit=7)begin=/* =*50ms的更新周期,即并非使系统一直处于读写状态,而是定期更新数据=*/ =always (posedge clk)beginif(timer24d1000000)beginti

29、mer timer+1;if(timerendelse end timer=0; begin finish_bit0;endendmodule 24d999999) finish_bit 1;z 数码管显示:*数码管显示模块接口module test4(output reg7:0 seg, output reg7:0 grid=8h01, = input clk, = input 7:0seg_sec,input 7:0seg_mnt,input 7:0seg_hur);/* =*/reg7:0 segments0:9 ;reg24:0 k;reg14:0 s=0,g=0;*数码管段码initialbegin 哈/* */segments0 8h3f;segments1 8h06;segments2 8h5b;segments3 8h4f;segments4 8h66;segments5 8h6d;segments6 8h7d;产品用户手册 三英卓越科技发展有限

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论