阅读:2789回复:13
Sl811HS写U盘的速度为什么只有1M/分钟?
主体框架是照cypree公司的写的,访问U盘是参考culong的,为什么速度如此之慢?网上大家都说不快,但不至于这么慢吧,我是通过DSP C31的芯片操作SL811Hs的, 这个速度应该不是问题.
if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW))) return FALSE; DelayMs(15); if(!epBulkSend(pBuffer,DeviceInfo.BPB_BytesPerSec)) return FALSE; 整个程序写下来,这个Delay 15ms 会耽误很长时间,对吗 |
|
沙发#
发布于:2005-06-28 12:42
17KBYTE/S 是慢了点,DELAY15MS是个问题,大概占用了30秒的时间,我的经验是本延时在第二次及以后是不必要的(原理还未明白),用标志作分支。我用了51控制811,现在到了75K左右。几个地方注意一下:没有必要让每帧数据在SOF后才送,注意看一下HOST CONTROL REGISTER的BIT3,(有历史贴,查一下),否则速度不会超64K的;采用A/B两套寄存器模式后台互换发送(如果DSP执行很快的话);如果再试图提速,优化核心发送程序,甚至用嵌汇编的手段。
|
|
板凳#
发布于:2005-06-28 20:53
flyiron_2005, templa
两位好, 我现在用51加SL811做USB主控制器,但是在控制传输时发送SETUP数据包,之后读取SL811的EP0STATUS寄存器的值为0x40, timeout 错误。 还有在U盘插入后,SL811的中断寄存器Intstatus的值是0x60, 即D6位是1,表示U盘没有准备好,不知何因? 调试了几天了,一直没有办法解决,还请两位指点。 |
|
地板#
发布于:2005-06-28 22:31
zhoncai, 启动SOF,RESet,读取的数应该是对的了,看Cypress公司的源程序就可以了,
谢谢templa, 我去试试:) |
|
地下室#
发布于:2005-06-28 22:31
还有一个影响问题:读写U盘FAT16,每写完一个簇,就要重写找一次FAT,找到空簇,继续写这个簇,我想这样效率太低了,怎样解决好呢
|
|
5楼#
发布于:2005-06-28 22:38
templa,BIT3是Reserved啦, 是不是指control Register[00]的 Bit5啊,Synchronize with the SOF transfer?
|
|
6楼#
发布于:2005-06-29 09:05
糟糕!看叉行了,是BIT5,对不起!
对于查闲簇的问题,我是这样做的:根据所需要写的文件的簇数一次性在FAT表中查得,形成一个定长链表存在RAM中,再直接按照这个链表进行簇数据写,完成后一次性刷FAT16表,更改文件项!当然这需要你有足够的RAM,不过对于你的DSP也应该不是问题啊--只要你的文件不是太大,大的话分几次就行了! 另外如果你今后知道了DELAY15MS的作用和解决办法,希望你能通知我templa_0520@hotmail.com |
|
7楼#
发布于:2005-06-29 09:32
zhoncai:
你现在用的底层程序是自己编的还是他人提供的?插入/拔出的问题没解决怎么还能发SETUP呢? 引用“还有在U盘插入后,SL811的中断寄存器Intstatus的值是0x60, 即D6位是1,表示U盘没有准备好”,何出此言?!插入U盘后就应该是0x60啊(0B01100000),表示“设备插入/拔出”的变化被检测到了,根据原先的状态即知道现在的状态,比如原先是拔出的现在就是插入,反之亦然! 你是说第一次发SETUP的状况吗?还有0X40是NACK错误,非TIMEOUT。你发的SETUP数据U盘应该并未收到,我觉得初始化或者usbXfer/ep0Xfer可能有问题。 |
|
8楼#
发布于:2005-06-29 11:06
templa:
谢谢你的答复! SL811的datasheet上描述中断标志寄存器(0x0D) 的Bit6如下: When bit-6 of register 05H is set to one, this bit will be the Resume detection Interrupt bit. Otherwise, this bit is used to indicate the presence of a Device, “1” = device “Not present” and “0” = device “Present.” 所以我感觉插入U盘时,如果正常的话Bit6=0. 早上有人告诉我是因为SL811不支持U盘,建议我换用爱国者的. 我认为中断标志寄存器(0x0D)在插入U盘是的值应是:0xA0(0B10100000): Bit7 = 1, 因为我用的U盘是一个全速设备. Bit6 = 0, 表明U盘已经准备好. Bit5 = 1, 说明U盘的插入. Bit4 = 0, 因为没有打开SOF记数, 应该为0吧. Bit3 = 0, Bit2 = 0, 两位保留. Bit1 = 0, USB-B Done Interrupt flag 为0. Bit0 = 0, USB-A Done Interrupt flag 为0. 对不起,是我写错了,发SETUP后,收到的是0x04,timeout错误. 不知道这样理解对不对? 我的QQ: 407131688. 希望和你聊一下. |
|
9楼#
发布于:2005-06-29 14:45
templa, 弄懂了,告诉你:)也谢谢你,去掉延时不行,并且这个延时是随U盘不同而不同,有些U盘比这个时间还长啊!难以忍受。Bit5 [00], 我原来就设成了0的,才有那么点速度:)我用的是Cypress公司的源程序啦
templa,看Cypree公司的源程序,看懂后,调通还是没问题的,好运! |
|
10楼#
发布于:2005-06-29 15:05
zhoncai:我没有QQ,用MSN,上贴里有,共同进步!
flyiron_2005:我不认为延时不可去除,BUSHOUND里看看所有的U盘操作哪里要延时。用延时必然只能是权宜之计,我将继续努力因为我要写的是一个2056K的文件。CYPRESS的源程序会有很多的问题,我吃过亏的,切记不可大用啊(除非你有新的版本->给我啊!),祝好运! |
|
11楼#
发布于:2005-06-30 19:56
tmpla, 我也在试呵:) 一次性找到簇,然后一次性写入,可节省很多时间,我现在写文件速度是1M/40s,但那个延时根据U盘的不一样而不同,这里不理解.如果写很几M大的文件的话,把FAT里找簇处理好,也可节省时间.我也认为这个延时可不要,否则U盘跟串口速度一样了:)没了新版本,只能自己做了.不知哪位大侠来说说其中的道理
|
|
12楼#
发布于:2005-07-01 13:01
没错!我用的51+811/BENQ256M,USB20的写2M只要22秒,而杂牌64M/USB11的就要37秒。有一个因素也在起作用,就是“扇区每簇”,该值小的相对要操作的写次数会多,如果嵌延时就更厉害了。你的现在15MS,我的用过200MS,后果当然是奇慢无比。我上次说过,你可以先注释掉原先的延时,取而代之以两个断点,两次停顿后无间断运行,看看是否有效果!
|
|
13楼#
发布于:2005-07-01 21:18
templa,你的差不多100k了,己经很快了:)那我也买一个BENQ 256M的去:)
|
|