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和功能设备之间的层级关系:
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序列与主机协商进入高速模式:
- 设备插入后,将D+上拉至3.3V(全速状态)。
- 主机检测到D+高电平,发送复位信号(SEO持续≥10ms)。
- 设备检测到复位结束,发送Chirp K(D+低、D-高)持续1ms~7ms。
- 主机检测到Chirp K后,回复交替的Chirp J/K序列。
- 设备收到主机Chirp后,断开D+上拉电阻,进入高速模式。
- 如果主机不支持高速,则不回复Chirp,设备保持全速模式。
下面用SVG图展示高速握手过程的时序:
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握手过程是枚举成功的前提。