USB集线器如何工作?


9

对于上述问题,我知道Google的答案和Wikipedia的答案。但是我手头还有一个更具体的问题。USB集线器有许多入站和端口,而只有一个出站端口,因此我可以同时使用n个设备。但是,我不明白一个USB端口如何用n个USB端口进行数据传输?
如何将不同的数据同时发送到所有USB端口?

*

原理图

模拟此电路 –使用CircuitLab创建的原理图

*。


1
网络路由器可以将一个LAN端口(Internet)连接到多个设备的方式几乎相同。每个端点(USB设备)都分配有一个地址,并且集线器通过跟踪哪个端口上的地址来简单地将请求从主机路由到正确的设备。从USB的角度来看,这要简单得多,因为只有一个主机(主机端口)可以启动所有事务。
汤姆·卡彭特

@TomCarpenter然后USB端口将如何一起发送不同的数据?
Aaditya Sahay

1
主机端口要求特定的端点进行通话。端点仅在主机要求时讲话。
汤姆·卡彭特

@TomCarpenter但是它们同时被使用,而不是一个一个地被使用,而是一起使用。
Aaditya Sahay

3
请记住,USB总线在USB 2.0上可以高达480Mbps的速度运行。主机一次只与一个端点对话,但它顺序地与所有端点对话,并且它们之间切换的速度如此之快,您无法分辨。网络也做同样的事情。“嘿,将鼠标放在端口1上,告诉我是否已移动。好了,现在端口2上的键盘有按键报告吗?现在在端口3上,闪存驱动器为我存储此数据。我还有其他人吗?需要说话吗?不,好的,那么,将鼠标放在端口1上,告诉我是否已移动...”
汤姆·卡彭特

Answers:


16

这都与仲裁有关。任何需要连接多个设备的系统都需要某种方式确定何时应与谁通话。您可以根据应用程序期望使用不同的方案。

一个常见的例子-在网络中,我们有很多节点都在互相交谈。这是通过具有地址(例如IP地址)的每个节点来完成的,并且当一个节点要与另一个节点通话时,它会向该地址发送一个数据包。然后,您将拥有诸如路由器之类的设备,这些设备会接收来自多个端口的数据包并将其转发到正确的端口。仲裁是使用内存存储数据包完成的,直到目标端口可用。


现在连接到USB。实际上,这比联网要简单得多,因为并非所有节点都相等。您有两种类型,主机和端点。永远只有一台主机,但是可以有许多端点。在这种情况下,仲裁要容易得多,因为只允许主机端口随意交谈。端点仅在主机要求时才允许交谈,并且主机一次只能与一个端点交谈。

对于主机->端点数据包,USB集线器只是将请求从主机传递到所有端点。因为所有端点都有一个地址,所以只有请求被寻址到的地址才可以执行任何操作(例如响应),所有其他端点都将忽略该数据包。

对于端点->主机数据包,主机首先通过地址将数据包发送到特定端点,说“您现在可以讲话”,然后该端点必须立即发送响应。由于在任何给定时间仅允许一个端点进行通话,因此USB集线器将简单地路由来自响应主机请求的端口的数据包。


关于主机如何计算连接的设备以​​及端点如何获取地址,这是通过枚举实现的。

所有主机和集线器端口在D +和D-线上均具有下拉电阻(15kOhm)。当没有设备连接时,这些端口将使该端口的数据线进入已知状态,该状态是该端口完全不会通过D + / D-线发送任何数据的状态。

连接设备后,通过使用1.5kOhm电阻将D +(全速)或D-(低速)数据线连接到VCC来使其知名。这将触发一个枚举事件。然后,端口将开始配置设备和分配地址的过程。如果要同时插入两台设备,则一次将一个枚举

如果没有集线器,则主机仅与新设备对话并进行设置。如果系统中有集线器,则是报告新设备已连接的集线器。如果集线器报告连接了新设备,则主机将指示集线器重置新设备并启动通信。重置期间,将为端点提供默认地址0(*)。然后,主机可以使用默认地址与端点进行对话,并为它配置一个唯一的非零地址,这将使其知道何时与之对话。

(*)因为一次只枚举一个设备,所以地址0对于新连接的设备始终是唯一的。


然后,您可能会问:“那么,我如何才能让多个设备同时通话呢?”。假设您有一个鼠标,键盘和一个闪存驱动器,它们都连接到同一USB集线器。我们都知道您可以同时使用鼠标和键盘,也可以将文件复制到闪存驱动器中或从闪存驱动器复制文件,但是如果一次只能通话一个设备,那怎么可能呢?

嗯,这全都归结为这样一个事实,您的大脑要花几百毫秒才能注意到您已按下按键并期望屏幕更新对计算机来说是永恒的。USB 2.0接口可以以高达480Mbps的速度运行(USB 3.1可以以高达10Gbps的速度运行!),这意味着即使主机在任何给定时间仅与一个端点进行通信,它也可以在它们之间快速循环,从而可以不能告诉它正在这样做。

USB主机: “嘿,将鼠标放在端口1上,告诉我是否已移动。好了,现在端口2上的键盘有按键报告吗?现在在端口3上,闪存驱动器为我存储这些数据。我需要和其他人聊天吗?好的,那么,将鼠标放在端口1上,告诉我是否已移动...”

人类: “哦,看,计算机注意到我只是在移动鼠标,按下键盘上的键,然后将图片复制到闪存驱动器中!”

主机设备跟踪使用了哪些端点地址,并将按顺序或根据需要(即,当OS请求访问特定设备时)向每个端点发送数据包。因此,尽管并非同时发生,但仲裁是如此之快,以至于计算机无法满足人们的需求。


2
要添加:USB设备(准确地说,只有“中断”端点)可以请求以一定的时间间隔(低至1 ms)进行轮询。只要您没有数百个输入设备,您就永远不会注意到延迟。
迈克尔

主机如何知道连接了哪些端点?另外,这似乎并没有回答有关集线器的原始问题。他们如何在这个过程中互动?枚举如何交互?
Yona Appletree,

1
@YonaAppletree枚举。主机和集线器扫描其所有端口以查找设备连接-它们在D +(全速)或D-(低速)上检测到一个1.5kOhm的上拉电阻。我将添加一些有关如何为端点分配地址的信息。
汤姆·卡彭特

@YonaAppletree在操作过程中的集线器方面,答案确实已经在谈论它。对于主机到端点:“ USB集线器只是将请求从主机传递到所有端点”。对于要托管的终结点:“由于在任何给定时间仅允许一个终结点进行通话,因此USB集线器将简单地路由来自响应端口的数据包”
Tom Carpenter

1

简短的回答:主机顺序发送一次寻址到特定设备(初步的“枚举”)的数据。集线器将所有数据包广播到所有设备。设备仅响应寻址到它的交易。如此,HS设备就可以了。

对于FS和LS设备,此过程要复杂一些。它使用在每个端口的每个集线器中内置的“事务转换器”,将所谓的“拆分事务”转换为LS或FS流量。


USB 3呢?
jbarlow '16

USB3集线器对于Super-Speed链接更为智能,并使用到设备/端点的显式路由。USB2部分保持不变。请参阅最新的USB3.1规范的第3.1节“体系结构摘要”,usb.org
developers / docs /
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.