USB OTG 是什么?VBUS 又有什么用?
做嵌入式这些年,我调试过的 USB 问题少说也有几十种。其中 OTG 相关的 VBUS 检测异常,是最容易踩坑的之一。很多朋友一上来就怀疑 D+/D- 信号质量,其实十有八九是 VBUS 电平没到位。说白了,VBUS 就是 USB 端口的生命线——它负责供电,也是设备识别角色(Host/Device)的关键信号。
USB OTG 的由来:从主从死板到角色灵活
早期 USB 只有两套固定角色:Host(如电脑)和 Device(如 U 盘)。你要是想把手机直接插 U 盘,不行——除非手机支持 OTG。
USB OTG(On-The-Go)协议在 2001 年由 USB-IF 发布,核心目的就一个:让设备能根据现场插拔动态切换角色。你接一个 U 盘它就是 Host,你把它插到电脑上它就变成 Device。嗯,这就是 OTG 的双角色能力。
VBUS 在 OTG 中的作用:三个层次
VBUS 在 USB 2.0 规范中定义电压为 4.75V ~ 5.25V,最大电流 500mA。但在 OTG 场景下,它多了一层角色识别的功能。我把它拆成三个层次:
- 供电层:为远端设备提供 5V 工作电源。我的经验里,很多 OTG 异常就是线缆压降太大,到设备端 VBUS 降到 4.3V 以下,设备直接掉电不工作。
- 连接检测层:设备通过 VBUS 电平变化感知插入/拔出。比如 USB 协议要求 A 设备(初始 Host)在 VBUS 上升到 4.4V 以上时才认为连接有效。
- 角色协商层:OTG 新增了一套 SRP(会话请求协议)和 HNP(主机协商协议)。设备通过 VBUS 脉冲或拉低来发起会话、切换角色。VBUS 上的时序和幅值必须严格满足协议,否则协商失败。
| VBUS 层次 | 功能描述 | 典型异常现象 |
|---|---|---|
| 供电层 | 提供 5V / 500mA 电源 | 设备不充电、反复枚举 |
| 连接检测层 | 上升沿/下降沿触发中断 | 无法识别插入、拔出误判 |
| 角色协商层 | SRP/HNP 脉冲时序验证 | OTG 反转失败、死锁 |
核心结论: 超过 60% 的 OTG 异常,根因出在 VBUS 的电压幅值或时序上而非数据线。排查时永远先量 VBUS。
OTG 的设备类型与状态机
OTG 设备分三种:A-Device(初始供电方,一般为 Host),B-Device(初始受电方,一般为 Device),和 Dual-Role Device(双角色设备)。我最早调试时弄混过:以为 A 固定是 Host,实际上 A/B 只是物理角色,逻辑角色可以在 HNP 握手后互换。
状态机大概是这样:A-Device 上电后先维持 VBUS 为 5V,若检测到 B-Device 拉低 D+(B 表示希望当 Host),A 可以释放 VBUS 控制权,B 接管供电。反过来的过程由 SRP 发起。我建议你画个状态机图贴在实验台旁边,排查时一眼就能定位卡在哪个状态。
第一章节知识体系框架
下面这张图帮你理清本章的知识脉络。你可以保存下来,之后每个章节排查遇到 VBUS 问题时回头对照。
为什么 VBUS 检测总是出问题?
我遇到过最典型的案例:某款平板用的 Type-C 接口,OTG 模式下插 U 盘,有时认有时不认。换不同 U 盘又正常,怎么复现都不稳定。示波器一抓发现 VBUS 在插入瞬间有一个 50mV 的负冲,持续时间约 200μs,恰好触发了 B 设备的欠压保护。后来在 VBUS 路径上加了一个 10μF 的电容,问题消失。
你想想看,这种负冲在 DC 表上根本看不到,只有动态示波器才能捕获。所以我在《指南》后面章节会专门讲怎么用示波器抓 VBUS 的上升沿、SRP 脉冲、负极瞬变,这些才是异常排查的显微镜。
最后有个小原则想分享:OTG 调试时,别急着怀疑软件。硬件上 VBUS 是不是好好的?电压是不是在范围内?上升斜率是不是够陡?先排除供电和物理层,再去看驱动和固件。这个次序能帮你省一半时间。