第2章:USB系统架构——主机、设备、集线器与拓扑结构

USB系统架构,说白了就是一套「谁管谁、谁连谁」的规则。我刚开始接触USB时,总觉得它就是个简单的串口替代品,直到第一次调试枚举失败,才意识到这套架构远比想象中复杂。

咱们先看一张整体结构图,把主机、设备、集线器之间的关系理清楚。

USB系统架构总览 USB主机 (Host) 根集线器 (Root Hub) 集线器 (Hub) 1 集线器 (Hub) 2 设备 A 设备 B 设备 C 设备 D 集线器 3 集线器 4 说明:主机通过根集线器管理所有下游设备,集线器可级联,最多7层

2.1 主机——整个USB世界的「大脑」

USB主机是整个总线的主宰者。所有通信都由主机发起,设备只能被动响应。我个人习惯把主机比作「交通警察」——它决定什么时候让谁说话,说多久,说什么。

主机内部包含三个关键组件:

  • 主机控制器 (Host Controller):硬件层面,负责处理USB协议的低层细节,比如包传输、CRC校验、位填充。常见的实现有EHCI(USB 2.0高速)、xHCI(USB 3.x)。
  • 根集线器 (Root Hub):集成在主机内部,提供物理端口。它负责检测设备插拔、复位端口、管理电源。
  • 主机软件栈:包括USB核心驱动、各类设备类驱动(HID、Mass Storage等),以及最上层的应用程序。
避坑指南: 我曾经在一个项目中,主机控制器中断处理写得过于冗长,导致高速传输时频繁丢包。后来把中断服务程序拆成上下半部,问题才解决。记住——USB主机的中断响应时间,直接影响整个总线的吞吐量。

2.2 设备——从「端点」到「接口」的层次

USB设备内部不是铁板一块。它有一套清晰的层次结构,从底向上依次是:

层次 说明 数量限制
设备 (Device) 最顶层,代表一个物理USB设备,拥有唯一的设备地址 每个总线最多127个
配置 (Configuration) 定义设备的一组功能模式,比如高功耗模式/低功耗模式 每个设备最多1个(简化)
接口 (Interface) 代表一个功能单元,比如键盘的按键输入接口 每个配置最多16个
端点 (Endpoint) 通信的终点,数据真正进出的地方 每个接口最多16个(含方向)

你想想看,一个USB鼠标,它可能只有一个接口(HID类),接口下有两个端点:一个用于主机发送配置数据(控制端点0),一个用于鼠标上报移动和按键(中断端点)。

端点有四种传输类型,我整理了一张表:

传输类型 特点 典型应用 带宽保证
控制传输 双向,可靠,用于枚举和配置 设备描述符获取、设置地址 10%保留
批量传输 可靠,无实时性保证 U盘读写、打印机 无
中断传输 可靠,有轮询间隔保证 键盘、鼠标 按轮询间隔分配
等时传输 不可靠,有实时性保证 音频、视频 按帧预留
注意: 等时传输没有重传机制。我在做USB音频设备时,发现偶尔有爆音,查了半天才发现是等时传输丢包了。解决方案是在应用层做前向纠错,或者干脆改用批量传输+缓冲。

2.3 集线器——USB网络的「中继站」

集线器的作用很简单:扩展端口数量,同时负责信号中继和电源管理。但它的内部逻辑比想象中复杂。

集线器内部包含:

  • 上行端口 (Upstream Port):连接主机或上一级集线器。
  • 下行端口 (Downstream Ports):连接设备或下一级集线器,通常有2~7个。
  • 集线器控制器 (Hub Controller):处理主机发来的集线器类请求,比如复位端口、获取端口状态。
  • 中继器 (Repeater):负责物理层信号再生和转发。

集线器有一个重要特性——事务转换 (Transaction Translator, TT)。USB 2.0集线器必须支持TT,因为主机可能运行在高速模式(480 Mbps),而下游设备可能是全速(12 Mbps)或低速(1.5 Mbps)。TT负责在高速和全速/低速之间做协议转换。

关键点: 集线器级联最多7层(包括根集线器)。超过7层,信号延迟和时序问题会导致通信失败。我在一个工控项目中,客户非要串8个集线器,结果最后一个端口上的设备死活枚举不上。后来强制限制为5层,问题解决。

2.4 物理层拓扑——星形级联

USB的物理拓扑是星形级联结构。主机位于中心,集线器向外辐射,设备挂在集线器上。集线器之间可以级联,但深度有限。

物理层的关键参数:

  • 电缆长度限制:全速/低速最长5米,高速最长5米(但建议3米以内)。USB 3.x放宽到3米(铜缆)。
  • 信号线:USB 2.0使用D+和D-差分对;USB 3.x额外增加SSTX+/-和SSRX+/-两对差分线。
  • 终端电阻:设备端在D+或D-上拉1.5kΩ电阻,用于告诉主机设备速度等级。

为什么会限制5米?因为USB采用半双工通信(USB 2.0),信号在电缆上传输有延迟。5米电缆的往返延迟大约50ns,加上集线器和设备的处理延迟,刚好在协议允许的时序窗口内。超过5米,时序就乱了。

实战经验: 如果确实需要长距离传输,可以用USB延长器(有源电缆)或者转光纤。我做过一个项目,用USB转光纤模块,把信号延长到100米,稳定运行了两年。

2.5 逻辑拓扑——一对多的主从关系

逻辑拓扑和物理拓扑不一样。物理上设备可能挂在不同的集线器上,但逻辑上所有设备都直接与主机通信。主机是唯一的主设备 (Master),所有设备都是从设备 (Slave)。

逻辑拓扑的核心是设备地址。每个设备在枚举时被分配一个唯一的7位地址(1~127)。主机通过地址来寻址设备,集线器在中间只做转发,不修改地址。

通信流程是这样的:

  1. 主机发送令牌包 (Token Packet),包含目标设备地址和端点号。
  2. 集线器根据地址判断数据应该往哪个下行端口转发。
  3. 目标设备识别到自己的地址,响应数据包或握手包。
  4. 集线器把响应数据原路返回给主机。

你想想看,集线器在这里扮演的是「地址路由」的角色,而不是「地址翻译」。它不关心数据内容,只关心数据该往哪个端口送。

注意: 逻辑拓扑中,主机必须轮询所有设备。没有设备能主动发起通信。这意味着,如果一个设备需要实时响应(比如鼠标移动),主机必须频繁轮询它。轮询间隔在端点描述符中定义,最小可以到1ms(全速)或125μs(高速微帧)。

2.6 物理拓扑 vs 逻辑拓扑——一张表说清楚

对比项 物理拓扑 逻辑拓扑
结构 星形级联 一对多总线
节点角色 主机、集线器、设备 主机(主)、设备(从)
通信方式 点对点(集线器转发) 广播+寻址
地址分配 无 7位设备地址
集线器作用 信号中继、端口扩展 地址路由、事务转换
深度限制 7层 无(逻辑上所有设备直连主机)

嗯,这里要注意:物理拓扑决定了你能接多少个设备、多远;逻辑拓扑决定了通信协议怎么设计。两者缺一不可。

2.7 本章小结

USB系统架构其实不复杂,记住几个核心点:

  • 主机是唯一的「大脑」,所有通信由它发起。
  • 设备内部有端点→接口→配置→设备的层次,端点是最基本的通信单元。
  • 集线器负责扩展和信号中继,级联不超过7层。
  • 物理拓扑是星形级联,逻辑拓扑是一对多的主从总线。
  • 四种传输类型各有适用场景,选错了会出大问题。

我个人觉得,理解USB架构最好的方法就是动手抓一次包。用USB分析仪或者Wireshark(配合USBPcap),看看枚举过程、控制传输、批量传输到底是怎么走的。纸上得来终觉浅,绝知此事要躬行。