|
发表于 2011-1-15 15:48:17
|
显示全部楼层
我用的IC都是内置USB模块的,也就是纯硬件USB的,而且我都是做全速或者高速通讯,所以没出现过不兼容的问题。
我感觉你们的兼容现象跟总线枚举过程有直接的关系,Report Descriptor即使有问题应该也不至于连设备都不识别,所以对于那个我也只是猜测。
看了前面的几套描述符,从软件结构上讲都是没有问题的。在说硬件之前,这里先提一下USB协议1.x vs 2.x版、Full-speed vs. Low-speed之间的差别。
首先注意到这个定义
.equ USBversion =0x0100 ;for what version USB is that (1.00)
这个值用0x0100和0x0200分别代表USB1.00和USB2.00版本协议。我们知道USB2.0协议对USB1.x最明显的扩充是增加了High-speed模式,其中包含一个Device Qualifier描述符。如果设备不支持High-speed模式,其实Full-speed模式和Low-speed模式的设备用USB1.x和USB2.0协议性能应该是一样的。不过声明了USBversion =0x0200的设备必须能够正确处理类型为Device Qualifier的Get Descriptor标准请求,尽管它并不支持high-speed模式。
除了上述一点之外,对于USB1.x和USB2.0,Full-speed和Low-speed的差别是一样的,主要差别是传输速率,其次是max packet size的值。
.db 0x00,0x08 ;6 byte - protocol code
;7 byte - FIFO size in bytes
这里Device Descriptor里偏移量为7的字节是Max packet size,表示Endpoint 0每次可传输的最大字节数。一个Low-speed设备的值只能是0x08,Full-speed设备的值可以是8/16/32/64。对于一个Max packet size = 0x08的Full-speed来说,它与一个Low-speed设备的唯一差别就是总线传输速率了。而这一点差别要想让主机知道,恰好又是不能通过软件实现的。USB外设通过硬件拉高一条数据线来声明自己的速度等级。如果一个Low-speed设备错将自己声明为Full-speed设备,主机会把它当作一个Max packet size=0x08的设备对待,并用超过外设接口处理能力的速率发送请求。外设无法同步,自然不会响应。外设一出现超时,根集线器就会报错。
有兴趣的话可以试试,不用任何电路板,只要一条USB电缆。用一支1.5K电阻把VBUS线和任意一条数据线连接起来,然后插到电脑上。电脑照样会显示发现新硬件,过一会儿就显示无法识别的设备。这个就是总线超时的现象。
除了速度不匹配之外,我暂时没有别的猜测。 |
|