ID 脚在 OTG 连接过程中的角色
说到 OTG 的 ID 脚,很多人以为它就是个“插拔检测”。其实没那么简单。ID 脚在 OTG 协议里扮演了三个关键角色:主机/设备角色切换、HNP 协议、SRP 协议。说白了,它是整个 OTG 连接过程的“交通指挥员”。我来一个个拆开讲。
1. 主机/设备角色切换——ID 脚说了算
标准 USB 里,A 口永远当主机,B 口永远当设备。但 OTG 不一样。同一个 Micro-AB 口,插不同的线,身份就变了。
怎么变的? 靠 ID 脚的电平。
- ID 脚接地(GND):这根线是 A 类线(主机线)。设备检测到 ID 拉低,就知道自己要当主机。此时它提供 VBUS 电源,控制总线。
- ID 脚悬空(浮空):这根线是 B 类线(设备线)。设备检测到 ID 浮空,就知道自己乖乖做设备,从 VBUS 取电,响应主机请求。
避坑提示:我在项目里遇到过客户把 ID 脚直接接一个 10kΩ 下拉电阻,而不是接 GND。结果设备时而识别成主机、时而识别成设备。切记,ID 接地必须是 低阻抗 连接,阻值不能超过 10Ω。浮空则要保持高阻抗(>100kΩ 或直接 NC)。
这个角色切换是硬件层面的。但光靠 ID 脚还不够——两个 OTG 设备连接后,角色可能还要动态换掉。这就引入了 HNP 和 SRP。
2. HNP 协议——主机切换的“握手礼”
HNP(Host Negotiation Protocol)是 OTG 的核心。它允许两个 OTG 设备 在连接后交换主机角色。
举个例子:你插了手机和 U 盘。手机检测 ID 接地,当主机。但手机想读 U 盘数据,其实对方设备(U 盘)更像主机?不,U 盘本身就是设备。所以 HNP 的场景一般是两个双角色设备(比如手机连平板)。
HNP 基本流程:
- 初始角色分配:A 设备(ID 接地)当主机,B 设备(ID 浮空)当设备。
- B 设备请求切换:B 设备拉低 D+ 或 D- 上的上拉电阻,表示“我想试试当主机”。
- A 设备同意并释放总线:A 设备停止驱动总线,把 VBUS 保持有效,但不再驱动 USB 信号。
- B 设备驱动总线:B 设备拉高 D+ 上拉,变成主机,并开始枚举原来的 A 设备(现在变成从设备)。
- 切换完成:新主机(原 B 设备)可以正常通信。需要时还可以再次切回来。
关键点:HNP 切换时 VBUS 不能断电。它由原主机一直供电,新主机只切换信号控制权。我做过一个项目,因为 VBUS 在切换时瞬间掉电了 2ms,导致对方设备 USB 控制器复位。后来加了 VBUS 保持电路才稳定。
HNP 的触发条件有两个:一是 B 设备主动发起(通过拉低 D+ 上拉),二是 A 设备通过特定的 SetFeature 请求允许 HNP。这也是很多嵌入式工程师容易忽略的地方——HNP 不是默认开启的,主机必须同意。
3. SRP 协议——从设备“唤醒”总线的技巧
SRP(Session Request Protocol)解决的是另一个问题:当总线处于挂起或省电状态(VBUS 关闭)时,从设备如何让主机重新供电并启动会话?
典型场景:两个 OTG 设备连在一起,长时间不通信,主机关掉了 VBUS 进入省电模式。此时从设备(比如鼠标或传感器)突然有数据要发送。难道要拔插数据线?不用。用 SRP 唤醒。
SRP 流程:
- 第一步(设备检测):B 设备检测到 VBUS 低于 0.2V(即总线已关闭),准备发起 SRP。
- 第二步(B 设备拉低 D+):B 设备将 D+ 线拉低至少 2μs。这是“请求会话”的信号。
- 第三步(主机检测并重新供电):A 设备(原主机)检测到 D+ 上的脉冲,认为 B 设备有需求。于是它重新打开 VBUS 并启动 USB 总线复位。
- 第四步(重新枚举):总线复位后,双方重新走枚举流程,恢复通信。
注意:SRP 只能由 B 设备(从设备)发起。A 设备无需响应 SRP——但为了功耗,大多数 OTG 主机都会响应。我曾经调试过一个功耗敏感项目,从设备每隔 500ms 就发一次 SRP 脉冲,结果主机端负载电容太大,拉低 D+ 的脉宽不够,主机根本检测不到。后来我们把脉冲宽度从 2μs 扩展到 10μs 才解决。
4. ID 脚、HNP、SRP 三者关系
很多初学者会把它们割裂开。其实它们是一条链上的:ID 脚决定了初始角色;HNP 决定了角色能否交换;SRP 决定了挂起后能否重新唤醒。我给你画张图,一看就明白。
5. 一张表对比 HNP 和 SRP
| 对比项 | HNP | SRP |
|---|---|---|
| 目的 | 交换主机/设备角色 | 唤醒挂起的总线,重新开始会话 |
| 触发方 | B 设备(或 A 设备允许后) | B 设备(从设备) |
| VBUS 状态 | 始终保持(不关闭) | 之前已经关闭,唤醒后再打开 |
| 硬件信号 | 拉低/拉高 D+ 上拉电阻 | 在 D+ 上拉低脉冲(至少 2μs) |
| 执行条件 | 主机已通过 SetFeature(HNP_ENABLE) 允许 | 主机支持 SRP 检测(OTG 规范要求支持) |
| 常见坑点 | B 设备未拉低 D+ 上拉,角色切换失败 | 脉冲宽度太短或主机未开启 SRP 检测 |
6. 实战排查要点
如果你现在正被 ID 脚或 OTG 连接问题搞得头秃,可以按这个顺序查:
- 硬件层面:用示波器看 ID 脚电平。接地时电压 <0.2V?浮空时电压 >2.5V?这两个值不对,后面所有协议都白搭。
- 角色切换:设备枚举成功后,用 USB 分析仪看主机有没有发出 SetFeature(HNP_ENABLE) 请求。很多 MCU 的 USB 库默认不开启 HNP,需要手动使能。
- SRP 测试:在主机挂起后,从设备发起 SRP 脉冲。用示波器抓 D+ 线上的负脉冲,宽度是否大于 2μs?幅值是否低于 0.8V?
- 软件反馈:检查 OTG 中断状态寄存器。很多芯片有 OTG_INTSTS 或类似寄存器,会标记 HNP 请求、SRP 检测等。
个人经验:我做过的某款物联网网关,ID 脚接了 TVS 管,结果 TVS 管漏电导致浮空电压只有 1.8V(正常应 > 2.5V),芯片一直识别成设备。拆掉 TVS 换低漏电流的型号就正常了。排查 ID 脚时,一定不要只测插拔瞬间,还要测静态。
嗯,ID 脚的知识点讲得差不多了。记住一句话:ID 脚是 OTG 的“身份证”,身份定了以后,HNP 和 SRP 才能决定后续的通信细节。这三个东西组合起来,才是完整的 OTG 体验。