3. USB热插拔物理机制:D+/D-差分信号、上拉/下拉电阻、设备插入与拔出检测
USB热插拔(Hot Plug)的物理基础建立在D+/D-差分信号线的电平变化之上。根集线器(Root Hub)通过检测这两条数据线上的静态电平状态,判断设备的连接与断开事件。本节深入分析差分信号模型、电阻网络配置以及电平跳变检测的完整物理过程。
3.1 D+/D-差分信号与静态电平定义
USB 2.0 使用一对差分信号线 D+ 和 D- 进行高速数据传输。在空闲(Idle)或挂起(Suspend)状态下,这两条线的电平组合决定了总线的当前状态。差分信号的核心优势在于共模噪声抑制,但在热插拔检测中,我们更关注其静态直流电平。
关键概念: USB 总线在无设备连接时,D+ 和 D- 均通过下拉电阻保持在低电平(GND)。设备插入后,通过上拉电阻将其中一条线拉高,从而产生可被集线器检测到的电平跳变。
下表总结了不同速率模式下 D+/D- 的静态电平配置:
| 速率模式 | 上拉电阻位置 | 空闲态 D+ 电平 | 空闲态 D- 电平 | 检测特征 |
|---|---|---|---|---|
| 低速 (LS) 1.5 Mbps | 设备端 D- 上拉 | 低 (0V) | 高 (3.3V) | D- 被拉高 |
| 全速 (FS) 12 Mbps | 设备端 D+ 上拉 | 高 (3.3V) | 低 (0V) | D+ 被拉高 |
| 高速 (HS) 480 Mbps | 设备端 D+ 上拉(初始) | 高 (初始) | 低 | 握手后切换为电流驱动 |
| 无设备连接 | 无 | 低 (0V) | 低 (0V) | 双线均为低 |
工程提示: 高速设备在 Chirp 握手阶段会暂时断开上拉电阻,改用电流源驱动。但热插拔检测的初始触发仍然依赖 D+ 上拉电阻产生的电平跳变。
3.2 上拉/下拉电阻网络与电平偏置
USB 规范要求主机端(根集线器)在 D+ 和 D- 上各安装一个 15kΩ ±5% 的下拉电阻到地。设备端则根据速率等级,在对应的数据线上安装一个 1.5kΩ ±5% 的上拉电阻到 3.3V 电源。
这种电阻网络构成了一个简单的分压器。当设备插入时,上拉电阻与主机端的下拉电阻形成分压,将空闲总线电平从 0V 拉高至约 3.0V(3.3V × 15kΩ / (1.5kΩ + 15kΩ) ≈ 3.0V)。集线器通过比较器监测该电压是否超过 VIH(通常为 2.0V)来判断设备连接。
3.3 设备插入检测的完整物理流程
当 USB 设备插入根集线器端口时,检测过程分为以下四个阶段:
- 机械接触建立: 设备插头的 VBUS、GND、D+、D- 四个引脚依次与主机端口接触。VBUS 首先建立连接,为设备提供 5V 电源。
- 上拉电阻生效: 设备上电后,其内部的上拉电阻(1.5kΩ)连接到对应的数据线(全速/高速为 D+,低速为 D-)。该电阻与主机端的 15kΩ 下拉电阻形成分压。
- 电平跳变与去抖: 主机端端口比较器检测到数据线电压从 0V 跳变至约 3.0V。集线器硬件启动一个 去抖定时器(通常为 2.5μs ~ 10ms,由具体实现决定),等待电平稳定。
- 状态锁定与中断上报: 去抖结束后,如果电平仍然保持高电平,集线器将端口状态寄存器中的“连接状态”位置位,并向主机控制器(Host Controller)发送中断信号,触发 USB 子系统进行枚举。
避坑指南: 去抖时间过短可能导致机械抖动引起的误检测;去抖时间过长则会影响热插拔响应速度。根集线器固件通常允许通过寄存器调整去抖周期,建议在 DMA 传输频繁的场景下适当延长去抖时间,避免电源噪声耦合到 D+/D- 线路上产生误触发。
3.4 设备拔出检测与断开识别
设备拔出检测比插入检测更具挑战性,因为拔出动作可能发生在数据传输过程中。检测机制同样依赖电平变化:
- 正常拔出: 设备断开后,上拉电阻与主机端断开,D+/D- 被主机端的 15kΩ 下拉电阻拉回低电平。集线器检测到电平从高跳变到低,经过去抖后确认拔出。
- 异常断开(Surprise Removal): 如果设备在传输数据时被拔出,D+/D- 上可能残留有数据信号。集线器通过检测连续多个位时间的空闲状态(SE0 状态:D+ 和 D- 均为低)来判断设备已断开。
- 断开检测时间: USB 规范要求集线器在设备断开后 100ms 内完成检测并更新端口状态。对于高速设备,断开检测通常更快,可在微秒级完成。
3.5 热插拔检测对 DMA 传输的影响
热插拔事件会直接影响根集线器与主机控制器之间的 DMA 传输调度:
| 热插拔事件 | 对 DMA 传输的影响 | 协同调优策略 |
|---|---|---|
| 设备插入 | 触发端口状态中断,主机控制器暂停当前 DMA 调度,进入枚举流程 | 预留中断处理时间片,避免 DMA 描述符在枚举期间被错误回收 |
| 设备拔出 | 正在进行的 DMA 传输可能因设备断开而失败,产生未完成传输描述符 | 启用 DMA 超时重试机制,配合端口状态变化回调清理无效描述符 |
| 电气噪声误触发 | 导致虚假连接/断开中断,频繁打断 DMA 批处理传输 | 适当增加去抖时间(如 5ms),在固件中增加连续采样确认逻辑 |
调优建议: 在根集线器固件中,将热插拔中断优先级设置为低于 DMA 完成中断,避免频繁的设备插入/拔出事件过度抢占 DMA 传输带宽。同时,在 DMA 描述符链表中加入“端口状态有效性”检查位,确保 DMA 引擎不会向已断开的设备端口发起传输。