4. VBUS 检测常见异常类型概述
开始做 USB OTG 项目那会儿,我最头疼的就是 VBUS 检测。明面上不过就是一根线、一个电压,可实际跑起来,什么“插了没反应”“拔了还在充电”“一会通一会断”——全是坑。后来我把遇到的异常捋了一遍,发现无非就三大类:硬件抽风、软件脑补、协议打架。这一章先给你一个全景图,后面各节再逐个拆解。
一句话总结:VBUS 检测异常 = 电气层误报 + 采样层误判 + 协议层冲突,三座大山压下来,板子就会“装死”或者“乱跳”。
4.1 异常类型速览表
先看个总表。我在写《OTG 硬件设计检查表》的时候,就按这个维度分类的,排查时照着表找根因,效率高不少。
| 异常大类 | 典型现象 | 根因方向 |
|---|---|---|
| 硬件电平异常 | VBUS 瞬间跌落、纹波过大、电平漂浮 | 上拉电阻缺失/偏值、电容配置不当、走线过长、ESD 钳位漏电 |
| 软件采样误判 | 设备反复枚举、插入/拔出误触发、状态机卡死 | 采样周期不匹配、滤波策略过弱或过强、去抖逻辑不完善 |
| 协议交叉干扰 | ID 引脚电平与 VBUS 检测结果矛盾、充电协议抢占了 VBUS 控制权 | ID 上拉/下拉冲突、BC1.2/DCP 协议启动顺序错乱、PD 协商干扰 |
我的排查习惯:遇到 VBUS 怪现象,先看表头——是电压本身乱跳,还是软件判定乱跳?前者大概率是硬件,后者往往是软件滤波没做好。我曾有一次花了三天焊飞线,最后发现只是采样延时少写了 2 ms……
4.2 硬件层面的“假摔”
硬件问题最直观,但也最容易忽略。你想想看,VBUS 从 USB 座子到 SoC 检测引脚之间,经过了多少个元器件?每个都是潜在的“地雷”。
- 上拉电阻缺失或阻值偏差:标准的 OTG 检测,A 端需要 1.5 kΩ 上拉,B 端需要 15 kΩ 下拉。我曾经在量产批次中发现,供应商把 1.5 kΩ 换成了 1 kΩ,结果“插入”阈值刚好卡在临界区,良率掉到 70%。
- 电容影响:很多设计会在 VBUS 检测脚加一个 0.1 μF 去耦电容。如果电容漏电太大,或者并联了太大的滤波电容(比如 10 μF),VBUS 跌落时的 RC 时间常数会拉长,软件读到“有效”电压之前就超时了。嗯,这里要注意的是——检测脚上的电容不能超过 1 μF,这是经验值。
- 走线过长引入噪声:VBUS 检测线如果绕了远路,跟高速信号并行走,很容易耦合进噪声。我试过在示波器上看到一个 400 mV 的毛刺刚好盖过阈值,设备每隔 20 ms 就断开重连一次。
避坑指南:我曾经在双面板上把 VBUS 检测线布在了底层,上层的 D+/D‑ 差分线正好跨过,结果串扰导致检测值跳动。后来改走内层并加地隔离才解决。所以,检测走线要短、要直、要远离高速线。
4.3 软件层面的“误判”
硬件没问题,但依然异常?那大概率是软件“看错了”。说白了,ADC 采样是人眼的“余光”,采样时机和滤波策略决定了你能不能看清 VBUS 的真实状态。
- 采样时机不对:OTG 协议要求 VBUS 有效电压在 4.4 V~5.5 V,但电压不是瞬间建立的。你插入后立即采样,可能只有 3.8 V。我个人的做法是:插入中断触发后,延迟 50 ms 再启动第一次采样,然后连续采 3 次,取中值。
- 滤波策略过弱或过强:移动平均窗口太短(比如 2 个点),噪声无法平滑;窗口太长(比如 16 个点),插入/拔出检测的响应时间会超标。我记得有一次客户投诉“拔线后设备还在充电 3 秒钟”,查下来就是滤波窗口设了 32 个采样,每次采样间隔 100 ms——整整 3.2 秒的延迟。
- 去抖逻辑不完善:VBUS 在插拔瞬间会有多次弹跳。如果软件检测到一次低电平就立刻判“拔出”,那么弹跳会让状态机在原地打转。一定要做至少 2 次确认(比如连续 2 次采样均低于阈值才判无效)。
4.4 协议层面的“迷惑行为”
这一层比较隐蔽,因为硬件电压对、软件采样对,但协议栈内部打架,导致 VBUS 检测结果被“覆盖”或“忽略”。
- ID 检测与 VBUS 耦合:OTG 设备通过 ID 引脚区分主机端和设备端。如果 ID 引脚的上拉/下拉电阻配置错误,会迫使设备误判自己的角色,进而错误地控制 VBUS 的开启/关闭。我见过一个案例:ID 引脚没接地,设备自认为是 B 端,于是始终不拉高 VBUS……插上 U 盘完全没反应。
- 充电协议抢控:现在很多 OTG 设备同时支持 BC1.2 或 PD 充电。当充电器插入时,充电协议会接管 VBUS 开关,甚至把 VBUS 拉到 9 V/12 V。如果 OTG 检测逻辑没有区分“充电模式”和“普通模式”,就会把高电压误判为“过压”,然后紧急关闭 VBUS。解决方法很简单:在 VBUS 检测之前先查询协议协商状态。
- D+/D‑ 线干扰:D+ 上的上拉电阻(1.5 kΩ)不仅是 OTG 标志,也参与充电协议握手。我曾经遇到过 D+ 上拉电阻焊反了位置,导致充电协议误认为设备是 DCP,强制拉高 VBUS 电流,整个检测时序乱套。
给我的新手期建议:如果你刚接触 OTG 调试,别着急改代码。先拿示波器抓 VBUS 波形,看看电压是否干净、跳变是否陡峭。硬件没问题再改软件,软件改完还不行就去查协议——这个顺序我用了十年,没出过偏差。