1. USB协议基础:总线拓扑结构、主机与设备角色、物理层电气特性(D+/D-信号)

1.1 USB总线拓扑结构

USB(Universal Serial Bus)采用星形-菊花链混合拓扑,由主机(Host)、集线器(Hub)和设备(Device)三层节点构成。整个拓扑中有且仅有一个主机,所有通信均由主机发起,设备不能主动向主机发送数据。

关键概念:USB拓扑是非对称的——主机是唯一的通信调度者,设备只能被动响应。这一特性决定了驱动开发中所有枚举流程都必须从主机侧发起。
排故提示:当设备插入后主机无响应,首先检查拓扑路径上的Hub是否供电正常、链路是否中断。USB 2.0 Hub最多支持7层级联(含根Hub),超过此深度会导致信号时序恶化。

下表总结了USB拓扑中各节点的角色与职责:

节点类型 角色 主要职责 典型实例
主机(Host) 总线控制器 调度所有传输、管理地址、检测设备插拔 PC的EHCI/XHCI控制器
根Hub(Root Hub) 集成在主机内 提供物理端口、检测连接/断开事件 主板上的USB端口
外部Hub 扩展节点 转发信号、供电管理、支持级联 USB 2.0 4口Hub
功能设备 终端节点 实现具体功能(存储、HID、音频等) U盘、鼠标、摄像头

下面用SVG图展示USB总线拓扑结构,包含主机、根Hub、外部Hub和功能设备之间的层级关系:

USB总线拓扑结构(星形-菊花链混合) 主机(Host) 根Hub(Root Hub) 外部Hub 1 外部Hub 2 U盘(Mass Storage) 鼠标(HID) 摄像头(Video) 键盘(HID) 拓扑规则 ① 有且仅有一个主机 ② Hub级联最多7层 ③ 所有通信由主机调度,设备不能主动发起

1.2 主机与设备角色

USB协议定义了严格的主从关系。主机(Host)是总线的主控者,设备(Device)是被控者。这种角色划分贯穿整个协议栈,从物理层到软件层均有体现。

1.2.1 主机角色详解

  • 调度器(Scheduler):主机通过帧/微帧调度所有传输事务,设备不能主动占用总线。
  • 地址分配者:设备枚举时,主机为每个设备分配唯一的7位地址(1~127)。
  • 电源管理者:主机检测设备供电需求,控制端口供电开关。
  • 描述符请求者:主机通过控制传输获取设备描述符、配置描述符等。

1.2.2 设备角色详解

  • 端点(Endpoint):设备内部的数据收发单元,每个设备最多支持16个IN端点和16个OUT端点。
  • 接口(Interface):一组端点的集合,代表一个功能(如HID键盘、音频流)。
  • 配置(Configuration):设备的一种工作模式,包含一个或多个接口。
  • 描述符(Descriptor):设备向主机报告自身能力的结构化数据。
常见枚举失败原因:设备在枚举阶段必须响应主机的GetDescriptor(DEVICE)请求。如果设备固件中的描述符数据错误(如bMaxPacketSize0与实际端点大小不符),主机将无法完成地址分配,导致枚举失败。这是驱动调试中最常见的问题之一。

下表对比主机与设备在枚举过程中的关键行为差异:

阶段 主机行为 设备行为 失败后果
连接检测 检测D+/D-电平变化 拉高D+(全速/高速)或D-(低速) 主机无法感知设备插入
复位 驱动D+/D-为SE0状态≥10ms 检测复位信号,准备响应 设备无法进入默认状态
获取设备描述符 发送Setup包(80 06 00 01 00 00 40 00) 返回18字节设备描述符 主机无法识别设备类型
地址分配 发送SetAddress请求 设置新地址,返回ACK 设备无法被寻址
获取配置描述符 发送GetDescriptor(CONFIGURATION) 返回完整配置描述符集 主机无法加载驱动

1.3 物理层电气特性(D+/D-信号)

USB物理层通过差分信号线D+和D-传输数据。电气特性直接决定了信号完整性、传输速率和设备识别。理解D+/D-电平状态是排查硬件级枚举失败的基础。

1.3.1 信号电平与状态定义

USB 2.0使用3.3V信号电平(实际范围为3.0V~3.6V),通过D+和D-的差分电压表示逻辑状态:

  • 差分1(J状态):D+ > 2.8V,D- < 0.3V
  • 差分0(K状态):D+ < 0.3V,D- > 2.8V
  • SE0(Single-Ended Zero):D+ < 0.3V 且 D- < 0.3V(复位信号)
  • SE1(Single-Ended One):D+ > 2.8V 且 D- > 2.8V(非法状态,表示总线冲突)
排故要点:使用示波器测量D+/D-波形时,重点关注:① 设备插入后D+(全速/高速)或D-(低速)是否被拉高;② 复位期间SE0持续时间是否≥10ms;③ 数据包是否出现SE1(表示总线竞争或驱动冲突)。

1.3.2 速度识别机制

USB设备通过上拉电阻的位置和阻值向主机报告自身速度:

速度模式 上拉电阻位置 上拉电阻阻值 信号速率 典型应用
低速(Low Speed) D- 1.5kΩ ±5% 1.5 Mbps 鼠标、键盘
全速(Full Speed) D+ 1.5kΩ ±5% 12 Mbps HID设备、音频
高速(High Speed) D+(初始全速,握手后切换) 1.5kΩ(初始)→ 断开 480 Mbps U盘、摄像头
硬件调试技巧:如果设备插入后主机始终检测不到,用万用表测量D+或D-对地电压。正常时被拉高的信号线电压应为3.0V~3.6V。若电压低于2.0V,说明上拉电阻焊接不良或设备内部电源异常。这是枚举失败最常见的硬件原因之一。

1.3.3 高速握手(Chirp)过程

高速设备在复位后通过Chirp J/K序列与主机协商进入高速模式:

  1. 设备插入后,将D+上拉至3.3V(全速状态)。
  2. 主机检测到D+高电平,发送复位信号(SEO持续≥10ms)。
  3. 设备检测到复位结束,发送Chirp K(D+低、D-高)持续1ms~7ms。
  4. 主机检测到Chirp K后,回复交替的Chirp J/K序列。
  5. 设备收到主机Chirp后,断开D+上拉电阻,进入高速模式。
  6. 如果主机不支持高速,则不回复Chirp,设备保持全速模式。

下面用SVG图展示高速握手过程的时序:

高速设备握手(Chirp)时序图 时间 设备插入 D+被拉高至3.3V 主机复位 SE0 ≥ 10ms 设备Chirp K D-高,D+低 主机Chirp J/K 交替序列 高速 480 Mbps D+ D- 注意:如果主机不回复Chirp J/K,设备将回退至全速模式(12 Mbps)

1.4 电气特性对枚举故障的影响

在实际嵌入式调试中,D+/D-信号质量问题是最容易被忽视的枚举失败原因。以下列出常见电气故障及其表现:

故障现象 可能原因 排查方法 解决方案
设备插入后无任何响应 D+或D-上拉电阻缺失或虚焊 万用表测量D+/D-对地电压 补焊或更换1.5kΩ上拉电阻
枚举过程中断,主机报告超时 信号线过长导致信号衰减 示波器测量眼图,检查上升/下降时间 缩短线缆长度,增加终端匹配
高速设备只能以全速工作 Chirp握手失败,主机未回复 逻辑分析仪捕获Chirp序列 检查主机控制器是否支持高速
间歇性断开重连 供电不足导致D+电平跌落 测量VBUS电压是否稳定在4.75V~5.25V 增加去耦电容,使用独立电源
总线出现SE1状态 多个设备同时驱动总线 示波器捕获SE1波形 检查设备驱动电路,避免总线竞争
重要提醒:在调试USB枚举问题时,不要只依赖软件日志。很多枚举失败的根本原因是物理层信号异常,而软件只能报告“设备无响应”或“描述符请求超时”。建议在调试初期就用示波器或逻辑分析仪捕获D+/D-波形,确认设备是否正常拉高信号线、复位时序是否完整、Chirp握手是否成功。这能节省大量排查时间。

1.5 本章小结

本章从三个层面建立了USB协议的基础认知:

  • 拓扑结构:星形-菊花链混合拓扑,主机唯一,Hub级联最多7层。
  • 角色分工:主机负责调度、地址分配和描述符请求;设备通过端点、接口和配置暴露功能。
  • 电气特性:D+/D-差分信号、上拉电阻速度识别、高速Chirp握手过程是枚举成功的前提。