3. OTG硬件引脚定义:ID引脚、VBUS、D+/D-的作用与检测机制

你在调USB OTG的时候,有没有遇到过插上设备完全没反应?或者明明插对了,主机却认成从机?

我早年做一款嵌入式平板,就栽在这个坑里——硬件工程师把ID引脚悬空了,结果设备插上去永远是Device模式。查了三天,最后拿万用表一量,才明白硬件引脚才是整个角色识别的基石。

这一节,我们就从最底层的引脚定义讲起。你只有看懂了ID、VBUS和D+/D-在物理层面是怎么工作的,才能真正理解为什么有时候软件改了也没用。

3.1 ID引脚:Host/Device的“身份证”

OTG标准在传统USB的4根线上加了一根——ID引脚。说白了,这根线就是用来告诉设备:“你该当主机,还是该当外设?”

  • ID接地(GND):设备把自己识别为A设备(Host)。典型场景是手机接U盘,手机内部把ID拉低,手机变成主机。
  • ID悬空(浮空或高阻):设备识别为B设备(Peripheral)。比如U盘插到电脑上,U盘侧的ID悬空,它就知道自己是从机。

我个人习惯在原理图上把ID引脚标为“ID_GND”和“ID_FLOAT”。PCB Layout时,ID走线尽量不要跟D+/D-平行太长,否则串扰会让你偶尔认错角色。我吃过这个亏。

3.2 VBUS:供电与连接检测

VBUS不只是供电线,它还是硬件检测“有没有设备插进来”的关键信号。OTG规范里,VBUS有几条硬规矩:

VBUS状态 电压范围(典型) 含义
浮空 < 0.8 V 无连接,设备处于Idle
有效 4.4 V ~ 5.25 V 正常供电,连接建立
欠压 2.0 V ~ 4.0 V 线缆压降过大,可能触发重枚举
过压 > 5.5 V 保护电路应关断,否则危险

你想想看,如果VBUS上电压从0跳到5V,硬件立刻触发中断——这叫“VBUS Valid”检测。我在项目中见过有人把VBUS检测漏了,只靠软件轮询,结果设备插拔总是延迟半秒才反应。嗯,千万别省这个硬件检测脚。

注意:OTG Host侧必须提供至少8mA的VBUS供电能力,而传统Host是100mA/500mA。如果你做的是便携式OTG,VBUS限流开关要选好,否则插个大功率U盘直接就把电压拉垮了。

3.3 D+/D-:数据传输与速度协商

D+/D-的功能大家都知道是传差分信号。但OTG里,它们还有一个额外任务——在连接初期做速度协商和角色确认。

USB 2.0的速度协商靠D+或D-上的上拉电阻:

  • 全速(12 Mbps):D+上拉1.5kΩ到3.3V
  • 低速(1.5 Mbps):D-上拉1.5kΩ到3.3V
  • 高速(480 Mbps):先全速握手,再切高速,D+上拉变为电流源

但OTG加了ID引脚后,D+/D-的上拉/下拉策略变得复杂。举个例子:当ID接地(Host模式)时,D+/D-上的下拉电阻必须使能,等待外设上拉。而当ID悬空(Device模式)时,上拉电阻使能,等待Host来检测。

我曾经遇到过一个诡异问题:一块板子做Host时总认不到U盘,示波器一抓发现D+根本没上拉到3.3V。查了半天,原来是D+/D-的ESD保护管漏电,把上拉电压拉到了2.8V以下。换了个低漏电的TVS管就好了。

3.4 检测机制:从硬件电平到软件确认

整个硬件层角色识别,可以归纳为以下流程:

  1. VBUS检测:上升沿触发,设备唤醒
  2. ID检测:读取ID引脚电平,区分A设备或B设备
  3. D+/D-状态机:Host侧检测D+或D-上的上拉,确定连接速度和设备类型
  4. 软件确认:枚举前通过USB控制传输获取设备描述符,最终确认角色

注意:步骤2和3是同时进行的。硬件会在VBUS有效后100ms内完成ID采样和D+/D-线态检测。如果超时,会直接断开VBUS并报错。

避坑指南:我曾经在某国产MCU上遇到ID引脚内部无上拉,必须外接100kΩ上拉到3.3V,否则ID悬空时电平不确定。结果硬件没加,导致同一批板子有的认成Host有的认成Device。解决方案是:ID引脚必须按照芯片手册明确配置上拉或下拉,不要依赖内部浮空状态。

OTG硬件引脚角色识别流程图 设备插入/拔出 VBUS Valid 检测 VBUS无效 ID引脚采样 A设备 (Host) ID=GND,使能D+/D-下拉 B设备 (Device) ID=FLOAT,使能D+/D-上拉 检测D+/D-上拉 等待Host检测上拉 角色确认 / 枚举 硬件检测到软件枚举的全链路

3.5 硬件层角色识别总结

一张表把四个引脚的角色讲清楚:

引脚 Host(A设备)状态 Device(B设备)状态 检测方式
ID 接地(GND) 悬空(高阻) GPIO读取电平
VBUS 输出5V 输入5V ADC或比较器检测阈值
D+ 下拉15kΩ 上拉1.5kΩ(全速/高速) 检测线态(SE0/J/K)
D- 下拉15kΩ 上拉1.5kΩ(低速) 同上

做PCB布局时,我建议把ID、VBUS、D+/D-这四根线用不同的颜色标注在原理图上。调试时用示波器同时抓ID和VBUS,看它们的变化顺序是否符合预期。我曾经靠这个方法,五分钟就定位了一颗OTG芯片的ID滤波电容焊错位置的问题。

理解了硬件层,你就能明白:为什么某些组合线缆(比如带弹片的Micro-USB转接头)会莫名其妙让设备角色反转?因为弹片接触不良导致ID引脚等效于悬空,设备当然就以为自己是B设备了。下次遇到这类问题,先量一下ID引脚对地电阻——这个思路,比改一百行驱动代码都管用。