阅读:1976回复:8
68013的Bulk传输丢数据咋办?
6MHz的实时数据送到68013的端点去(EP6IN 512*4)
用Bulk,AutoIN AutoInLength 512 MaxPacketSize 512 但是应用程序读回数据的时候出现数据的间歇性丢失 应用程序的做法就是一个循环: for(i=0;i<readTime;i++) { if (!DeviceIoControl(m_hDevice,IOCTL_EZUSB_BULK_READ,&bulkControl, sizeof (BULK_TRANSFER_CONTROL),resbuff,readLength,&rcnt,NULL) ) { strMsg.Format("GPIF Read Error! Last Read Length is: %d.",rcnt); SetWindowText(strMsg); } } 现在考虑可能是因为应用的速度跟不上 导致数据在68013的端点FIFO中溢出而丢失。当然也有可能是别的原因。。。 除了中间加一级SRAM缓冲的做法外 大虾们还有什么好的建议么?万分感谢~ [编辑 - 12/23/04 by hackerapple] |
|
沙发#
发布于:2004-12-23 15:32
也许只能用等时传输了
或者让缓冲瞒的时候数据先停一下,等host读后再继续 |
|
|
板凳#
发布于:2004-12-23 16:44
这是一位大虾给我的建议,大家以为如何?
我现在正在尝试
|
|
地板#
发布于:2004-12-23 21:30
6MHz的实时数据送到68013的端点去(EP6IN 512*4) 应用的速度当然没有问题,你多大的速度? 20多M字节/秒没有问题。 |
|
|
地下室#
发布于:2004-12-23 22:26
6MB/s
如果老大觉得应用没问题的话 可否指教一下问题大约出在什么地方呢?谢~ 应用的速度当然没有问题,你多大的速度? |
|
5楼#
发布于:2004-12-24 10:27
当时我做时,外部有一个16K的fifo,主机读取时,可以达到30MB/s
数据未丢。 如果全靠usb内部512×4的fifo,估计来不及,测68013的信号时,usb‘满’信号之间的间隔总是会有100us(可能更长,一时忘了)的空闲时间出现,即主机读取时,总是会有空闲时间出现,如果从驱动上考虑,这个100us的时间应该想法去掉,否则没办法解决丢失现象 100us×6MB/s=600B > 512 |
|
6楼#
发布于:2004-12-25 14:37
当时我做时,外部有一个16K的fifo,主机读取时,可以达到30MB/s 你的意思是中间不加一级SRAM或者FIFO做缓冲是很难不丢的是吧? 5555 如果在硬件不允许做太大改动的前提下,能怎么做呢 我现在将应用的那个for循环拿到驱动中去做,貌似还是不行。 AllenZh老大,给指条活路吧~ |
|
7楼#
发布于:2004-12-28 10:24
这么算吧:
usb在1ms间隔中,高速usb可以读取8个微帧,每次512个字节,每个微帧时间是125us; 如果每次主机读取时,1ms中都可以读8个包,那么你的时间是来得及的,但是‘实际上’主机要处理其他事务时,有可能只读了7个包甚至更少,还有一个包的时间125us或更多时间是没有读的,那么,没有更多缓冲的情况下,总线空闲时,外部数据就只有丢的份了 |
|
8楼#
发布于:2004-12-28 16:13
外部加个缓存,因为PC读取数据的请求可能会超时。
|
|