CY7C68013ASlavefifo固件心得Word下载.docx

上传人:b****2 文档编号:416999 上传时间:2023-04-28 格式:DOCX 页数:14 大小:27.36KB
下载 相关 举报
CY7C68013ASlavefifo固件心得Word下载.docx_第1页
第1页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第2页
第2页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第3页
第3页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第4页
第4页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第5页
第5页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第6页
第6页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第7页
第7页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第8页
第8页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第9页
第9页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第10页
第10页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第11页
第11页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第12页
第12页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第13页
第13页 / 共14页
CY7C68013ASlavefifo固件心得Word下载.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

CY7C68013ASlavefifo固件心得Word下载.docx

《CY7C68013ASlavefifo固件心得Word下载.docx》由会员分享,可在线阅读,更多相关《CY7C68013ASlavefifo固件心得Word下载.docx(14页珍藏版)》请在冰点文库上搜索。

CY7C68013ASlavefifo固件心得Word下载.docx

//reset,FIFO6

FIFORESET=0x08;

//reset,FIFO8

FIFORESET=0x00;

//deactivateNAK-ALL

EPxFIFOCFG,用于设置端点的操作方式。

EP2FIFOCFG=0x11;

//AUTOOUT="

1"

WORDWIDE="

//自动输出端点,8位数据总线

EP4FIFOCFG=0x11;

EP6FIFOCFG=0x0c;

//AUTOIN="

ZEROLENIN="

//自动输入端点,允许0长度端点,8位数据总线

EP8FIFOCFG=0x0c;

有关CY7C68013中GPIF理解收藏

InitvalofInternalRdy的含义:

决定了内部RDY的初始状态,决定了GPIFRADYCFG的第7位INTRDY的值。

内部RDY作为RDY6由FIRMWARE控制的状态,而不是由RDY引脚(RDY0-RDY4)的状态来决定。

当你在gpif中不需要判断gpifradycfg.7的状态时,那么这个设置也就无所谓了。

SyncRDYtoIFCLK的含义:

当gpif对rdy进行采样时,是同步(SAS=0)还是异步采样(SAS=1),当为异步采样时,GPIF检测到RDY信号的状态实际上是24ns前的状态。

48MHz

SubstTCforRDY5:

选折这个选项后,GPIFRADYCFG.5将为1,表示将用TCXpire来代表RDY5的状态。

当RDY5=1时,代表TCXpire=1,而TCXpire=1表示传输计数器已经减小到0。

以上三个设置,分别对应GPIFREADYCFG的BIT7,BIT6,BIT5三位

每个gpif波形可以定义最多7个可编程状态(S0-S6)和一个不可编程的空闲状态(IDLE),在每个状态中,你可以编程来实现:

1。

控制CTL的输出(高,低,浮空)

2.对fifo数据线提供数据或对fifo数据线进行数据采集

3。

增加gpif地址线上的值

4。

增加当前指向fifo的指针,以提供下一个fifo中的数据到数据线上或者读数据线上的数据到下一个fifo地址中。

5。

触发gpifwf中断。

另外,在每个状态中,可以检测如下任意两个变量的逻辑与,或,异或运算,根据运算的真假结果进行相应的状态切换(详见logicfunction寄存器)。

RDYx输入引脚的状态

2。

fifo标志状态位,EF,FF,PF到底选择哪个标志是由EPxGPIFFLGSEL来决定的。

在触发波形前,若波形中使用了fifo状态位来作为dp的跳转判断条件时,应该先设置EPxGPIFFLGSEL。

3.INTRDY标志,即gpifradycfg.7位的值

传输计数完成

指定一定时间的延时(1-256)ifclk时钟周期。

注意:

INTRDY是寄存器的一个位,由FIRMWARE中用户自己编程定义。

而Tcxpire是在触发gpif后,传输计数到达用户指定的一个值后自动置位的,这个用户自定义的传输数是用户在触发gpif之前,给GPIFTCB所赋的值。

用GPIFDESIGNER/gpiftool其实就是填写128个字节(0xe400-0xe47f)的波形描述符来描述4个波形。

当波形跳到了idle状态时,这个波形就结束了,相应的done位(gpifidlecs.7或gpiftrig.7)为1。

当波形结束时,即进入idle状态时,gpif信号的状态是由gpifidlecs和gpifidlectl寄存器来设定的。

需要注意的是,当一个波形还没有结束的时候,你是不允许触发下一个波形的,所以你在触发一个波形之前,要判断一下DONE位是否为1,只有DONE位=1时,你才能开始产生下一个波形(也就是与外部slave通讯的时序)。

每个波形由几个状态组成,每个状态由32位(4字节)的状态指令来描述,这4个字节分别称为LENGTH/BRANCH(NDP指明了这个状态要保持多少个IFCLK时钟周期,DP状态表明跳转条件为真时跳转到第几个状态以及为假时跳转到第几状态和是否Re-Execute),OPCODE(SGL=0,使用FIFO,指明到这个状态时,是否产生中断.这个状态开始时,地址线gpifadr[8:

0]是否自动加1,outfifo中的数据指针是否指向下一个数据,是否输出outfifo所指的数据或读入数据到当前infifo的地址中,这个状态是dp还是ndp),,LOGICFUNCTION(用于DP状态的判断跳转条件的设定),OUTPUT(用于控制在这个状态时,CTL引脚的输出状态).有两种不同类型的状态:

NDP,DP

关于re-execute

当在一个DP状态的条件满足时,有时用户定义是挑转到他本身的状态,这样的循环过程不是re-execute,我们将他称为loopback.那么re-execute是什么意思呢?

他是指当dp状态跳转到它本身的状态时,其他动作是否也执行,比如你设置了NEXTFIFODATA,也就是FIFO的指针加1或者你设置了地址线上的地址加1,或者你的CTL要置高,那么当你选折了RE-EXECUTE后,当跳转回来时,这些动作就会再执行一次,这样你就可以实现一些自动功能了

FIFO与GPIF的区别收藏

什么是fifo

(FirstInputFirstOutput,先入先出队列)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。

1.什么是FIFO?

FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

2.什么情况下用FIFO?

FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位100KSPS,那么每秒的数据量为100K×

16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。

另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。

3.FIFO的一些重要参数

FIFO的宽度:

也就是英文资料里常看到的THEWIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。

FIFO的深度:

THEDEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。

如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。

在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。

在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。

一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。

而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。

满标志:

FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。

空标志:

FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。

读时钟:

读操作所遵循的时钟,在每个时钟沿来临时读数据。

写时钟:

写操作所遵循的时钟,在每个时钟沿来临时写数据。

读指针:

指向下一个读出地址。

读完后自动加1。

写指针:

指向下一个要写入的地址的,写完自动加1。

读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。

4.FIFO的分类

根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。

同步FIFO是指读时钟和写时钟为同一个时钟。

在时钟沿来临时同时发生读写操作。

异步FIFO是指读写时钟不一致,读写时钟是互相独立的。

5.FIFO设计的难点

FIFO设计的难点在于怎样判断FIFO的空/满状态。

为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。

在空的状态下不能进行读操作。

怎样判断FIFO的满/空就成了FIFO设计的核心问题。

由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。

在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。

在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。

其中的一个方法就是使用格雷码。

格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。

这就会避免计数器与时钟同步的时候发生亚稳态现象。

但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。

第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。

但这回导致延时的增加。

亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。

由于考虑延时的作用,空/满标志的产生并不一定出现在FIFO真的空/满时才出现。

可能FIFO还未空/满时就出现了空/满标志。

这并没有什么不好,只要保证FIFO不出现overfloworunderflow就OK了。

很多关于FIFO的文章其实讨论的都是空/满标志的不同算法问题。

在VijayA.Nebhrajani的《异步FIFO结构》一文中,作者提出了两个关于FIFO空/满标志的算法。

第一个算法:

构造一个指针宽度为N+1,深度为2^N字节的FIFO(为便方比较将格雷码指针转换为二进制指针)。

当指针的二进制码中最高位不一致而其它N位都相等时,FIFO为满(在CliffordE.Cummings的文章中以格雷码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MSB不同其他相同为满是一样的)。

当指针完全相等时,FIFO为空。

这也许不容易看出,举个例子说明一下:

一个深度为8字节的FIFO怎样工作(使用已转换为二进制的指针)。

FIFO_WIDTH=8,FIFO_DEPTH=2^N=8,N=3,指针宽度为N+1=4。

起初rd_ptr_bin和wr_ptr_bin均为“0000”。

此时FIFO中写入8个字节的数据。

wr_ptr_bin=“1000”,rd_ptr_bin=“0000”。

当然,这就是满条件。

现在,假设执行了8次的读操作,使得rd_ptr_bin=“1000”,这就是空条件。

另外的8次写操作将使wr_ptr_bin等于“0000”,但rd_ptr_bin仍然等于“1000”,因此FIFO为满条件。

显然起始指针无需为“0000”。

假设它为“0100”,并且FIFO为空,那么8个字节会使wr_ptr_bin=“1100”,,rd_ptr_bin仍然为“0100”。

这又说明FIFO为满。

在VijayA.Nebhrajani的这篇《异步FIFO结构》文章中说明了怎样运用格雷码来设置空满的条件,但没有说清为什么深度为8的FIFO其读写指针要用3+1位的格雷码来实现,而3+1位的格雷码可以表示16位的深度,而真实的FIFO只有8位,这是怎么回事?

而这个问题在CliffordE.Cummings的文章中得以解释。

三位格雷码可表示8位的深度,若在加一位最为MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的0100表示表示7,而1100仍然表示7,只不过格雷码在经过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环,其他的三位码仍然是格雷码,但这就带来一个问题,在0100的循环完成后,进入1000,他们之间有两位发生了变换,而不是1位,所以增加一位MSB的做法使得该码在两处:

0100~1000,1100~0000有两位码元发生变化,故该码以不是真正的格雷码。

增加的MSB是为了实现空满标志的计算。

VijayA.Nebhrajani的文章用格雷码转二进制,再转格雷码的情况下提出空满条件,仅过两次转换,而CliffordE.Cummings的文章中直接在格雷码条件下得出空满条件。

其实二者是一样的,只是实现方式不同罢了。

第二种算法:

CliffordE.Cummings的文章中提到的STYLE#2。

它将FIFO地址分成了4部分,每部分分别用高两位的MSB00、01、11、10决定FIFO是否为goingfull或goingempty(即将满或空)。

如果写指针的高两位MSB小于读指针的高两位MSB则FIFO为“几乎满”,

若写指针的高两位MSB大于读指针的高两位MSB则FIFO为“几乎空”。

在VijayA.Nebhrajani的《异步FIFO结构》第三部分的文章中也提到了一种方法,那就是方向标志与门限。

设定了FIFO容量的75%作为上限,设定FIFO容量的25%为下限。

当方向标志超过门限便输出满/空标志,这与CliffordE.Cummings的文章中提到的STYLE#2可谓是异曲同工。

他们都属于保守的空满判断。

其实这时输出空满标志FIFO并不一定真的空/满。

说到此,我们已经清楚地看到,FIFO设计最关键的就是产生空/满标志的算法的不同产生了不同的FIFO。

但无论是精确的空满还是保守的空满都是为了保证FIFO工作的可靠。

GPIF(generalprogrammableinterface),即通用可编程接口,是CYPRESS公司在其EZ-USBFX以及FX2系列单片机里设计的一个可由用户编程的接口,具有快速、灵活等特点,可使用多种协议完成与外围器件的无缝连接,如EIDE/ATAPI、IEEE1284、Utopia等。

对其可以根据需要进行编程,且运行中不需要CPU的干预,仅通过一些CPU标志和中断与增强型8051内核通讯。

GPIF方式,内部是一个MASTER,而要控制的外围是一个SLAVE,

读写信号和一些控制信号都是由FX2来发送的;

外围只提供给你一写握手信号连接到你的RDYX信号上的,是用于控制波形用的;

FIFO方式,你的外围是作为MASTER,而FX2做为SLAVE,读写信号都是又外围提供的!

FX2做一些配置工作的!

至于优缺点:

GPIF方式的话,固件给复杂一点!

当然如果你学会了也不是很难的!

就一开始用的话,觉得有一点复杂,因为涉及到GPIF波形的问题,而设计好这个波形的话,是有一些讲究的!

当然,你可以在网上下载到一个文档,是专门讲解GPIF波形的设计的!

另外,GPIF理论的速度比SLAVEFIFO的要高!

SLAVEFIFO方式的话,你在写固件是比较简单的!

恩……,在外围方面要做更多的工作!

另外,他的理论速度没有GPIF高!

USB固件编程之一:

固件编程的工作内容

USB固件编程可以用以下语句来精练地进行描述:

Device的固件编程,要搞定的是那几个端点。

端点多少和配置情况受所用的Device芯片决定,具体可以看芯片资料。

芯片一般提供一个中断信号,与单片机接口时,只要端点接受到数据,或发送数据成功后,便后产生中断,在固件里面,只要对这些中断进行响应即可。

当Device接收到数据时,对这些数据进行分析处理(端点0遵守标准的数据格式,其他端点受端点类型的不同,有不同的数据格式),一般来说,这些数据是主机对设备发出的请求,设备只要响应主机的这些请求即可。

Device芯片发送完数据后也会产生中断,这个中断信号告诉与之接口的单片机,可以继续发送后续的数据。

USB固件,好比一个有“妻管炎”的男人,而主机,则好是一个女管家。

一般来说,主机让干啥就干啥,所以,USB固件程序的结构一般是基于中断处理的。

平时,主程序做完必要的初始化工作后,就什么事也不做了,等待USB中断的产生,中断产生后,根据中断状态对相应的端点读取数据,或是向相应的端点发送数据。

这一点是USB通讯协议的主-从模式先天决定的。

但让人不可思议的是,这还有点象是母系氏族时期,因为,一个USB总线上,只能有一个主机,可以有多个设备,整个USB总线上通讯的协议和处理,发起与中止,基本上是主机控制的。

因此,固件编程中,只要满足了主机的要求,就万事大吉了,可以确保自己的氏族中的应有地位。

U盘固件编程之二:

固件编程的几个主要部分

在整个U盘固件中,程序从功能模块上分成两个部分:

USB协议的处理和对Flash的读写.

USB协议的处理又分成两个方面.

一是端点0的配置过程:

所有USB设备在插入USB端口时,主机都通过地址0与设备的端口0进行通讯。

在这个过程中,主机发出一系列得到描述符的请求,通过这些请求,主机得到所有感兴趣的设备的描述符,从而知道设备的情况,然后通过SetAddress为设备设置一个唯一的地址,配置过程完成以后,主机就通过为设备所设定的地址与设备通讯,而不再是使用默认地址0.但是,配置地址后,可能还要获取一次描述符,然后设置配置(SetConfiguration),之后便完成了对新插入USB总线设备的配置过程。

二是其他端点的数据通讯过程:

在配置阶段中,主机已经知道了设备的端点的使用情况,以后,便可以通过这些端点来进行特定传输方式的通讯了。

对于U盘来说,有两种传输方式,BULKONLY和CBI方式,一般使用BulkOnly较多。

这种传输方式要使用特定的Bulk端点,然后还要为其选择一种命令集。

比如UFI或SCSI,因为Bulk端点的数据没有特定的数据格式,因此,需要使用某种命令集,来约定所传数据的格式。

对于U盘固件编程来讲,就是要处理BULK端点的各种数据通讯。

除了对各个相关的端点的USB协议的处理,剩下的就是FLASH的读写问题。

这里存在两个层面的问题。

一是解决Flash读写的问题,就是说你使用的Flash,先要实现成功的读写和擦除,这部分内容,是比较成熟的,一般都使用三星公司出的K9FXX08系列的,有16M(2808),32M(5608),64M(1208),138M(1G08)。

它们的封装一致,只需要软件编程中稍做修改,便可以进行适应于另一种容量的存储器。

第二个层面的问题,就是在U盘通讯过程中的问题了。

NAND型的Flash有个特点,不可随机存取,擦除操作一次对16K的内容进行。

所以,在U盘响应过程中,不可避免要对数据进行缓存。

如果你的U盘方案中有较宽裕的RAM(超过16K),这个问题变得简单,只需要开一个16K的数组,把数据存到这16K中,最后再写入Flash即可。

否则,在缓冲上面是要花一些功夫的。

最基本的思路是用Flash的另外一个Block做缓冲空间。

但这种方式会引发下列问题:

1、速度;

2、Flash的那个用来做缓存的块将比别的块使用频度大幅上升,磨损最严重,最先坏,这影响整个Flash的寿命。

在实际处理中,引入了一系列的折中方案,比如,对Write命令所写的Block号进行判断,如果是整个的数据Block,则直接擦除原有内容,将数据写入。

再如,对于非整个Block的数据进行缓冲,而对于整个Block的读写,不缓冲直接写入。

再就是对于前面文件分配表、目录项所在的Block进行缓冲,等等。

经过这些处理,可以尽可能地提高Write的速度。

U盘固件编程之三:

合理的USB通讯调试方法和思路是成功的关键

在介绍更多细节内容之前,我不得不谈谈我对USB调试方法的理解。

USB通讯过程是一个动态的过程,是不太好使用硬件仿真器来设断点调试的,因为每一次USB的传输过程,都有时效要求,等待时间过长,通讯过程也就中止了。

但也不排除可以巧妙地使用断点仿真的方法进行调试。

但个人认为,使用串口辅助编程过程,却是一种经济有效的方法。

所谓用串口辅助调试过程,也就是在固件代码中加入类似于Printf的语句,向串口输出一些信息。

这些信息可以是几个字符(如A、B、C),或是某个变量或寄存器的值。

程序运行到此处时,便会输出这些信息,借此,便可以知道:

1、程序是否运行到此处;

2、运行到此处时相应变量或寄存器值。

这不就是硬件仿真调试的功能么?

如果想使用这种方式来调试,在硬件上必须增加一个RS232串口电平转换芯片,而且所使用的MCU得要有串口,并且,一般要自己编写Printf函数的实现方式。

这个翻翻串口控制方面的书籍,很容易就可以搞定。

串口调试的方法,还可以推广到其他的单片机应用中,在简单系统中,它基本可以替代

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2