4、设备连接与复位:VBUS检测机制、上拉电阻与下拉电阻(D+/D-)、复位信号(Reset)的时序要求、总线复位后的设备状态

好,咱们接着聊。设备插上USB口之后,到底发生了什么?

很多人以为就是「插上就能用」,其实背后有一套非常严谨的握手流程。我当年第一次调试USB设备时,就被这个「连接检测」坑过——设备插上去,主机死活不认。后来一查,是上拉电阻没焊好。嗯,这种低级错误,谁还没犯过呢?

4.1 VBUS检测机制

设备插入后,第一件事就是检测VBUS有没有电。说白了,就是看看有没有5V电压过来。

USB规范要求:设备必须在VBUS上升到4.0V以上时,才能认为「有效连接」。低于这个值,设备不能启动任何操作。为什么?因为电压不稳,强行工作容易出问题。

关键参数:

  • VBUS有效电压范围:4.75V ~ 5.25V(主机端输出)
  • 设备端检测阈值:4.0V(上升沿),3.5V(下降沿,带迟滞)
  • 去抖时间:通常2μs ~ 10μs

我习惯在VBUS检测引脚上加一个RC滤波,时间常数选1μs左右。这样能滤掉插拔瞬间的毛刺。有一次客户反馈设备偶尔枚举失败,查了半天,就是VBUS检测太灵敏,被电源纹波干扰了。加个电容搞定。

4.2 上拉电阻与下拉电阻(D+/D-)

VBUS检测通过后,设备就要告诉主机:「我是什么类型的设备?」

这个信息是通过D+和D-线上的电阻来传递的。你想想看,USB只有两根数据线,怎么区分全速、低速、高速?答案就在上拉电阻上。

设备类型 上拉电阻位置 电阻值 主机侧下拉电阻
低速设备(1.5 Mbps) D- 1.5kΩ ±5% 15kΩ ±5%
全速设备(12 Mbps) D+ 1.5kΩ ±5% 15kΩ ±5%
高速设备(480 Mbps) D+(初始全速,后切换) 1.5kΩ ±5% 15kΩ ±5%

这里有个细节:高速设备一开始也是以全速模式连接的。它先拉高D+,让主机以为是个全速设备。然后通过「Chirp J/K」握手信号,协商切换到高速模式。这个流程我后面会细讲。

避坑指南:

我曾经遇到过一批PCB,上拉电阻用了5%精度的碳膜电阻,结果阻值漂到1.6kΩ。主机端检测时,电压分压比不对,导致设备被识别成「未知设备」。后来全部换成1%精度的厚膜电阻,问题解决。所以,别在这种地方省钱。

4.3 复位信号(Reset)的时序要求

主机检测到设备连接后,会发送复位信号。复位说白了就是:主机把D+和D-同时拉低,并保持至少10ms。

时序要求很严格,我列一下关键参数:

  • 复位持续时间(TDRST): 至少10ms,最多20ms
  • 复位后的恢复时间(TRSTRCY): 至少10ms(设备准备时间)
  • 复位去抖时间: 主机端通常2.5μs ~ 5μs

为什么是10ms?因为USB是低速总线,要给设备足够的时间来响应。高速模式下,复位时间可以短一些,但规范要求兼容全速/低速设备,所以统一用10ms。

注意:

复位期间,设备不能发送任何数据。如果设备在复位期间试图发送数据,会被主机视为「违规行为」,可能导致枚举失败。我见过一个设计,MCU的USB模块在复位期间误触发了发送中断,结果主机直接断开了连接。

4.4 总线复位后的设备状态

复位结束后,设备进入一个确定的初始状态。这个状态很重要,因为后续的枚举流程都基于此。

复位后的设备状态包括:

  • 地址: 默认地址0(所有设备复位后地址都是0)
  • 端点: 只有端点0可用(控制端点)
  • 配置: 未配置状态(Configuration = 0)
  • 电源: 总线供电模式,最大电流100mA
  • 数据线: D+和D-处于空闲状态(J状态)

说白了,复位后的设备就像一张白纸。主机接下来会通过「获取设备描述符」、「设置地址」、「获取配置描述符」等步骤,一步步把设备配置好。

我个人的经验:

调试USB设备时,我习惯用逻辑分析仪抓一下复位后的D+/D-波形。如果复位后设备没有正确进入空闲状态(比如D+一直高),那肯定是上拉电阻或固件初始化有问题。这个波形一看便知,比猜来猜去快多了。

4.5 知识体系流程图

下面我用一张SVG图,把整个设备连接与复位的流程串起来。你一看就明白了。

USB设备连接与复位流程 1. 设备插入 机械连接建立 2. VBUS检测 电压 > 4.0V? 3. 上拉电阻 D+或D-拉高 4. 主机检测到设备 D+/D-状态变化触发中断 5. 复位信号(Reset) D+和D-同时拉低 ≥ 10ms 6. 设备进入默认状态(地址0,端点0可用) 关键时序参数 • VBUS去抖:2~10μs • 复位时间:10~20ms • 恢复时间:≥10ms

这张图把整个流程串起来了。从设备插入开始,到VBUS检测、上拉电阻通知主机、主机发送复位信号,最后设备进入默认状态。每一步都有严格的时序要求,任何一个环节出问题,枚举就会失败。

调试小技巧:

我习惯在D+和D-线上各串联一个22Ω的电阻,靠近设备端。这样能抑制信号反射,提高信号完整性。另外,上拉电阻的电源最好从VBUS取,别用设备内部的3.3V,否则插拔时会有电压倒灌的风险。

好了,设备连接和复位这部分就讲到这里。记住一句话:USB的物理层决定了你能不能「连上」,而协议层决定了你能不能「用上」。连不上,后面全是白搭。