阅读:4945回复:18
请问版主和各位大侠,如何提高USB的传输速度。
请问版主和各位大侠,如何提高USB的传输速度。
我目前的速度只有36k/s; |
|
最新喜欢:![]() |
沙发#
发布于:2004-02-25 21:55
你用什么平台?
关键是MCU或者CPU速度方面的问题,还有就是程序处理数据时的效率 |
|
板凳#
发布于: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转输?请大侠们指点。 |
|
地板#
发布于:2004-02-27 12:41
感觉你的固件是以中断方式传输的,所以速度慢。
|
|
地下室#
发布于:2004-02-27 12:47
BLUK是否与DMA有关啊,否则端点2发送完就中断,不是永远都是中断方式了?
|
|
5楼#
发布于:2004-02-27 13:30
版主、各位大虾:帮一下嘛!
|
|
6楼#
发布于:2004-02-27 17:03
要向提高速度,单纯使用单片机是不够的。
USB芯片必须工作在DMA模式,USB传输方式一般可选Bulk,使用CPLD为USB芯片提供数据,在USB1.1下可以达到900KB~1M,在USB2.0下可以达到24MBytes/s。 |
|
|
7楼#
发布于:2004-02-27 19:01
楼上的大虾,是不是这样理解您的话:
USB固件必须工作在DMA模式,驱动程序中传输方式一般选Bulk,使用CPLD控制为USB芯片提供数据。 方便详细讲一下吗?期待您的回复。 |
|
8楼#
发布于:2004-02-27 21:14
huoxy:
怎样才能进行DMA传输呀,能说说吗? ;) |
|
9楼#
发布于:2004-02-28 12:48
D12发一次中断一次,这应该是中断方式吧,怎样才能BLUK传输,请大虾们帮忙!
|
|
10楼#
发布于:2004-02-29 04:33
多写点,我虽然没用过D12 但D12_WriteEndpoint(5, 64, EpBuf)中的64该是64个字节吧,5是指端点号,EpBuf该是缓存。把你的64写大,一次写1024个看看,是不是不同?嘿嘿多看看,函数吧 小兄弟
|
|
|
11楼#
发布于:2004-02-29 12:38
这个倒没有试过,因为我目前的试验板上没有外部RAM,所以还不能写成1024,不过等我的新板子出来可以试一下。
我还发现另外一个奇怪的事,试验板插上之后,用我自己的应用程序读数速度为38Kb,而用周立功的USBDebug读数速度居然有89Kb,难道应用程序还会影响速度,我在应用程序中就只是读数,并没干其它事呀。 |
|
12楼#
发布于:2004-03-01 08:15
DMA:就是Direct Memory Access直接内存操作(是这样子的吧,我也忘了),也就是说不需要CPU、MCU等通用处理器参与的数据传输活动。
以D12为例:首先,设置D12工作与DMA模式;然后,把总线(数据和读写控制)权交给单片机外围电路,例如CPLD,当然你也可以用74xx的芯片搭出来,有外围电路控制与D12进行数据交换,操作完成后,在把控制权返还单片机。 这应该在微机原理里面讲过的呀。 |
|
|
13楼#
发布于:2004-03-01 11:11
上位机的缓冲开大就ok了,我以前也是这样,那个时候只有5k啊,现在也上250k左右了
|
|
14楼#
发布于:2004-03-01 12:48
楼上的大侠:上位机中我是用下面语句进行的
bResult = ReadFile(hFile, threadParam->pcIoBuffer, threadParam->uiLength, &nBytes, NULL); 您是说将threadParam->uiLength增大吗? 我试过将其改为128甚至1024,对速度影响不大呀。因为nBytes每次都只有64B。 |
|
15楼#
发布于:2004-03-01 21:10
我也想知道!顶一下。
|
|
16楼#
发布于:2004-03-02 21:11
今天心情不好,在固件中向主发送端点写多于64B时失败。
|
|
17楼#
发布于: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实现。 多看看规范吧。学习要打一些基础的。 |
|
|
18楼#
发布于:2004-03-07 21:43
非常感谢zmwk!
|
|