testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:4946回复:18

请问版主和各位大侠,如何提高USB的传输速度。

楼主#
更多 发布于:2004-02-25 13:08
请问版主和各位大侠,如何提高USB的传输速度。
我目前的速度只有36k/s;

最新喜欢:

abei11abei11
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-07 21:43
非常感谢zmwk!
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-06 00:30
这是我迄今为止看到的最为震惊的一个贴子。

我觉得我必须回一下!(我有多次看了题目都没有进来,今天是第一次进来)
首先,对于基于51+D12开发的系统,在300K以下的速度,基本上瓶颈在固件。

解决之道:(在不使用DMA的情况下)
1。优化底层代码:指MCU与D12Read&Write Endpoint的代码,最好用C的源程序生成SRC,然后修改该SRC,使DPTR的使用更加合理。
2。使用中断方式。中断方式是最快的方式!!!放弃某些错误观念:诸如什么BULK方式下只能每ms发一次数据了云云。那完全是胡说。
3。使用D12的双缓冲。
4。优化数据源。如果你的数据源(诸如A/D,FLASH,IC卡了等等),如果你的数据源慢的话,后面就没指望了。
5。在可能的情况下尽量使用片内RAM,它的时序会块一些。

最后,要知道,51实在是太慢了,它的年龄比论坛中的相当一部分兄弟都大。假定你用12M的晶振,则双周期指令周期为2us。如果单纯与D12进行读写,如果全写一样的内容,只能做到500k/s,如果要把片内的内容传到到D12则速度会降到200k/s。D12再快也没用了。所以51的主频一定要提高才行。

最后,testzyj,主端点不能写超过64B的数据。D12的中断与USB的中断方式完全是两码事。MCU和D12之间可以采用中断或查询方式工作。而USB所谓的中断方式实际上是一种软中断,是靠USB Host以指定间隔(在描述符中给出,只能是1ms的倍数)读或写Device实现。

多看看规范吧。学习要打一些基础的。
A strong man can save himself. A great man can save another.
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-02 21:11
今天心情不好,在固件中向主发送端点写多于64B时失败。
liuqiuyu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-11
  • 最后登录2004-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-01 21:10
我也想知道!顶一下。
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-01 12:48
楼上的大侠:上位机中我是用下面语句进行的
bResult = ReadFile(hFile,
threadParam->pcIoBuffer,
threadParam->uiLength,
&nBytes,
NULL);
您是说将threadParam->uiLength增大吗?
我试过将其改为128甚至1024,对速度影响不大呀。因为nBytes每次都只有64B。
zkking
驱动牛犊
驱动牛犊
  • 注册日期2003-11-14
  • 最后登录2008-10-14
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-01 11:11
上位机的缓冲开大就ok了,我以前也是这样,那个时候只有5k啊,现在也上250k左右了
huoxy
驱动小牛
驱动小牛
  • 注册日期2002-03-01
  • 最后登录2014-02-24
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-01 08:15
DMA:就是Direct Memory Access直接内存操作(是这样子的吧,我也忘了),也就是说不需要CPU、MCU等通用处理器参与的数据传输活动。
以D12为例:首先,设置D12工作与DMA模式;然后,把总线(数据和读写控制)权交给单片机外围电路,例如CPLD,当然你也可以用74xx的芯片搭出来,有外围电路控制与D12进行数据交换,操作完成后,在把控制权返还单片机。

这应该在微机原理里面讲过的呀。
好好学习,天天向上,做一个乖宝宝。
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-02-29 12:38
这个倒没有试过,因为我目前的试验板上没有外部RAM,所以还不能写成1024,不过等我的新板子出来可以试一下。
我还发现另外一个奇怪的事,试验板插上之后,用我自己的应用程序读数速度为38Kb,而用周立功的USBDebug读数速度居然有89Kb,难道应用程序还会影响速度,我在应用程序中就只是读数,并没干其它事呀。
SUNSHANGXIN
驱动老牛
驱动老牛
  • 注册日期2002-11-19
  • 最后登录2009-08-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望19点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-02-29 04:33
多写点,我虽然没用过D12 但D12_WriteEndpoint(5, 64, EpBuf)中的64该是64个字节吧,5是指端点号,EpBuf该是缓存。把你的64写大,一次写1024个看看,是不是不同?嘿嘿多看看,函数吧 小兄弟
[b]苍白的,不是文字,是人的思想 虚伪的,不是网络,是人的灵魂 伤心的,不是爱情,是人的心灵 难忘的,不是容貌,是人的思诀 黎明的曙光早已不见了夕日的辉煌 东方的日出早就失去了往日的灿烂 而我也尽脱了昨日的笑容去迎接明天的枯涩 [/b]
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-02-28 12:48
D12发一次中断一次,这应该是中断方式吧,怎样才能BLUK传输,请大虾们帮忙!
liuqiuyu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-11
  • 最后登录2004-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-02-27 21:14
huoxy:
怎样才能进行DMA传输呀,能说说吗?  ;)
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-02-27 19:01
楼上的大虾,是不是这样理解您的话:
USB固件必须工作在DMA模式,驱动程序中传输方式一般选Bulk,使用CPLD控制为USB芯片提供数据。
方便详细讲一下吗?期待您的回复。

huoxy
驱动小牛
驱动小牛
  • 注册日期2002-03-01
  • 最后登录2014-02-24
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-02-27 17:03
要向提高速度,单纯使用单片机是不够的。
USB芯片必须工作在DMA模式,USB传输方式一般可选Bulk,使用CPLD为USB芯片提供数据,在USB1.1下可以达到900KB~1M,在USB2.0下可以达到24MBytes/s。
好好学习,天天向上,做一个乖宝宝。
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-02-27 13:30
版主、各位大虾:帮一下嘛!
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-02-27 12:47
BLUK是否与DMA有关啊,否则端点2发送完就中断,不是永远都是中断方式了?
liuqiuyu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-11
  • 最后登录2004-03-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-02-27 12:41
感觉你的固件是以中断方式传输的,所以速度慢。
testzyj
驱动牛犊
驱动牛犊
  • 注册日期2003-10-03
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望17点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-02-26 22:35
查看了一下论坛,说bluk每ms可发送一帧,每帧有16个包,即16*64Byte。
我在驱动中设置端点2为bluk方式,应用程序中先发0x01,然后循环读取数据。在固件main_rxdone中判断接收的第一个数为0x01,就启动main_txdone,而main_txdone一直不停地用D12_WriteEndpoint(5, 64, EpBuf)写数据。这样应变程序就可以不断读取数据。
用示波器量中断,发现每发送64B中断一次。不知是否就是所谓的bluk转输?请大侠们指点。
Truly
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录2005-05-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-02-25 21:55
你用什么平台?
关键是MCU或者CPU速度方面的问题,还有就是程序处理数据时的效率
游客

返回顶部