flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
阅读:2789回复:13

Sl811HS写U盘的速度为什么只有1M/分钟?

楼主#
更多 发布于:2005-06-27 22:53
  主体框架是照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 会耽误很长时间,对吗
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-28 12:42
17KBYTE/S 是慢了点,DELAY15MS是个问题,大概占用了30秒的时间,我的经验是本延时在第二次及以后是不必要的(原理还未明白),用标志作分支。我用了51控制811,现在到了75K左右。几个地方注意一下:没有必要让每帧数据在SOF后才送,注意看一下HOST CONTROL REGISTER的BIT3,(有历史贴,查一下),否则速度不会超64K的;采用A/B两套寄存器模式后台互换发送(如果DSP执行很快的话);如果再试图提速,优化核心发送程序,甚至用嵌汇编的手段。
zhoncai
驱动牛犊
驱动牛犊
  • 注册日期2005-06-25
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分155分
  • 威望17点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-28 20:53
flyiron_2005, templa
两位好, 我现在用51加SL811做USB主控制器,但是在控制传输时发送SETUP数据包,之后读取SL811的EP0STATUS寄存器的值为0x40, timeout 错误。  还有在U盘插入后,SL811的中断寄存器Intstatus的值是0x60, 即D6位是1,表示U盘没有准备好,不知何因? 调试了几天了,一直没有办法解决,还请两位指点。
flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-28 22:31
zhoncai, 启动SOF,RESet,读取的数应该是对的了,看Cypress公司的源程序就可以了,
谢谢templa, 我去试试:)
flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-28 22:31
还有一个影响问题:读写U盘FAT16,每写完一个簇,就要重写找一次FAT,找到空簇,继续写这个簇,我想这样效率太低了,怎样解决好呢
flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-28 22:38
templa,BIT3是Reserved啦, 是不是指control Register[00]的 Bit5啊,Synchronize with the SOF transfer?
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-29 09:05
糟糕!看叉行了,是BIT5,对不起!
对于查闲簇的问题,我是这样做的:根据所需要写的文件的簇数一次性在FAT表中查得,形成一个定长链表存在RAM中,再直接按照这个链表进行簇数据写,完成后一次性刷FAT16表,更改文件项!当然这需要你有足够的RAM,不过对于你的DSP也应该不是问题啊--只要你的文件不是太大,大的话分几次就行了!
另外如果你今后知道了DELAY15MS的作用和解决办法,希望你能通知我templa_0520@hotmail.com
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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可能有问题。
zhoncai
驱动牛犊
驱动牛犊
  • 注册日期2005-06-25
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分155分
  • 威望17点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
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. 希望和你聊一下.
flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-29 14:45
templa, 弄懂了,告诉你:)也谢谢你,去掉延时不行,并且这个延时是随U盘不同而不同,有些U盘比这个时间还长啊!难以忍受。Bit5 [00], 我原来就设成了0的,才有那么点速度:)我用的是Cypress公司的源程序啦
templa,看Cypree公司的源程序,看懂后,调通还是没问题的,好运!
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-29 15:05
zhoncai:我没有QQ,用MSN,上贴里有,共同进步!
flyiron_2005:我不认为延时不可去除,BUSHOUND里看看所有的U盘操作哪里要延时。用延时必然只能是权宜之计,我将继续努力因为我要写的是一个2056K的文件。CYPRESS的源程序会有很多的问题,我吃过亏的,切记不可大用啊(除非你有新的版本->给我啊!),祝好运!
flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-06-30 19:56
tmpla, 我也在试呵:) 一次性找到簇,然后一次性写入,可节省很多时间,我现在写文件速度是1M/40s,但那个延时根据U盘的不一样而不同,这里不理解.如果写很几M大的文件的话,把FAT里找簇处理好,也可节省时间.我也认为这个延时可不要,否则U盘跟串口速度一样了:)没了新版本,只能自己做了.不知哪位大侠来说说其中的道理
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-07-01 13:01
没错!我用的51+811/BENQ256M,USB20的写2M只要22秒,而杂牌64M/USB11的就要37秒。有一个因素也在起作用,就是“扇区每簇”,该值小的相对要操作的写次数会多,如果嵌延时就更厉害了。你的现在15MS,我的用过200MS,后果当然是奇慢无比。我上次说过,你可以先注释掉原先的延时,取而代之以两个断点,两次停顿后无间断运行,看看是否有效果!
flyiron_2005
驱动牛犊
驱动牛犊
  • 注册日期2005-05-28
  • 最后登录2006-07-15
  • 粉丝0
  • 关注0
  • 积分499分
  • 威望53点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-07-01 21:18
templa,你的差不多100k了,己经很快了:)那我也买一个BENQ 256M的去:)
游客

返回顶部