阅读:2355回复:13
对U盘进行扇区读写的延时如何把握?
在诸多的已公开的代码关于51+811HS的例程中总是看到在进行WRITE10命令的过程中用到了很多延时,发CBW后有延时,再发数据又延时,延时少了就NAK,难道延时不影响读写速度吗?512字节的扇区用了2个200豪秒的延时,每秒的写速度只剩下几K了,我要写一个2M的文件,岂不是要命了?
知道这里大侠特多,还望多多帮忙啊! |
|
最新喜欢:![]() |
沙发#
发布于:2005-05-13 11:45
我用CYPRESS提供的代码执行BUFWRITE(),光64字节的加载就用了1200微秒,速度当然上不来,用ARM可能速度快,单总不能可以优化时,浪费带宽,我用的P89C51RD2,22M晶振,12周期的。你用USB-A/B切换吗?
|
|
板凳#
发布于:2005-05-13 11:33
我开始也用了cypress的代码,但是感觉太乱个了。后来我自己全部重写了。用汇编语言似乎没有必要,C语言生成的代码还是可以的
|
|
地板#
发布于:2005-05-13 09:49
已经根据各大侠提示情况给分了!谢谢各位,还请继续帮助!
to shentu:811HS的收发控制寄存器共有2套,EP0CONTROL是USB-A的控制寄存器,EP1CONTROL是USB-B的,我认为这才是用作PINGPONG控制的硬件支持,而原先CYPRESS提供的程序并未支持本人的看法,而是采用双缓冲、查询方式完成传输的。我只能认为这是不完全的PINGPONG机制,不能达到高速传输的目的。 to okok_a:SOF位的作用真是很神奇,速度有提高。我有疑问请帮助确认:CYPRESS提供的原代码很粗放,我一直把它当权威可是就限制了我的思维,我是否应该抛弃它?另外bufwrite()子程序的效率好象太低了,您是否采用嵌汇编的方法提高效率的? |
|
地下室#
发布于:2005-05-13 09:23
正是!CYPRESS的代码中并未对EP1CONTROL作处置,我一直以为我的程序已经采用PINGPONG机制,难道没起作用?!我现在还没到FLASH读数据呢,就用XDATA发数据,才20K BYTE/S。我仔细检查一下!请大侠继续指教,顺便问一下,如何给分? 你说的EP1CONTROL是个什么东西?用来配置BULK 传输的吗?PingPong跟这个应该没有关系,虽然我没有用过cypress的东西,但按一般的想法,应该是有一个寄存器用来控制pingpong缓存在USB和单片机之间的切换。另外,usb的bulk传输是用中断来做的。。 |
|
5楼#
发布于:2005-05-12 08:44
正是!CYPRESS的代码中并未对EP1CONTROL作处置,我一直以为我的程序已经采用PINGPONG机制,难道没起作用?!我现在还没到FLASH读数据呢,就用XDATA发数据,才20K BYTE/S。我仔细检查一下!请大侠继续指教,顺便问一下,如何给分?
|
|
6楼#
发布于:2005-05-11 13:53
热心人多了就是好!谢! 架构设计就不合理,应该搞一个\"乒乓\"缓冲,当一块缓冲在与flash交换数据时,另一块可以被usb使用来收发数据. |
|
7楼#
发布于:2005-05-10 18:23
EP0Control,EP1Control的第5位SOF的作用:
值为1:下一个数据包在新的SOF后发送。 值为0:一旦SIE空闲,下一个包将立刻发送,不用等待SOF |
|
8楼#
发布于:2005-05-10 13:09
热心人多了就是好!谢!
我现在的情况就是要在WRITE10的发CBW、发DATA、收CSW三者之间给延时,不给就NAK!而且在发DATA的阶段很明显是每64字节(PAYLOAD)占用1MS,太慢了,OKOK_A大侠指的启用SOF同步是怎么一回事啊? |
|
9楼#
发布于:2005-05-10 12:41
楼上的说法是错误的。只要不启用SOF同步,每个桢可以发多个数据包。
51单片机本来就很慢了,延时是完全没有必要的。我做的时候从来没有延时,也没有出过错。 |
|
10楼#
发布于:2005-05-10 09:49
CBW+DATA+CSW
每个阶段都要判断是否结束(例如查询到SIE将数据发完),811HS是1.1HOST(每1毫秒只送一帧),DATA每次最多只能传输64B,512B要分8次传。 |
|
11楼#
发布于:2005-05-09 15:56
谢谢!我是用51+811HS向U盘发送WRITE10,先送CBW再发512字节数据,然后是收数据,不加个200豪秒的延时在每步之间就出错。是否底层程序的问题?在查询到SIE将数据发完我才退出的,不应该还要等,U盘要时间执行我发送的命令不需要这么长的时间,用BUSHOUND看本U盘的扇区写,非常快。而且我的数据好象每1毫秒只送一帧,真受不了。能请大侠多给点帮助吗?
好不容易等到大侠,不能轻易放弃! |
|
12楼#
发布于:2005-05-09 13:50
一般不采用延时的方法,不可靠也没有效率。可以通过判断标志检查有没有结束。例如WRITE10,如果是往FLASH里写,可以通过读取FLASH的状态获得写的状态,如果把FLASH的R/B信号引出来可以检测R/B信号,从而知道是否结束。
|
|
13楼#
发布于:2005-05-09 08:21
没有路过的神仙吗?顶顶看!
|
|