阅读:9686回复:29
如何发送多个包
请教各位高手,在DRIVERWORK所生成的BULK传输的例子里,如果数据长度大于最大传输包尺寸时只发送一个包,那么如果我想把所有数据都发送出去应该怎么做呢?比如有19个包想放在一帧里发送?
|
|
最新喜欢:![]() |
沙发#
发布于:2007-08-30 16:50
要求时间特性,干嘛用bulk传输啊,用等时传输方式才能保证时间上的特性
|
|
板凳#
发布于:2004-06-15 11:53
如果是用driverstudio开发包中的driverworks开发的驱动,可以用如下方式来设置最大传输包的长度,在OnStartDevice功能里添加代码,但要在ActiveConfigration之前,例如一个KUsbPipe变量m_bulkEp1Out,可以增加如下代码来实现,
m_bulkEp1Out.SetMaximumTransferSize(64 * 1024); 尺寸可以自己指定。如果不设置的话系统默认的是4096B. 我试过1M的尺寸,没有问题,但不需要太大,达到一定的大小之后速度也不会提高上去,所以自己要权衡一下。 如果是用DDK开发的驱动,可以在USBD_CreateConfigurationRequestEx功能实现后来设置。 |
|
|
地板#
发布于:2001-09-25 21:34
[QUOTE]原本由 singwoo 发表
[B]to sunkai: 谈不上指教,为了共同爱好而互相学习。 对于你的这个问题,我的看法如下: 1。如果你的A/D的连续的平均数据传输量有1MB/S或1MB/S左右,那么你的这个系统就很难实现。因为BULK传输的最大传输量是1.216MB(每祯19个包),而且BULK传输的数率是无法保证的。所以,你不能期望每祯都传15个包。 2。如果你的A/D的连续的平均数据传输量远小于1MB/S,但瞬时传输率远大于1MB/S的话。则可通过大的缓冲区来实现。其实,就是把A/D传输与USB传输分开来对待。就让A/D已恒定的高速率传进来,FIFO溢出时把数据写入缓冲区,而USB传输只对缓冲区进行操作。这样的话,只要A/D的平均传输量远小于1MB/S,USB传输就没有问题。就象一个8KHZ的麦克风照样可以在1KHZ的USB总线上传输一样。 再次说明,我对你的系统并不熟悉,以上不一定正确。 [/B][/QUOTE] 讲解的非常有用,多谢了。我的系统当然不需要那么高的传输速率,能达到500KB/s我就要烧高香了,受很多因素的限制目前只有可怜的100k。BULK传输的数率是无法保证的是个颇令人头痛的问题。 |
|
地下室#
发布于:2001-09-25 15:21
to sunkai:
谈不上指教,为了共同爱好而互相学习。 对于你的这个问题,我的看法如下: 1。如果你的A/D的连续的平均数据传输量有1MB/S或1MB/S左右,那么你的这个系统就很难实现。因为BULK传输的最大传输量是1.216MB(每祯19个包),而且BULK传输的数率是无法保证的。所以,你不能期望每祯都传15个包。 2。如果你的A/D的连续的平均数据传输量远小于1MB/S,但瞬时传输率远大于1MB/S的话。则可通过大的缓冲区来实现。其实,就是把A/D传输与USB传输分开来对待。就让A/D已恒定的高速率传进来,FIFO溢出时把数据写入缓冲区,而USB传输只对缓冲区进行操作。这样的话,只要A/D的平均传输量远小于1MB/S,USB传输就没有问题。就象一个8KHZ的麦克风照样可以在1KHZ的USB总线上传输一样。 再次说明,我对你的系统并不熟悉,以上不一定正确。 |
|
|
5楼#
发布于:2001-09-25 09:45
这里我有一个问题,一帧在协议上不是说最多只能19个packet吗?你用的是不是USB2.0的协议?
能具体说一下吗? 我只做过一个USB设备,用的AVR8515,8M晶振 一帧只能传4个packet |
|
6楼#
发布于:2001-09-24 23:13
大佬,我对怎么写驱动几乎一窍不通,更别说怎么通知应用层了。先把这个很好的方案搁在一边吧,等我把手头的做完了有空了再慢慢地啃,如果斑竹有闲暇就搬点代码出来,多谢多谢。
|
|
7楼#
发布于:2001-09-24 09:53
[QUOTE]原本由 sunkai 发表
[B]> wdm层启动了一个线程来查询获取数据 很不错的主意!我也想过这么做,但在wdm层获取的数据怎样传到应用层呢?普通的做法是把应用层的内存传到wdm层来获得数据,请指点。 [/B][/QUOTE] 这个线程可以通知应用层来拿数据啊! |
|
|
8楼#
发布于:2001-09-22 13:56
> wdm层启动了一个线程来查询获取数据
很不错的主意!我也想过这么做,但在wdm层获取的数据怎样传到应用层呢?普通的做法是把应用层的内存传到wdm层来获得数据,请指点。 |
|
9楼#
发布于:2001-09-22 13:49
[QUOTE]原本由 singwoo 发表
[B]to sunkai: 很佩服你对USB钻研的那么细。 “主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。 我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?” 我的愚见是: BULK IN 事务的过程如下: 1。主机发送IN 令牌,EOP后,等待设备DATA包。 2。设备接到令牌后按令牌中的同步序列发送DATA,EOP。 3。主机收到DATA后,发送ACK。 同步序列由主机产生,设备必须按此同步序列来发送数据。 所以,不存在“主机根本来不及来读取”的问题。 问题在于 你的设备没有与主机同步。 [/B][/QUOTE] 谢谢singwoo 。 我想说清楚点,请你继续指教。我的设备有个FIFO存储器,写存储器由A/D微转换器独立控制(假定为恒定的高速率),指示USB芯片读存储器的信号也是由转换器发出(A/D字节数到达64B时触发一次USB芯片外部中断,端点可写时firmware读入64B数据写入端点),IN令牌到达时,数据被发送。如果主机发送IN令牌的速率不够高(端点清空的速率不够高,可写的速率也随之降低),FIFO就因为读速率过低而满溢,变为不可写,A/D数据因此丢失。 据此,我想首先要保证主机客户应用程序要维持一个速率比较高的读操作,我能做的是用一个线程专门读数据,每次的数据请求量接近传输极限,假设为15packets * 64B,我想象中的理想情况是这么多数据必须在1个frame中完成,绝对不能被分拆完成。因为我对底层协议一无所知,不敢断定每个frame的确能完成这么大的传输,同时我也不知道是否在客户驱动层(或更底层)也可以人为地控制传输速率。我的系统是按照这样的思路完成的,低速率没问题,高了就不行了,摸不准是设备硬件方面还是软件方面的原因,我甚至都怀疑有没有WINDOWS方面和主机硬件的原因了,请多多指教。 |
|
10楼#
发布于:2001-09-19 13:53
引用:
-------------------------------------------------------------------------------- 原本由 singwoo 发表 主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。 我的一个测试如下: 我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。 相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快! -------------------------------------------------------------------------------- 对不起,各位!以上的测试是有问题的。我的包分析器出了些问题, 当时我也没有仔细考虑。正确的测试如下: 一个FRAME 中有34个bulk in 请求包,NAK 为21个。其余13个为数据包。每个数据包PAYLOAD 大小64byte。数据量为13*64=832byte/ms。 相当于832KB/s。主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是2.5:1(一个FRAME中)。所以一个FRAME中10个BULK 还是没有问题的。 再次抱歉,上次并非随意乱写的。 |
|
|
11楼#
发布于:2001-09-19 09:26
to sunkai:
很佩服你对USB钻研的那么细。 “主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。 我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解?” 我的愚见是: BULK IN 事务的过程如下: 1。主机发送IN 令牌,EOP后,等待设备DATA包。 2。设备接到令牌后按令牌中的同步序列发送DATA,EOP。 3。主机收到DATA后,发送ACK。 同步序列由主机产生,设备必须按此同步序列来发送数据。 所以,不存在“主机根本来不及来读取”的问题。 问题在于 你的设备没有与主机同步。 |
|
|
12楼#
发布于:2001-09-18 20:34
[QUOTE]原本由 singwoo 发表
[B] 顺便说一句,用一个包分析器,你会看的很清楚的。 但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安 排一个frame中传输10个bulk 包。但是在设备较少的情况下, 一个frame中传输10个bulk 包是没有问题的。 [/B][/QUOTE] 没问题?!太好了,你敢肯定? 谢谢了。我可以安心睡觉了。:) |
|
13楼#
发布于:2001-09-18 20:29
非常谢谢各位!
我的设备已经是用最快的方式来响应主机请求了,firmware中没有任何多余的语句,由硬件决定填充端点的速率,有主机请求就可以应答,在填充端点的速率比较慢的时候会可能出现主机等待设备,在高速率的时候则不会,而是主机根本来不及来读取,导致设备的外存取器数据溢出(用示波器可以看到溢出信号)。 我估测了一下,这样可以达到500-600KB/s,但还是不够10个包/ms,何解? |
|
14楼#
发布于:2001-09-18 20:26
我用cypress的an2131qc芯片,一次发送过64kbytes的包,windows的底层驱动会将其分割。
|
|
|
15楼#
发布于:2001-09-18 13:29
[QUOTE]原本由 singwoo 发表
[B] 主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。 我的一个测试如下: 我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。 相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快! 顺便说一句,用一个包分析器,你会看的很清楚的。 但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安 排一个frame中传输10个bulk 包。但是在设备较少的情况下, 一个frame中传输10个bulk 包是没有问题的。 我没有具体做过USB DEVICE,只做USB 主机协议栈的。 [/B][/QUOTE] 高手! |
|
|
16楼#
发布于:2001-09-18 12:30
主要原因在于你的DEVICE上。是你的设备来不及处理主机的要求。 我的一个测试如下: 我的设备比较快,一个FRAME 中有94个bulk 包,数据量为6Kb/ms。 相当于6Mb/s。即便如此快,主机的发送请求与设备的响应(指带数据的响应,不是NAK)的比例是3:1(一个FRAME中)。可见主机的响应有多快! 顺便说一句,用一个包分析器,你会看的很清楚的。 但话又说回来,带宽的管理是由USBD来实现的。驱动程序无法安 排一个frame中传输10个bulk 包。但是在设备较少的情况下, 一个frame中传输10个bulk 包是没有问题的。 我没有具体做过USB DEVICE,只做USB 主机协议栈的。 |
|
|
17楼#
发布于:2001-09-18 10:06
[QUOTE]原本由 sunkai 发表
[B][QUOTE]原本由 无心快语 发表 [B]在usbn9604的wdm层你可以在对设备的初始化中这样来设置 m_endpointxin.initialize(m_lower,0x8x,maxsize); 其中maxsize是所要发送的数据的字节数(必须大于64) 在接收的时候把接收的urb中的length值设置为maxsize即可 但usb端相应的设置必须设置正确 [/B][/QUOTE] 设置maxsize我已经完成了,"但usb端相应的设置必须设置正确",指的是什么?请明示,谢谢. [/B][/QUOTE] 应该是firmware的endpoint descriptor吧? |
|
|
18楼#
发布于:2001-09-17 23:05
[QUOTE]原本由 DK-boy 发表
BULK传对时间要求不严格的数据传输是有效的。 在空闭的总线上应该没有问题,即无法完成BULK传输对时间的要求! [/B][/QUOTE] 太糟糕了,真搞不懂USB为什么要这样设计.我该这么办? |
|
19楼#
发布于:2001-09-17 23:02
[QUOTE]原本由 无心快语 发表
[B]在usbn9604的wdm层你可以在对设备的初始化中这样来设置 m_endpointxin.initialize(m_lower,0x8x,maxsize); 其中maxsize是所要发送的数据的字节数(必须大于64) 在接收的时候把接收的urb中的length值设置为maxsize即可 但usb端相应的设置必须设置正确 [/B][/QUOTE] 设置maxsize我已经完成了,"但usb端相应的设置必须设置正确",指的是什么?请明示,谢谢. |
|
上一页
下一页