阅读:2768回复:23
关于bulk和interrupt传输的困惑
书上说interrupt是bulk的一种情况,只是bulk利用sof,1ms发一次表示帧到达,而interrupt是人为控制若干ms发一次,但是这样的话bulk不是也是中断了,二者到底什么区别呢?
|
|
最新喜欢:![]() |
沙发#
发布于:2003-01-23 19:47
客气了,我也只是说说我的一点理解而已,如果能对你们有所帮助的话,我也甚感欣慰呀! :)
|
|
板凳#
发布于:2003-01-23 14:43
非常感谢jinghuiren,确实要解决速度问题,这是比较理想的方法,也与我当初做的pci传输模式的设计思路一致了。
总算可以结贴了,如果版主看到这帖子,我觉得应该加到精华去,因为它是每个设计usb者确定方案的必经之路。 jinghuiren给我们提供了一种考虑方法。 |
|
地板#
发布于:2003-01-23 13:33
如果你用8051来转移数据的话估计是不行的,就算是单周期指令,每秒钟也只能转移24MB的数据,这可完全是理论上的值!不过你的8位AD每秒钟也就产生20M字节的数据,基本上还算可以吧,不过我想你如果要外接CPLD或FPGA的话,最好自己做一个向FIFO填数据的逻辑,因为FX2得端点也是FIFO,所以做起来并不困难,这样向FX2写数据的速率是由你外部的逻辑期间的时钟控制的,例如你要使用20M的时钟,用16位总线,那数据率能达到40MB,而你的8051只管初始化,在高速数据传输时用AUTOIN 或AUTOOUT的方式,再慢一点的方法是你用8051去检查端点的空和满,如果是满的,就使该端点生效,等下一个IN令牌到来时发走,只要你不是用8051向端点中写数据,那就能达到较高的速度
对于少量的OUT数据,你可以用控制传输的方式,把那些数据定义成一个厂商请求(VENDOR REQUEST,一次能传输最多64字节数据),发送到设备即可,这个问题另外有一贴有人详细回答了,你看一下:“ 怎样用端点0的控制传输(OUT)传输数据 ” |
|
地下室#
发布于:2003-01-23 11:15
还有关于双缓存的一个问题,如果上行数据即采样数很多,而下下行数据很少,就几个控制信号,设置双缓存应该不合算把,我想可能要设计两个端口,分别控制了,是吗?
|
|
5楼#
发布于:2003-01-23 11:12
\"因此速度的瓶颈在填充USB端点的外部控制器的时钟(如果你用100M的DSP来做这件事,那没问题,如果你用51来做,肯定不行,因为68013内部51的时钟是48M,但是51是4时钟周期执行一条指令,所以是12M,因此不行)。\"
原来我看fifo和gpif的读写,以为可以完成40mhz传输,因为他们是单周期读写的,数据进入缓冲,不就可以读了吗? |
|
6楼#
发布于:2003-01-22 16:29
在说明一点,usb设备与主机的通讯不是用中断实现的,而是用查询实现的,所以不会有主机来不及读数的问题,除非是信号太差,传输中出现多次错误。
当端点中的数据为满时,只要主机方的in令牌到来,数据就会自动打包发走,然后上面发送下一个in令牌到设备,在这两个in令牌的发送间隔内,你的设备肯定不会把端点填满(发送速率是480Mbps),所以实际上是主机在等待你把数据准备好,而不是你准备好了数据通知主机(usb侍从设备,除了远程唤醒外它不会主动向主机发送任何的信息!) |
|
7楼#
发布于:2003-01-22 16:21
没错!
有一点要纠正,就是上层应用程序不能发现你的端点已经满了,所以在速度很快的情况下你必须在上层不断的调用DeviceIoCtl函数来主动读设备的数据,如果设备没准备好就会发送nak给你,host controller如果收到nak,它会接着发送下一个in令牌到设备,直到读到数据为止,应用程序中一旦读取到数据就接着发送下一个DeviceIo命令,当收集一定的数据后可以存放到文件中,如此循环往复,所以建议为读写数据专门开一个线程。 |
|
8楼#
发布于:2003-01-22 15:44
引用:你别用中断方式,你用bulk方式,上层应用程序循环不停的读,下面设备放不停的写端点。
我就是这么想的,关于fifo只是我对“因为68013内部51的时钟是48M,但是51是4时钟周期执行一条指令,所以是12M”的理解,认为我利用fifo将数据的速度降到10mzh,所有的问题就解决了。 实际上我就是用cpld,我的采集卡以前是pci擦卡形式,完全做好了,只是老师想将它改用usb数据传输方式,当然其中没有fifo,我想可能要用fpga了,当时我用它的资源做了个fifo。 方案我就是那样想的,只是我在做pci卡时遇到,主机相应硬件中断1ms时就来不及取数了,我怕在这儿也遇到,“只要你能把数据写到端点里,USB就能给你发走”是否是说没有这个问题,只有我及时向端点送数。 总结一下,由于ad采样太快,时时我的port,gpif,fifo工作模式多不适用,所以我的比较理想的方式使用fpga,或cpld进行数据缓存,存满一帧(如256字节)就取添丛端口,上层应用程序发现端点有数就去读,其中端点设置成双缓冲形式。对吧? |
|
9楼#
发布于:2003-01-22 15:08
你别用中断方式,你用bulk方式,上层应用程序循环不停的读,下面设备放不停的写端点。
按你的意思你还是要用51来读取外加fifo中的数据,你要是4个数据里取一个那倒是可行的,不过你还得外加逻辑来控制吧,我原始以为你外部还有一个控制起来专管填充端点,七是用CPLD来实现填充端点和一些控制工作就可以了。这样会比用51快的多,当然造价要贵一点了。 |
|
10楼#
发布于:2003-01-22 11:05
太好了!
我看fifo的工作模式,觉得它应该简单一些吗,从设备吗被动者应该简单阿? 填充的速度上限是12mhz,所以我在ad和usb中间加一个fifo什么的,只要理论上把数据至少4个数据归为一帧送就没问题了是吗? 引用:只要你能把数据写到端点里,USB就能给你发走 主机中断((1/40mhz)*一帧数据个数),大概在1毫秒级,他响应来的给吗? |
|
11楼#
发布于:2003-01-22 10:42
jinghuiren真是对USB设备理解的太透彻了,一问一答解决了我很多疑难问题,呵呵,我决定赠送100分表示心意(好像要我自己开贴?)!
我们这些初学者,就是需要大侠这样的人的指导啊…… 大侠请看我的新贴…… |
|
12楼#
发布于:2003-01-21 17:00
如果你能用slave fifo的模式能把数据顺利取走,那估计用gpif肯定能行,因为据说后者比前者快!但是好像前者简单一点吧。
还有你40M的AD是多少位的(40M式采样率吧),如果是8位的,那每秒钟能产生数据40M字节,这个数据量可不小,但是理论上USB控制器能把数据全部传到主机上,前提是你的外部控制器填充端点的速度足够快!只要你能把数据写到端点里,USB就能给你发走。否则你肯定不能保证数据不重叠,因此速度的瓶颈在填充USB端点的外部控制器的时钟(如果你用100M的DSP来做这件事,那没问题,如果你用51来做,肯定不行,因为68013内部51的时钟是48M,但是51是4时钟周期执行一条指令,所以是12M,因此不行)。 |
|
13楼#
发布于:2003-01-21 11:09
jinghuiren :
看来你对速度挺有研究的,想再问你一个速度问题,我的ad是40mhz,我才用gpif能否保证再25ns内把数据取走,来防止数据重叠,如果不行的话,我是否只能用slave fifo模式了 |
|
14楼#
发布于:2003-01-21 09:09
长,长,长,长.....
|
|
15楼#
发布于:2003-01-20 18:53
netpk:
配成双缓冲后的单个In端点用BULK方式是最快的。 hemu: 你的那种方式还是让8051参与了数据传输!8051不参与数据传输的情况是将AUTOIN设为1,这样固件中的TD_POLL( )函数是空的,没有你摘出的那几行代码,此时只要缓冲区被填满,数据就会自动生效发走,也就是所谓的slave fifo模式,你可以在仔细看一下技术参考第九章的9。3。11节,里面有说明 |
|
16楼#
发布于:2003-01-20 15:00
可是我觉得应该在填充完毕后给一个0fah命令,使能端点缓冲区才行啊...
//////////////////////////////////// if(!(EP2468STAT & bmEP2EMPTY)) { // check EP2 EMPTY(busy) bit in EP2468STAT (SFR), core set\'s this bit when FIFO is empty if(!(EP2468STAT & bmEP6FULL)) { // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set\'s this bit when FIFO is full 这是我从程序中取出的一段,这儿的core自动设置,应该就是指 它自动取数据当满时。 |
|
17楼#
发布于:2003-01-20 14:42
那只是协议上规定的的最大数据,实际上是不可能达到那么高的速度的,你要想不断的往端点填充数据,那主机方就要不停的读,可是你设备方有那么多的数据要传吗,而且你的设备方的外部控制器的时钟能达到480M吗,这些都是问题。 多谢jinghuiren,可惜没有办法给分…… 我还想问一下,配成双缓冲后的单个In端点 是使用Interrupt还是查询方式传输快? |
|
18楼#
发布于:2003-01-20 13:56
第一个问题:你不用管怎么响应设备的in令牌包,你之需要不断的填充端点,达到最大包大小时该端点会自动有效,如果此时候主机的in令牌包到来,那数据会自动打包送走,不需要你来干预。 可是我觉得应该在填充完毕后给一个0fah命令,使能端点缓冲区才行啊... |
|
19楼#
发布于:2003-01-20 13:48
那只是协议上规定的的最大数据,实际上是不可能达到那么高的速度的,你要想不断的往端点填充数据,那主机方就要不停的读,可是你设备方有那么多的数据要传吗,而且你的设备方的外部控制器的时钟能达到480M吗,这些都是问题。
端点多了并不见得就快,如果在没有太多错误的情况下,使用1个端点,配置成双重缓冲是最快的! |
|
上一页
下一页