第2章:USB协议基础与OTG规范解读

说到USB OTG的电源管理,你得先搞懂底层的USB协议长什么样。我刚开始接触这块时,以为不就是插个U盘嘛,结果第一次拿逻辑分析仪抓包,波形看得我头皮发麻。后来才明白,OTG不只是物理上的A/B口切换,它背后有一套完整的协商机制。

2.1 USB协议版本与速度分级

咱们先看看USB的“身份证”。从1.0到4.0,速度翻了上万倍,但OTG真正关心的其实是2.0和3.x这两代。

版本速率编码方式OTG支持
USB 1.112 Mbps(全速)NRZI否(规范太老)
USB 2.0480 Mbps(高速)NRZI + 位填充是(OTG 1.0/2.0)
USB 3.25/10/20 Gbps8b/10b + 128b/132b是(OTG 3.0)
USB440 Gbps128b/132b兼容(需额外协商)

说白了,大多数嵌入式设备还在用USB 2.0 OTG。为什么呢?成本低、功耗可控。我个人习惯在项目初期先确认对方用的是哪个版本,因为3.0的VBUS电流、CC引脚逻辑跟2.0完全不一样,踩坑成本挺高的。

2.2 USB物理层与电气特性

USB的物理层就两根差分线(D+、D-),外加VBUS和GND。你知道吗?OTG还引入了一个ID引脚——这是区分主从的关键。

  • VBUS:默认5V,但实际在OTG场景下,Host侧才会供电,Device侧是耗电的。
  • D+/D-:差分信号,传输数据和设备枚举。上拉电阻的位置决定了角色。
  • ID:OTG A设备(默认Host)的ID接地,B设备(默认Device)的ID悬空。当然,软件也可以强行反转。
注意:我曾经在一个国产平板项目里,发现ID引脚虚焊导致设备识别振荡——主机不断重枚举,VBUS忽高忽低。用示波器一抓,发现ID电平在0~1.8V之间跳变。后来焊了个10kΩ下拉才稳定。所以ID引脚的拉电阻设计别马虎。

2.3 USB传输类型与包结构

USB通信不是“想发就发”的,它分四种传输类型,每种对应不同的实时性要求。

  • 控制传输:用于获取描述符、配置设备。典型场景:你的平板插上U盘后,主机先发一个Get Descriptor请求。
  • 批量传输:大块数据,无实时性。比如U盘读写。
  • 中断传输:固定间隔查询,比如鼠标键盘。OTG中的HNP切换就用到了中断端点。
  • 同步传输:实时音频/视频,不重传。

你想想看,一个USB包从SYNC开始,到EOP结束。包类型有令牌包、数据包、握手包。这些在抓包软件里都能看到。

// 典型的USB控制传输事务(抓包日志简化)
Split:  OUT  (ADDR=1, EP=0)
Data0:  80 06 00 01 00 00 40 00  // Get Descriptor: Device
Handshake: ACK

嗯,这里要注意:OTG中的角色协商包(比如SRP、HNP)其实也是通过控制传输和中断传输完成的。我当初调试时,总以为有单独的特殊包,后来发现就是标准协议上的“借壳”,涨了不少记性。

2.4 OTG规范核心:A设备与B设备

OTG把设备分成A和B两种。

  • A设备:提供VBUS,初始默认为Host。ID引脚接地。
  • B设备:消耗VBUS,初始默认为Device。ID引脚悬空。

但这只是初始角色。OTG最妙的地方就是可以“互换”——通过Session Request Protocol (SRP) 和 Host Negotiation Protocol (HNP)。

核心逻辑:SRP负责唤醒总线和请求供电;HNP负责交换Host/Device角色。电源管理就是在这两个协议中切换VBUS的供应方。

2.5 SRP(会话请求协议)

B设备想“借电”或“要当主机”时,它不能直接拉高VBUS,因为只有A设备才有供电能力。B设备会做两件事之一:

  1. 数据线脉冲(Data Line Pulse):在D+上产生短暂脉冲。
  2. VBUS脉冲(VBus Pulse):充电泵把B设备内部的VBUS拉到2.0V以上持续一段时间。

为什么有的设备两个都做?我遇到过一款蓝牙键盘,它的SRP只做了VBUS脉冲,结果某些旧的A设备(比如老款路由器)根本不认。后来我改了固件,同时发送两种脉冲,兼容性就好了很多。

小技巧:抓包时,如果看到D+上有个短脉冲(约5~10ms),但VBUS没变,那就是Data Line Pulse。如果VBUS先跳变到2V多,则是VBus Pulse。两者同时出现也能见到。

2.6 HNP(主机协商协议)

角色互换的正式环节。A设备和B设备通过一个专用的中断端点协商。

  • A设备:发送“你来做主机”的请求。
  • B设备:回复ACK,然后通过拉低D+表示自己转为主机。
  • 双方交换角色后,源VBUS控制权随之转移。

这个过程中VBUS的瞬态电流变化非常大。我测过一个项目,HNP切换时VBUS从5V掉到3.8V,导致系统复位。后来加了超级电容才稳住。

2.7 本章知识体系总览

下面这张图帮你理清USB OTG电源管理涉及的核心脉络。

USB OTG电源管理知识结构 USB OTG电源管理核心知识体系 USB协议基础 电气特性 & ID引脚 四种传输类型 包结构 & 枚举 OTG规范:A/B设备定义 SRP – 会话请求协议 HNP – 主机协商协议 VBUS电源切换 & 角色转换 电源抓包关注点: VBUS波形、角色切换时序
阅读提示:从USB协议基础出发,左分支关注ID引脚和电平,右分支聚焦传输包,向下演化成OTG的A/B角色定义,再拆分为SRP和HNP,最终落到VBUS电源切换的实战抓包上。这就是我们后续章节的主线。

2.8 常见协议误解

有些同事会问:“OTG是不是必须支持HNP才算合规?”
其实不是。OTG规范里有一种“单一角色”设备,比如只做Host的外设(USB鼠标转接器),它不需要HNP。只有当你需要动态互换时,才必须实现这套协议。我个人建议在看源码前先确认设备的能力描述符(bcdUSB、bDeviceProtocol字段),避免白费功夫。

避坑:我曾经以为只要硬件支持HNP,软件层随便写写就好。结果发现A设备在HNP切换时,必须关闭所有端点并重新枚举。如果没按规范顺序操作,B设备可能永远收不到SET_CONFIGURATION。抓包波形一片死寂……

2.9 小结

这一章我们把USB协议基础和OTG规范的关键骨架过了一遍。记住几个核心:
- USB电气特性影响电源设计(VBUS、ID、上拉电阻)
- OTG通过A/B设备初始角色、SRP唤醒、HNP互换来实现灵活供电与角色切换
- 这些都是后续抓包分析的科学基础。你掌握了这些,再去读总线波形就不会一头雾水了。