打印

CY7C68013中FIFO的多重缓冲问题

[复制链接]
6672|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guofeng4001|  楼主 | 2011-1-26 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始学习CY7C68013,遇到了一些问题。CY7C68013中FIFO的多重缓冲是怎么回事啊!比方说我在驱动中将FIFO设置双缓冲模式,是不是和兵乓缓冲一样的道理啊!一个缓冲包满了就自动上传给电脑,以后在有数据进来时就传给另一个缓冲,一直交替传输。在就是CY7C68013中FIFO满标志是指一个缓冲包满了FIFO满标志就置为低电平,还是两个包一起满了FIFO满标志就置低啊!  希望大侠们能帮忙解答。谢谢

相关帖子

沙发
guofeng4001|  楼主 | 2011-2-3 16:03 | 只看该作者
为什么没有人回复啊!各位高手大侠

使用特权

评论回复
板凳
dqyubsh| | 2011-2-3 22:00 | 只看该作者
不太容易说清楚,我说下我的理解吧。欢迎大家拍砖。
1,说FIFO满了就自动上传给电脑——这话是错的。USB2.0及1.1设备不能中断主机,只能是主机主动去访问设备。就是说,即便FIFO满了,如果主机不取,数据依然在设备的RAM里,RAM写满之后固件就不应该再写了。
2,端点0,1比较简单,缓冲区长度固定,64字节,没有多重缓冲。端点2468比较灵活,4和8可以配置成512字节的双缓冲,2和6可以配置成512字节、1024字节的2、3、4倍缓冲。
3,多重缓冲的目的是,主机(USB数据)可以和端点外部逻辑(如DSP,FPGA)直接交换信息,数据不用从CPU导进导出,从而提高了性能。
4,缓冲是指对于端点有效的内存区块数。比如,双重缓冲,在USB数据进出一个端点的同时,外部逻辑的信息也可以进出同一端点。这是手册说的。
5,假定端点2缓冲区设置为512字节,4倍缓冲,尽管这一端点占有了2048字节RAM,但CPU只认识“激活的”512字节缓冲区。这可以从寄存器长度看得出来,比如,EP2BCH:L是11位,可对1024字节的最大缓冲区长度进行计数,EP4BCH:L是10位,可对512自己的最大缓冲区长度进行计数。
6,从第5点可以看出,FIFO读写数据是自动完成的,至于乒乓方式也是隐式实现的,CPU不了解也无需了解如何乒乓。CPU可以对FIFO进行少量的控制,传输有自动和CPU干预两种。了解FIFO的工作状况,可以通过中断、获取其EPxBCH:L长度、空、满、空闲等等一系列寄存器。寄存器太多了,所以显得这块特别复杂。
7,一般地,在TD_Poll循环中,对输出缓冲区判断是否空,空则继续写FIFO,将主机来的USB数据写到外部逻辑;对输入缓冲区判断是否满,满则不再写,外部逻辑来的数据将被固件自行抛弃。这可以回答你的第二个问题,缓冲区满是指所有输入缓冲区都满了,不管几重缓冲区都没地可写了。
8,再深入地探讨一下。对输入缓冲区,如果主机长时间不读取USB设备的数据,那么它再次读到的数据,将是设备之前写满的数据。而外部逻辑新来的数据,将在主机将缓冲区读出空间之后才能更新。实际上,此时的数据会“跳”。你所说的“交替传输”将无法实现。这是USB2.0不能申请主机中断的弊病,在实时采集时,主机必需有个线程不停地读数。据介绍,USB3.0可以中断主机,值得期待。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
guofeng4001 + 1
地板
dqyubsh| | 2011-2-3 22:10 | 只看该作者
上边那个:L是:L,自动给翻译成了图标。做两个修改。
3,多重缓冲的目的,可以提高系统性能,减少大数据进出时的等待,使突发数据变得平滑。这样说更恰当。
7,在TD_Poll循环中,对输出缓冲区判断是否空,空则继续写FIFO(去掉FIFO字样,应该写给外部逻辑),将主机来的USB数据写到外部逻辑;

使用特权

评论回复
5
guofeng4001|  楼主 | 2011-2-4 20:04 | 只看该作者
3# dqyubsh
我能加你QQ吗?看来您再CY7C68013方面很有研究!

使用特权

评论回复
6
guofeng4001|  楼主 | 2011-2-4 20:07 | 只看该作者
4# dqyubsh
为什么主机会不申请上传数据啊! 能详细说哈吗?大侠。

使用特权

评论回复
7
dqyubsh| | 2011-2-5 00:19 | 只看该作者
根据USB协议规定,任何传输都是主机(HOST)发起的。这是一种主从结构,主机是主,所有USB设备都是从。主机不发命令,设备就不能主动联系主机。
而中断是主动的,如果设备想主动通知主机自己的缓冲区满了,这就要向主机发中断申请。主机要相应地产生中断源,在windows系统下就会产生一个消息。事实上,windows并没有这样的消息。这种“从”中断“主”的方式,在USB协议里是不被允许的。
换言之,主机获取设备的数据,完全是主机主导。主要想要数,设备就给;主机不要,设备就把数据保存在自己的缓冲区,比如FIFO,比如RAM。设备新来的数据可能会刷掉之前没取走的数据,也可能不清,也可能会自己建立个环形缓冲区暂存几组数据。这些行为都是固件自己实现的,跟主机没关系。
你仔细看下CYAPI.PDF,也不会发现有设备中断主机的函数。

使用特权

评论回复
8
guofeng4001|  楼主 | 2011-2-5 16:13 | 只看该作者
7# dqyubsh
我能加你QQ吗?

使用特权

评论回复
9
guofeng4001|  楼主 | 2011-2-5 16:21 | 只看该作者
3# dqyubsh
有什么方法让主机不停地读数啊!比方说DSP不停的发数据,让USB不停的发给电脑。

使用特权

评论回复
10
dqyubsh| | 2011-2-8 04:48 | 只看该作者
我不用QQ。。。

这个,一句两句哪能说的清。大致上,主机用线程。如果是DSP应用,也有不同模式,USB芯片做Mastr或者Slave,都不一样。。。

我建议你把应用模式说清楚,或者看一下DSP开发板,它上边都有USB的实现。太笼统的问题,就是猜谜。

使用特权

评论回复
11
guofeng4001|  楼主 | 2011-2-8 19:38 | 只看该作者
7# dqyubsh
有什么好办法能使电脑接收包的速度快些啊!  我看很多人得USB速度能达到20几M了 啊!https://bbs.21ic.com/viewthread.php?tid=114226&highlight=CY7C68013%E7%9A%84%E9%80%9F%E7%8E%87%E6%8F%90%E4%B8%8D%E4%B8%8A%E5%8E%BB 您能不能帮忙看哈他最后的速度怎么能达到那么快啊!是不是PC端驱动有很大的学问啊

使用特权

评论回复
12
dqyubsh| | 2011-2-9 00:43 | 只看该作者
这个你可以看一下CY最新的驱动程序,Cypress Suite USB 3.4.4,里边有个测试程序,CyStreamer,这家伙最大速率能测到40M,忘记是读还是写了。

CYPRESS可以解决你的一切问题,我建议你读遍CYPESS的全部资料,以及CYPRESS的网站上所有KB。在这点上,CY确实做的非常棒。

使用特权

评论回复
13
longwonder| | 2011-2-12 09:32 | 只看该作者
我测了一下CyStreamer这个上位机,在我的笔记本上传输速度轻松达到了43MB,还是很快的。

使用特权

评论回复
14
hYb871104| | 2013-1-14 17:50 | 只看该作者
你好,我把CyPRESS提供的cystream.hex文件烧写到EEPROM中后,为什么我的CyStreamer不能检测传输速率呢?里面的端点也看不到

使用特权

评论回复
15
helloc12| | 2015-9-12 10:53 | 只看该作者
dqyubsh 发表于 2011-2-3 22:00
不太容易说清楚,我说下我的理解吧。欢迎大家拍砖。
1,说FIFO满了就自动上传给电脑——这话是错的。USB2.0 ...

您好!想请教您一个问题,当芯片在SLAVE FIFO AUTO模式下,EP6 FIFO里没有数据,此时上位机要求IN传输则会发生错误。而USB读取有个超时时间,如果在超时时间内填充FIFO却不能实现正常传输,并且芯片似乎因为第一次读取而死掉,请问该如何解决这个问题?

使用特权

评论回复
16
electronictech| | 2016-6-24 16:07 | 只看该作者
您好,我看了你的cy这篇有关缓冲区的解读,我对cy有很多疑问,你有什么可以方便向您请教的方式吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝