如何与USB集线器后面的设备通信?

如何与USB集线器后面的设备通信?,usb,Usb,我需要一个USB专家。我有一个小硬件,用一个MAX3421作为USB主机。我连接的打印机内部由两个设备组成:打印机本身和扫描仪。两者都通过内置集线器作为单独的设备公开。这些设备是全速的 我已经阅读了大量的USB2.0手册(),其中我搜索了如何通过集线器与后面的设备进行通信,但文档中缺少这一重要细节 我可以按照第11.24.2章的说明向集线器发送命令,例如获取集线器描述符、重置打印机中设备的设置功能(重置)、正确返回集线器中端口1状态的4字节的获取状态(端口1) 但我如何获取扫描仪的设备描述符呢

我需要一个USB专家。我有一个小硬件,用一个MAX3421作为USB主机。我连接的打印机内部由两个设备组成:打印机本身和扫描仪。两者都通过内置集线器作为单独的设备公开。这些设备是全速的

我已经阅读了大量的USB2.0手册(),其中我搜索了如何通过集线器与后面的设备进行通信,但文档中缺少这一重要细节

我可以按照第11.24.2章的说明向集线器发送命令,例如获取集线器描述符、重置打印机中设备的设置功能(重置)、正确返回集线器中端口1状态的4字节的获取状态(端口1)

但我如何获取扫描仪的设备描述符呢

我已将设备地址1分配给集线器,并尝试与设备地址2上的扫描仪/打印机通信(假设它可能在那里),但当我向设备地址2发送GET_描述符(设备)时,MAX3421出现JERR错误,尽管在执行重置后两个集线器端口均通电并启用

我读过很多关于拆分令牌的文章,但它们似乎只在高速集线器中使用。但是我的打印机的集线器是全速的

文件中没有说明如何做到这一点。
记录在哪里?

没有答案?这似乎是个难题

与此同时,我在这里找到了答案:

向集线器上的端口发送SET_功能(重置)后,连接到该端口的设备将在USB总线上显示设备地址00。 然后,您可以通过通常的方式获取设备描述符,并为此设备执行SET_地址


USB规范绝对是不完整的。

USB端口(根端口或集线器端口)后面的设备枚举过程在USB 2.0规范中没有用外行术语解释,这在某种程度上是正确的,但整个思想嵌入到所有状态机中,用于DS(下游)端口行为

最初,禁用所有USB端口进行通信。唯一启用的功能是“端口连接”状态。如果多个设备插入多个端口(一次或通电),则不会发生USB通信。通电时的所有USB设备都设计为响应默认地址00。但由于还没有启用任何端口,因此没有人响应任何内容

然后主机从第一个端口开始转到每个指示“连接”的单独端口。主机将端口设置为port_RESET模式,连接的设备将响应Chirp-K或nothing,或者它最初具有D-Pull,表示它是LS设备。所有其他设备仍在禁用的端口后面,因此看不到任何活动

在第一个特定端口获得正确的速度状态后,端口被启用,相应的空闲总线通信开始,然后使用默认地址00执行get_描述符命令。然后主机通过SET_address()为该设备分配一个非平凡地址。从这一点上,设备将只响应这个特定的分配地址

然后主机启用下一个端口,在该端口上显示连接了什么。同样,所有其他非枚举设备都设置为响应00地址,但一次只启用一个新端口。由于第一个设备已经有一个与默认00不同的地址,因此不会发生冲突,第一个设备只会忽略寻址到默认管道00的流量

对第二个设备重复该过程,首先通过在00地址通信,然后将下一个可用USB地址分配给第二个设备。对于显示连接状态的每个端口,该过程都会重复


要记住的关键字是,除非主机控制器向根端口获取命令“port_reset”,或向已连接且已枚举的集线器后面的端口发送SET_功能(port_reset)(或类似内容),否则USB端口不会“启用”

您有相关文档的链接吗?将_功能(PORT _RESET)命令设置到集线器的下游端口会在总线上以绑定USB重置状态生成。根据USB规范,连接到此端口的任何USB设备都必须将其SIE(串行接口引擎)重置为默认状态,即将地址解码器重置为默认“00”。它被称为“默认控制管道”,全部在规范中。这与“开机”状态相同。枚举算法的其余部分如下所示。