第3章:USB电源角色:Host、Device与OTG双角色

搞USB电源管理,首先得搞清楚一个最基础的问题:这根线上,到底谁说了算?

说白了,就是谁给谁供电,谁管着谁。这听起来简单,但实际项目里因为角色搞混导致“通电不工作”、“插上就烧”的案例,我见过太多了。记得有一次,客户拿着一个设备来找我,说插到电脑上没反应,但拿去充电宝上却能工作。我一听就明白了,这八成是电源角色没认清。

所以今天这一章,我们来彻底捋清楚USB电源的三种角色:Host(主)、Device(从),以及OTG(双角色)。

3.1 Host角色:供电与控制的中心

Host,你可以把它想象成一个“管家”。这根USB总线上的所有事务,都由它来发起和管理。在电源方面,Host只有一个任务:向下行端口持续提供5V电压,同时监控电流。

  • 供电方向: 永远是从Host流向Device。
  • 电源能力: 标准USB 2.0是500mA,USB 3.0是900mA。如果超过这个值,Host必须限制,甚至切断电源。
  • 检测机制: 通过D+/D-线上的电阻检测设备连接,并在枚举过程中协商电流大小。

项目小记: 我设计过一个普通的USB-A口Host控制器。芯片上电后,VBUS没有立刻输出。需要通过GPIO或者芯片内部的寄存器使能VBUS开关,然后再等一段时间(通常10ms左右)等待电源稳定,才能开始后续的枚举和复位流程。

3.2 Device角色:节电与协议遵循者

Device,就是那个被管的对象。作为Device,你不负责“造电”,只负责“用电”。但用电这件事,也有很多门道。

Device的电源管理核心是省电。它通过USB总线挂起(Suspend)和唤醒(Resume)机制来控制功耗。比如一个鼠标,不动的时候它会自动进入Suspend状态,消耗电流必须低于2.5mA。

Device状态 最大消耗电流 主要特点
配置前 100mA 完成基本枚举,但尚未分配功能
配置后 / 工作模式 根据描述符 正常收发数据,电流由Host控制
Suspend(挂起) ≤ 2.5mA 维持内部状态,等待总线唤醒信号

避坑指南: 我曾经在做一款USB摄像头时,发现低功耗模式下电流总是降不下来。后来查了一圈,才发现是D+线上的上拉电阻被内部弱上拉代替,导致总线状态识别错误。正确的做法是,断开上拉,并确保所有时钟和PLL都关掉。

3.3 OTG双角色:既当Host又当Device的魔术

OTG(On-The-Go)的出现,是为了解决一个很实际的问题:手机和U盘怎么直接通信?

传统的USB世界里,两个Device之间不能直接对话。OTG打破了这一僵局,让一个设备可以动态切换角色。这就是我们说的双角色。

OTG的核心是增加了ID引脚。一般来说,ID脚接地,设备就作为A-device(默认Host);ID脚悬空,设备就作为B-device(默认Device)。

3.4 OTG电源管理的关键点

OTG的电源管理比普通Host/Device复杂不少。你想想看,一个设备本身可能是电池供电的,突然要变成Host去供电给U盘,这中间怎么协调?

  1. Host协商协议(HNP): 允许两个OTG设备在连接后交换角色。比如你把手机插到平板电脑上,手机可能觉得“我的电池比你大,我来当Host吧”,然后通过HNP交换身份。
  2. Session请求协议(SRP): 当总线空闲(Silent Bus)时,B-device可以请求A-device重新开启VBUS供电。
    • B-device通过数据线(D+/D-)发送脉冲信号。
    • A-device检测到脉冲后,恢复VBUS。
  3. 电源路径管理: 这是OTG设计的难点。如何在5V VBUS、电池电源和内部电压之间安全切换?

警告: 很多新手容易忽略VBUS的电容放电问题。当OTG设备从Host切换回Device时,VBUS上的大电容不能立刻放完。如果不控制放电,会导致再次连接时,Host识别到残留电压而产生错误逻辑。我在一个原型设计中,就因为没有设计VBUS快速放电电路,导致每次角色切换都要等5秒。

3.5 OTG电源角色状态机

为了更好地理解,我整理了一个简化版的电源角色状态机图。你可以看到,无论是A-device还是B-device,都有一套清晰的ID、VBUS、数据线状态来判断当前应该做什么。

USB OTG 电源角色切换核心流程 A-Device (初始Host) ID=GND, VBUS=5V B-Device (初始Device) ID=Float, VBUS=0V 检测到VBUS & D+上拉 角色交换决策 (HNP Request) 谁的电量更足?谁需要供电? 角色翻转成功 原A-Device降为Device,原B-Device升为Host SRP & VBUS关断 请求恢复VBUS

3.6 核心差异对比表

特性 标准Host 标准Device OTG Device (A-B双角色)
电源来源 对外供电 从VBUS取电 可供电也可取电
VBUS默认行为 持续5V输出 等待5V输入 根据ID和协议动态切换
电源管理复杂度 低(监控电流) 中(Suspend/Wake) 高(HNP/SRP/路径切换)
典型应用 PC、充电头 鼠标、键盘 手机、平板、移动硬盘

小结一下: 搞明白这三种角色,是做好USB电源管理的基础。Host负责输出,Device负责消费,OTG则是在两者间灵活切换。在实际抓包分析中,第一步就是看VBUS是否正常,以及ID引脚的状态。只有知道当前系统处于什么角色,后续的电流异常、协议冲突才能找到根源。