templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2353回复:13

对U盘进行扇区读写的延时如何把握?

楼主#
更多 发布于:2005-05-08 10:23
在诸多的已公开的代码关于51+811HS的例程中总是看到在进行WRITE10命令的过程中用到了很多延时,发CBW后有延时,再发数据又延时,延时少了就NAK,难道延时不影响读写速度吗?512字节的扇区用了2个200豪秒的延时,每秒的写速度只剩下几K了,我要写一个2M的文件,岂不是要命了?
知道这里大侠特多,还望多多帮忙啊!

最新喜欢:

HuYuguangHuYugu...
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-09 08:21
没有路过的神仙吗?顶顶看!
p_y_h
驱动牛犊
驱动牛犊
  • 注册日期2004-04-27
  • 最后登录2006-04-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-09 13:50
一般不采用延时的方法,不可靠也没有效率。可以通过判断标志检查有没有结束。例如WRITE10,如果是往FLASH里写,可以通过读取FLASH的状态获得写的状态,如果把FLASH的R/B信号引出来可以检测R/B信号,从而知道是否结束。
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-09 15:56
谢谢!我是用51+811HS向U盘发送WRITE10,先送CBW再发512字节数据,然后是收数据,不加个200豪秒的延时在每步之间就出错。是否底层程序的问题?在查询到SIE将数据发完我才退出的,不应该还要等,U盘要时间执行我发送的命令不需要这么长的时间,用BUSHOUND看本U盘的扇区写,非常快。而且我的数据好象每1毫秒只送一帧,真受不了。能请大侠多给点帮助吗?

好不容易等到大侠,不能轻易放弃!
p_y_h
驱动牛犊
驱动牛犊
  • 注册日期2004-04-27
  • 最后登录2006-04-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-10 09:49
CBW+DATA+CSW
每个阶段都要判断是否结束(例如查询到SIE将数据发完),811HS是1.1HOST(每1毫秒只送一帧),DATA每次最多只能传输64B,512B要分8次传。
okok_A
驱动牛犊
驱动牛犊
  • 注册日期2004-04-26
  • 最后登录2009-10-25
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望44点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-10 12:41
楼上的说法是错误的。只要不启用SOF同步,每个桢可以发多个数据包。
51单片机本来就很慢了,延时是完全没有必要的。我做的时候从来没有延时,也没有出过错。
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-10 13:09
热心人多了就是好!谢!
我现在的情况就是要在WRITE10的发CBW、发DATA、收CSW三者之间给延时,不给就NAK!而且在发DATA的阶段很明显是每64字节(PAYLOAD)占用1MS,太慢了,OKOK_A大侠指的启用SOF同步是怎么一回事啊?
okok_A
驱动牛犊
驱动牛犊
  • 注册日期2004-04-26
  • 最后登录2009-10-25
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望44点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-10 18:23
EP0Control,EP1Control的第5位SOF的作用:
值为1:下一个数据包在新的SOF后发送。
值为0:一旦SIE空闲,下一个包将立刻发送,不用等待SOF
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-11 13:53
热心人多了就是好!谢!
我现在的情况就是要在WRITE10的发CBW、发DATA、收CSW三者之间给延时,不给就NAK!而且在发DATA的阶段很明显是每64字节(PAYLOAD)占用1MS,太慢了,


架构设计就不合理,应该搞一个\"乒乓\"缓冲,当一块缓冲在与flash交换数据时,另一块可以被usb使用来收发数据.
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-12 08:44
正是!CYPRESS的代码中并未对EP1CONTROL作处置,我一直以为我的程序已经采用PINGPONG机制,难道没起作用?!我现在还没到FLASH读数据呢,就用XDATA发数据,才20K BYTE/S。我仔细检查一下!请大侠继续指教,顺便问一下,如何给分?
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-13 09:23
正是!CYPRESS的代码中并未对EP1CONTROL作处置,我一直以为我的程序已经采用PINGPONG机制,难道没起作用?!我现在还没到FLASH读数据呢,就用XDATA发数据,才20K BYTE/S。我仔细检查一下!请大侠继续指教,顺便问一下,如何给分?


你说的EP1CONTROL是个什么东西?用来配置BULK 传输的吗?PingPong跟这个应该没有关系,虽然我没有用过cypress的东西,但按一般的想法,应该是有一个寄存器用来控制pingpong缓存在USB和单片机之间的切换。另外,usb的bulk传输是用中断来做的。。
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-13 09:49
已经根据各大侠提示情况给分了!谢谢各位,还请继续帮助!
to shentu:811HS的收发控制寄存器共有2套,EP0CONTROL是USB-A的控制寄存器,EP1CONTROL是USB-B的,我认为这才是用作PINGPONG控制的硬件支持,而原先CYPRESS提供的程序并未支持本人的看法,而是采用双缓冲、查询方式完成传输的。我只能认为这是不完全的PINGPONG机制,不能达到高速传输的目的。
to okok_a:SOF位的作用真是很神奇,速度有提高。我有疑问请帮助确认:CYPRESS提供的原代码很粗放,我一直把它当权威可是就限制了我的思维,我是否应该抛弃它?另外bufwrite()子程序的效率好象太低了,您是否采用嵌汇编的方法提高效率的?
okok_A
驱动牛犊
驱动牛犊
  • 注册日期2004-04-26
  • 最后登录2009-10-25
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望44点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-13 11:33
我开始也用了cypress的代码,但是感觉太乱个了。后来我自己全部重写了。用汇编语言似乎没有必要,C语言生成的代码还是可以的
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-13 11:45
我用CYPRESS提供的代码执行BUFWRITE(),光64字节的加载就用了1200微秒,速度当然上不来,用ARM可能速度快,单总不能可以优化时,浪费带宽,我用的P89C51RD2,22M晶振,12周期的。你用USB-A/B切换吗?
游客

返回顶部