阅读:2465回复:14
批量传输(bulk)问题,奇怪的现象,进来讨论讨论
写usb2.0 EHCI host 驱动遇到的问题:
主机芯片是 vt6202,主机驱动是参考linux 下的驱动写的。 基本上是一样的,但是没有加定时器,和一些和操作系统相关的东西。 目前控制传输没有遇到问题,但批量传输有问题,没有解决。 从机是 isp1581,固件在windows的驱动下没有问题。 现象: bulk out: 只能正常发出一个包。从机接收正常。主机的qTD Token 描述符里的Status 为 01,意思好象是下一次要发送ping。 这是这个位的英文解释。 1b Do Ping. This value directs the host controller to issue a PING PID to the endpoint. 从第二个开始,从机一点反映都没有,此时从机工作正常,控制传输正常。此时主机的qTD Token 为0x80。而且,显示我要发的数据已经发出去了。奇怪就在这里,明明已经发送下去了,但我的从机怎么会没有收到呢。而且,我感觉,qTD Token 为 80 是正常的呀, 80 位表示 Set to 1 by software to enable the execution of transactions by the Host Controller. 控制传输成功发送完的 qTD Token 也都为 80。 bulk in: 和out 一样,只能正常接收一个包。由于in 没有ping 的概念,所以这时候的 qTD Token 为80,应该属于正常现象。 从接收第二个包的开始,从机明明已经收到in 命令,而且也显示出主机成功把数据取走了,但是,主机这里却显示没有收到任何一个数据。不知道为什么会这样。 更奇怪的现象: bulk out: 当我在发送一个包的urb中,添加一个长度为空的包。也就是说,向下先传递一个数据包,然后紧接着再传递一个长度为0的数据包。这个时候,从机会把把2个包都准确的接收到。 而且当我继续发送这样的包的时候,都能够接收到。没有出现从机收不到的情况。 跟上面的现象一样,发送完数据的 qTD Token 都为 01。 一次urb......|第二次urb....|... out16 - out0 | out18 - out0 ... 这样,out16 ,out18,out0数据包都能够正常到达从机 bulk in: 当我发送一个in 包后,正确接收到数据了,再多发一个长度为0的in 包。当我按这样的次序发送的时候,主机能够正确的接收到从机的数据。 (注意,这里的再发一个长度为0的包和out 的不一样,out 的是在同一个urb中,而in 是不同的urb中,也可以说是,out是同一个qh,而不同qtd,in是不同的qh,不同的qtd,可能做过主机驱动的会明白)。 一次urb..|第二次urb..|第三次.|... in10.....| in0.......|in16...|... 这样,in10,in0,in16 都能够正确接收到数据。 唉,好长啊!描述的够清楚么? 怎么会有这样的现象呢? 这个问题捆扰我快一个月了! 郁闷! 有了解的讨论讨论吧。 [编辑 - 10/10/04 by wdy9927] |
|
沙发#
发布于:2004-10-10 17:57
你好,我也用过ISP1581这个芯片.对于你的问题我是这样理解的:
更奇怪的现象: bulk out: 当我在发送一个包的urb中,添加一个长度为空的包。也就是说,向下先传递一个数据包,然后紧接着再传递一个长度为0的数据包。这个时候,从机会把把2个包都准确的接收到。 而且当我继续发送这样的包的时候,都能够接收到。没有出现从机收不到的情况。 跟上面的现象一样,发送完数据的 qTD Token 都为 01。 一次urb......|第二次urb....|... out16 - out0 | out18 - out0 ... 这样,out16 ,out18,out0数据包都能够正常到达从机 bulk in: 当我发送一个in 包后,正确接收到数据了,再多发一个长度为0的in 包。当我按这样的次序发送的时候,主机能够正确的接收到从机的数据。 (注意,这里的再发一个长度为0的包和out 的不一样,out 的是在同一个urb中,而in 是不同的urb中,也可以说是,out是同一个qh,而不同qtd,in是不同的qh,不同的qtd,可能做过主机驱动的会明白)。 一次urb..|第二次urb..|第三次.|... in10.....| in0.......|in16...|... 这样,in10,in0,in16 都能够正确接收到数据。 在1581芯片中,有一个寄存器(08H),他的低8位的第五位(NOEMPT)表示 包后是否跟0长度包表征包结束.可能是你的这位的问题. |
|
|
板凳#
发布于:2004-10-10 18:36
好象有这个可能。
那也就是说我发送,和接收根本就是有错误的。 不然,按理说,如果发送和接收正确,那芯片会自动发一个0长度的包给设备。 |
|
地板#
发布于:2004-10-11 08:44
我不明白你是做HOST还是CLIENT?当这位置上时,发送是自动加上一个
0包,你接收时要以这个0包为结束标识,即在收到0包后表示收完了.接 收时要等到0包才表示收完. 你可能在HOST发送时没加0包,接收时没等0包. |
|
|
地下室#
发布于:2004-10-11 09:10
我在做host ,但从机的固件不敢说 100% 正确。 但从机和pc连接是没问题。
我想,问题还是出在我这边。 好象应该是你说的,没发0包。 但如果正常的话,这个0包应该是硬件发送的。 当要发送,或者要接收的数据都完成后,硬件会自动发送一个0包给设备。 这是原文,希望我没理解错。 Note that the Total Bytes To Transfer field may be zero when all the other criteria for executing a transaction are met. When this occurs, the host controller will execute a zero-length transaction to the endpoint. 如果真是这样的话,那我的问题又是没有0包的话,就说明我的发送和接收的程序还是有问题! 有可能是这样。 还有,最后那个0包,从机应该对它没有反映才对吧。因为我在和pc连接的时候,pc发送一个包从机只产生一次out中断,但当用我的主机,按我的方法的时候,从机会产生2次out中断,0包也产生一次中断。这好象没什么道理呀。 |
|
5楼#
发布于:2004-10-12 09:02
你的从机可以调试吗?如果可以的话,你把NOEMPTY位置1(没有0包),看
看是什么情况.如果一切正常的话,表示就是那一位的问题;如果还不 正常,那就有可能是其他问题了. |
|
|
6楼#
发布于:2004-10-12 11:10
刚才试了一下 。 还是不行。
情况跟0 一样。 |
|
7楼#
发布于:2004-10-12 16:08
这可能是你的发送机制的问题,你在D+,D-线上引出观测点,用仪器(逻
辑分析仪,USB侦测设备)看一下,在你的第二次BULK时,总线上是否有 数据.如果有的话,看看从机是否产生中断,注意开中断. |
|
|
8楼#
发布于:2004-10-12 17:19
示波器能不能显示呀。
out 下位机没有中断。 in 下位机有中断。 没有usb分析仪来测量数据。 唉。 看看示波器行不行吧。 |
|
9楼#
发布于:2004-10-14 08:37
D+,D-线上的频率太高,示波器不能显示的,用逻辑分析仪看看.
OUT没中断?说明数据没收到(收到的话相应端点应该产生RX中断). IN有中断,说明数据发送出去了(相应端点产生TX中断). 你最好一次传输的数据量不要太大,要在一个最大分组内传完最好,这 样好看. |
|
|
10楼#
发布于:2004-10-14 09:04
out: 主机显示数据成功下去,但从机没有中断
in: 从机有in中断,但主机根本没有收到任何数据 哈,真是弄不清楚到底怎么回事。 老板都快要杀了我了。 哈哈 |
|
11楼#
发布于:2007-07-10 18:01
我也在调usb bulk transfer 遇到和你一样的问题,不知道你怎么解决的?
|
|
12楼#
发布于:2007-08-02 15:56
哎呀,忘记怎么调的了。
把怎么调的写上来好了。 等我回家给你找找。 |
|
13楼#
发布于:2007-08-02 16:11
我不会,帮你们顶一下,
|
|
14楼#
发布于:2007-09-05 18:52
搂主怎么解决的?我也遇到相同的问题
|
|