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 基本流程:

  1. 初始角色分配:A 设备(ID 接地)当主机,B 设备(ID 浮空)当设备。
  2. B 设备请求切换:B 设备拉低 D+ 或 D- 上的上拉电阻,表示“我想试试当主机”。
  3. A 设备同意并释放总线:A 设备停止驱动总线,把 VBUS 保持有效,但不再驱动 USB 信号。
  4. B 设备驱动总线:B 设备拉高 D+ 上拉,变成主机,并开始枚举原来的 A 设备(现在变成从设备)。
  5. 切换完成:新主机(原 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 决定了挂起后能否重新唤醒。我给你画张图,一看就明白。

ID脚、HNP与SRP关系流程图 ID 脚 → 角色切换 → HNP → SRP 流程 ID 脚电平检测 ID = GND → 主机 ID = 浮空 → 设备 初始连接 HNP 角色协商 SRP 会话请求 挂起后才触发 正常通信 / 继续 可再次触发 HNP 或 SRP 图例 初始角色 / 流程开始 ID=GND → 主机 ID=浮空 → 设备 HNP

5. 一张表对比 HNP 和 SRP

对比项HNPSRP
目的交换主机/设备角色唤醒挂起的总线,重新开始会话
触发方B 设备(或 A 设备允许后)B 设备(从设备)
VBUS 状态始终保持(不关闭)之前已经关闭,唤醒后再打开
硬件信号拉低/拉高 D+ 上拉电阻在 D+ 上拉低脉冲(至少 2μs)
执行条件主机已通过 SetFeature(HNP_ENABLE) 允许主机支持 SRP 检测(OTG 规范要求支持)
常见坑点B 设备未拉低 D+ 上拉,角色切换失败脉冲宽度太短或主机未开启 SRP 检测

6. 实战排查要点

如果你现在正被 ID 脚或 OTG 连接问题搞得头秃,可以按这个顺序查:

  1. 硬件层面:用示波器看 ID 脚电平。接地时电压 <0.2V?浮空时电压 >2.5V?这两个值不对,后面所有协议都白搭。
  2. 角色切换:设备枚举成功后,用 USB 分析仪看主机有没有发出 SetFeature(HNP_ENABLE) 请求。很多 MCU 的 USB 库默认不开启 HNP,需要手动使能。
  3. SRP 测试:在主机挂起后,从设备发起 SRP 脉冲。用示波器抓 D+ 线上的负脉冲,宽度是否大于 2μs?幅值是否低于 0.8V?
  4. 软件反馈:检查 OTG 中断状态寄存器。很多芯片有 OTG_INTSTS 或类似寄存器,会标记 HNP 请求、SRP 检测等。

个人经验:我做过的某款物联网网关,ID 脚接了 TVS 管,结果 TVS 管漏电导致浮空电压只有 1.8V(正常应 > 2.5V),芯片一直识别成设备。拆掉 TVS 换低漏电流的型号就正常了。排查 ID 脚时,一定不要只测插拔瞬间,还要测静态。

嗯,ID 脚的知识点讲得差不多了。记住一句话:ID 脚是 OTG 的“身份证”,身份定了以后,HNP 和 SRP 才能决定后续的通信细节。这三个东西组合起来,才是完整的 OTG 体验。