首页 文章

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

提问于
浏览
0

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

我已经阅读了巨大的USB 2.0手册(http://www.usb.org/developers/docs/usb20_docs),在那里我搜索了如何通过集线器与后面的设备进行通信,但文档缺乏这个重要的细节 .

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

但是,我如何获得扫描仪的设备描述符?

我已将设备地址1分配给集线器并尝试在设备地址2上与扫描仪/打印机通信(假设它可能在那里)但是当我将GET_DESCRIPTOR(设备)发送到设备地址2时,MAX3421以JERR错误应答虽然两个集线器端口在执行复位后都已上电并启用 .

我已经阅读了很多关于SPLIT令牌的内容,但它们似乎只在高速集线器中使用 . 但我的打印机中的集线器是全速 .

文档没有在任何地方说明如何做到这一点 . 这记录在哪里?

2 回答

  • 0

    有些事实,USB端口(根端口或集线器端口)后面的设备枚举过程在外行术语的USB 2.0规范中没有解释,但整个想法都嵌入在DS(下游)端口行为的所有状态机中 .

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

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

    在第一个特定端口获得正确的速度状态后,端口启用,相应的空闲总线流量启动,然后使用DEFAULT ADDRESS 00执行get_descriptor命令 . 然后主机通过SET_ADDRESS()为此设备分配一个非平凡的地址 . 从这一点开始,设备将仅响应此特定的分配地址 .

    然后主机启用下一个端口,在该端口显示附加了某些内容 . 同样,所有其他非枚举设备都设置为响应00地址,但一次只启用一个新端口 . 由于第一个设备已经有一个与默认值00不同的地址,因此不会发生冲突,第一个设备只是忽略了发往默认管道00的流量 .

    对第二设备重复该过程,首先通过在00地址处通信,然后将下一个可用USB地址分配给第二设备 . 并且每个显示附加状态的端口都会重复此过程 .

    要记住的关键字是USB端口未被“启用”,除非主机控制器获得命令“port_reset”到根端口,或者将SET_FEATURE(PORT_RESET)(或类似的东西)发送到连接且已经枚举的集线器后面的端口 .

  • 1

    没有答案?似乎是一个棘手的问题 .

    同时我在这里找到答案:http://www.microchip.com/forums/m523103.aspx#523499

    将SET_FEATURE(重置)发送到集线器上的端口后,连接到该端口的设备将在USB总线上显示 device address 00 . 然后,您可以通常的方式获取设备描述符,并对该设备执行SET_ADDRESS .

    USB规范绝对不完整 .

相关问题