阅读:2556回复:23
请教rayyang2000大虾,关于URB的最大请求字节数
rayyang2000大虾,以前看了你的关于D12+AT89C52的USB通讯速度的贴子,你说把驱动的最大传输字节数可以改到64K,我用driverworks做了一个驱动,数据请求是没问题了,但好像用ReadFile请求时,请求的size不能很大啊,一大就pending了,不知道为什么。我的底层固件做了一个一次请求发送32K的数据到端点2,发送程序如下:
for(i=0;i<512;i++) D12_WriteEndpoint(5,64,EpBuf); |
|
最新喜欢:abei11 |
沙发#
发布于:2004-07-04 13:31
dw里面有个函数可以设置max size,好像是kusbdevice的函数吧。你找找看。
|
|
|
板凳#
发布于:2004-07-04 14:06
在Driver中,我已经改过了,程序如下:
m_Endpoint1IN.Initialize(m_Lower, 0x81, 16); //EP1 interrupt m_Endpoint1OUT.Initialize(m_Lower, 0x1, 16); m_Endpoint2IN.Initialize(m_Lower, 0x82, 65536); //EP2 bulk m_Endpoint2OUT.Initialize(m_Lower, 0x2, 65536); ,但驱动完成后,用ReadFile一下请求32K的数据,速度还是只有16K/S左右,是不是单片机发送数据太慢造成的瓶颈呢?我单片机的晶振是12MHz的。 |
|
地板#
发布于:2004-07-04 14:30
那你在submiturb的时候,也是一次读32K吗?
|
|
|
地下室#
发布于:2004-07-04 14:37
我在构造URB时是这样的:
PURB pUrb = m_Endpoint2IN.BuildBulkTransfer( Mem, // Where is data coming from? dwTotalSize, // How much data to read? TRUE, // direction (TRUE = IN) NULL, // Link to next URB TRUE // Allow a short transfer ); 其中dwTotalSize我用SoftIces跟踪过,是32K,对的。 处理过以后就用下面语句提交URB: status = m_Endpoint2IN.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0); |
|
5楼#
发布于:2004-07-04 15:08
gz
|
|
|
6楼#
发布于:2004-07-04 15:17
那原因多半出在device端。或者,你的设备别是枚举成慢速了?
|
|
|
7楼#
发布于:2004-07-04 18:32
枚举成慢速?一般D12在什么情况下枚举成慢速呢?
|
|
8楼#
发布于:2004-07-04 19:06
用usbview看看
|
|
|
9楼#
发布于:2004-07-04 20:04
能上传一个吗?
|
|
10楼#
发布于:2004-07-04 20:23
是全速的。
ConnectionStatus: DeviceConnected Current Config Value: 0x01 Device Bus Speed: Full Device Address: 0x03 Open Pipes: 4 Endpoint Descriptor: bEndpointAddress: 0x81 Transfer Type: Interrupt wMaxPacketSize: 0x0010 (16) bInterval: 0x01 Endpoint Descriptor: bEndpointAddress: 0x01 Transfer Type: Interrupt wMaxPacketSize: 0x0010 (16) bInterval: 0x01 Endpoint Descriptor: bEndpointAddress: 0x82 Transfer Type: Bulk wMaxPacketSize: 0x0040 (64) bInterval: 0x0A Endpoint Descriptor: bEndpointAddress: 0x02 Transfer Type: Bulk wMaxPacketSize: 0x0040 (64) bInterval: 0x0A 但端点的最大包尺寸还是跟D12的一样,这是由我的单片机里的控制代码决定的,难道不但要改驱动,还必须把单片机的BULK端点的wMaxPacketSize也改成65536吗? [编辑 - 7/4/04 by bobbysun2000] |
|
11楼#
发布于:2004-07-05 01:52
D12的配置就是这样,没办法再增大。
似乎应该找找firmware程序上的问题。 应该是在每个bulk in 的中断中,发送下面的64bytes。但看你的顶帖,却是一次性向fifo里面写了32k。 |
|
|
12楼#
发布于:2004-07-05 11:15
我的Firmware控制流程是这样的,先由端点1发命令,收到读命令时,端点2向主机发送数据。我之所以一次发32K的数据主要是想快,想把循环都放在单片机里面做,这样应该会快一些。如果在应用程序中放循环,就是发一次命令,读64 Bytes在循环,这样的速度我试过,好像更慢啊。
|
|
13楼#
发布于:2004-07-05 20:34
rayyang2000大虾,你以前做的D12传输速度那么高,固件控制代码是汇编写的还是C写的,我的控制代码是在周立功的那个smart board的固件控制代码的基础上改的,是不是因为这个代码的效率不高,导致速度上不去?
|
|
14楼#
发布于:2004-07-06 12:33
我以前用C51写的,你用的这个代码,我没有看过。
你的Bulk IN的firmware程序有问题,实际传输数据也不能这样用,因为后面的数据会把前面的数据覆盖。所以,即使你的这个程序试验成功,也不能用。 实际上firmware中,应该在Bulk IN中断中,发送下面的64bytes。这个中断的意思是 End of Bulk IN Transfer,也就是说,当前FIFO中的64bytes被传送到host以后,才会产生这个中断。 |
|
|
15楼#
发布于:2004-07-06 13:53
谢谢斑竹,另外问一下,你说的BULK IN中断是不是就是ISR.C中的D12端点2的IN中断,我的端点2中断服务程序只有清中断标志位处理,其他没有,我按你说的试试!
|
|
16楼#
发布于:2004-07-06 19:28
我在程序里发送64个字节,发送点数减64,在端点2的IN中断中代码如下:
D12_ReadLastTransactionStatus(5); //清中断标志位 if(datanum>0) { if(datanum>64) { D12_WriteEndpoint(5,64,EpBuf); datanum=datanum-64; } else { D12_WriteEndpoint(5,datanum,EpBuf); datanum=0; } } 其中datanum是发送的字节数。但这样做后,速度还是只有32K啊?怎么回事呢?感觉很奇怪? |
|
17楼#
发布于:2004-07-06 20:35
没错,是这样
在D12_WriteEndpoint,把for循环向fifo中写数据注释掉,直接把fifo里面现有的数据送出去,看看速度是多少。 |
|
|
18楼#
发布于:2004-07-06 21:40
不瞒你说,还是只有30几K,郁闷死我了,我在ReadFile中一下子请求了64K的数据啊,还是花了2秒左右,痛苦啊!
|
|
19楼#
发布于:2004-07-07 09:48
斑竹啊,你看还有什么原因会导致速度比较慢呢?
|
|
上一页
下一页