阅读:2114回复:7
请教!CY7C68013的速率提不上去
目前我们有个项目预研,要用USB2.0进行数据上传(由FPGA传至PC机),要求速率在16M bytes/s 以上。但目前速率最高仅8M ,现在已做了如下测试工作,初步判定速率瓶颈在CY7C68013与PC机之间。
测试系统结构:CPLD => CY7C68013 => PC 1、CPLD以8M/s连续产生16位并行测试数据至CY7C68013,即16M bytes/s 2、CY7C68013配置为SLAVE FIFO工作模式,单端点。 3、PC机对接收数据计数算出速率 测试过程及问题: 1、在不同配置的PC上进行测试:单核PC上测试最高速率为4M左右;双核PC为8M;但四核PC又仅5M。这些PC主板等配置也不同。 请教:USB的传输速率是否与主板、内存或CPU等硬件相关,该如何分析 2、将CY7C68013的端点缓冲区分别配置为双缓冲和四缓冲,或者将缓冲区大小分别配置为512和1024字节,速率均无明显变化。用示波器测CY7C68013的FIFO满信号有大约一半时间有效,空信号始终无效,故判断是PC未将数据及时读出。 为进一步验证,将FIFO设定为8位数据宽度,则CPLD的数据仅低8位有效,CPLD写入数据实际速率为8M bytes/s。此时在单核PC上测得速率为4M,测FIFO满标志大约有一半时间有效;在双核PC上测得速率为8M,测FIFO满标志极少有效,即数据被及时读出,故测试速率与CPLD写入速率一致。 再将FIFO设定为16位数据宽度,则CPLD的写入速率为16M bytes/s。此时在双核PC上测得速率为8M,FIFO满标志大约有一半时间有效,与8M/16M的比值一致。 以上试验基本验证是PC未及时从FIFO中读取数据,但PC应用层只是执行了接收数据操作,不知是否低层驱动的问题。 请教:我在网上搜索时很多案例速率瓶颈都是在USB芯片和外设之间,像我们这种USB芯片与PC间的较少,是否是我们什么配置有问题,我是做硬件的,对软件不怎么了解,临时来做这部分工作。请大家帮忙分析出现这种情况可能是哪些原因,或者提出一些分析试验方法也行,不胜感激! |
|
沙发#
发布于:2009-05-17 10:01
您好,请问你是不是已经实现了数据测传输,我弄了好长时间都没有成功,不知道怎么调试,帮忙看看我的代码可以吗?谢谢了,我的qq号码是243310820,想和您探讨一下。
CPUCS = 0x08; // CLKSPD[1:0]=01, for 24MHz operation IFCONFIG = 0x0B; // 0000 1011 异步bit3 SYNCDELAY; REVCTL = 0x01; //注意,我设成自动arm 端点buffer模式 SYNCDELAY; //IFCONFIG = 0XCB; //SYNCDELAY; EP1OUTCFG = 0x20;//禁止端点EP1输出 EP1INCFG = 0x20;//禁止端点EP1输入 EP2CFG = 0xA2; // 1010 0010 bit6=1表out SYNCDELAY; EP4CFG = 0x60; //not valid SYNCDELAY; EP6CFG = 0xE2; //1110 0010 bit6=1表in SYNCDELAY; EP8CFG = 0x60; //not valid SYNCDELAY; SYNCDELAY; FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions SYNCDELAY; // see TRM section 15.14 FIFORESET = 0x02; // reset, FIFO 2 SYNCDELAY; // FIFORESET = 0x06; // reset, FIFO 6 SYNCDELAY; // FIFORESET = 0x00; // deactivate NAK-ALL //空满标记都是默认低电平有效 SYNCDELAY; PINFLAGSAB = 0xA4; //1010 0100 ,FLAGA=EP2 full flag FLAGB=EP6 full flag SYNCDELAY; PINFLAGSCD = 0xC8; //1101 1000 ,FLAGC=EP2 empty flag FLAGD=EP6 empty flag SYNCDELAY; //PINFLAGSAB = 0x00; // defines FLAGA as prog-level flag, pointed to by FIFOADR[1:0] FLAGB as full flag, //SYNCDELAY; // as pointed to by FIFOADR[1:0] FLAGC as empty flag, //PINFLAGSCD = 0x00; // as pointed to by FIFOADR[1:0] won't generally need FLAGD PORTACFG |= 0x40; // SLCS of PA6 pin SYNCDELAY; FIFOPINPOLAR = 0x00; // SLOE SLWR SLRD set all slave FIFO interface pins as active low SYNCDELAY; // out endpoints do not POR (power-on reset) armed since the defaults are double buffered we must // write dummy byte counts twice arm EP2OUT & EP4OUT by writing to the byte count w/skip. EP2BCL = 0x80; SYNCDELAY; EP2BCL = 0x80; SYNCDELAY; EP6BCL = 0x80; SYNCDELAY; EP6BCL = 0x80; SYNCDELAY; // handle the case where we were already in AUTO mode,WORDWIDE=1... EP2FIFOCFG = 0X01;//0000 0001 BIT 4=1 auto out 手动 SYNCDELAY; EP6FIFOCFG = 0x0D;//0000 1101 BIT 3=1 auto in SYNCDELAY; |
|
板凳#
发布于:2009-05-17 11:49
这样看代码我也看不出什么,不过有几点你可以注意下
1、描述符文件需要修改的与固件配置一致,特别是缓冲区大小,我开始设置错误时也无法传输 2、固件设计可以直接在CYPRESS的模版基础上修改,这样比较简单。 3、不知你的外设是什么,第一步要先确认外设是否将数据写入了FIFO,这可以通过测量FIFO满空标志来验证 4、调试可以分步进行,先直接用固件产生测试数据通过端点传送至上位机。CYPRESS有提供批量传输的例程,实现了PC将数据传送至一个端点,再通过另一个端点读回的功能,你可以参考下。 |
|
地板#
发布于:2009-05-17 21:08
谢谢楼主,留个QQ吧,想和你请教请教!!
|
|
地下室#
发布于:2009-05-18 01:06
81346608 我上QQ比较少,不一定遇得到 你可以发邮件讨论 peitao123@163.com
|
|
5楼#
发布于:2009-05-18 10:28
我测试了下数据线,发现大部分时间都是空闲状态,PC每收两个包,等待很久,然后才再接收两个包
在4M速率时两次接收间隔为250us ,请遇到过该问题的朋友指点下,谢谢 |
|
6楼#
发布于:2009-05-18 10:35
把波形发上来
|
|
7楼#
发布于:2009-05-18 10:38
请了解的朋友指点下,谢谢!
|
|