USB 集线器如何工作?

电器工程 USB USB集线器
2022-01-16 01:25:53

我知道谷歌对上述问题的回答和维基百科的回答。但我手头有一个更具体的问题。USB 集线器有许多输入端口和一个输出端口,因此我可以同时使用 n 个设备。但是,我不明白一个 USB 端口如何与 n 个 USB 端口进行数据传输?
它如何同时向所有 USB 端口发送不同的数据?

*

示意图

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

*。

2个回答

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

一个常见的例子——在网络中,我们有很多节点都在互相交谈。这是通过每个节点都有一个地址(例如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 上,告诉我你是否搬家了……”

人类: “哦,看,计算机注意到我刚刚移动了鼠标,按下了键盘上的一个键,并将一张图片复制到了闪存驱动器中,所有这些都是同时进行的!”

主机设备跟踪使用了哪些端点地址,并将按顺序或根据需要(即当操作系统请求访问特定设备时)向每个端点发送数据包。因此,虽然这一切并非同时发生,但仲裁是如此之快,以至于计算机宠物人类无法区分。

更简短的答案:主机一次一个事务,顺序地发送寻址到特定设备(初步“枚举”)的数据。集线器将所有数据包广播到所有设备。设备仅响应发送给它的事务。这就是 HS 设备的全部内容。

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