USB-C 系列第 4 章:PD 快充协商,充电器和设备如何决定功率

USB-C 入门系列|第 4 章 / 连载中

你正在阅读 第 4 章:PD 快充协商,充电器和设备如何决定功率。如果你是从搜索引擎直接进来的,可以先看总目录,也可以按上一篇、下一篇顺着读。

前面第三章已经讲过线材电流上限、高功率线材和 E-marker 这些内容。这一章就不再重复讲线材能承受多少电流了,我们把视角往后挪一步:当线插上、设备也已经知道对面存在之后,充电器和设备到底是怎么谈出一个充电功率的?

这就是 USB PD 协商。

我觉得 USB PD 最容易被误解的地方,是很多人会把它想成一个“充电器主动输出”的过程。比如充电器标着一个很高的功率,大家就会下意识觉得它应该主动把最大能力推给设备;如果手机只显示二十多瓦,就觉得充电器没发挥出来。其实 PD 不是这样工作的。更准确的理解是:充电器先报出自己有哪些能力,设备再从里面选一个自己想要的,充电器确认后才切换电源状态。

所以这章的核心不是某个具体功率数字,而是背后的流程:Source_CapabilitiesRequestAcceptPS_RDY,以及最后建立的 Explicit Contract

USB PD 更像谈判,不像蛮力供电

如果把 USB-C 的物理连接看成“见面”,那么 USB PD 就是见面之后的谈判。

设备插上去以后,充电器不会上来就说“我有高压档位,我直接给你 20V”。这太危险了。对面可能是手机,可能是耳机,可能是移动电源,也可能是一台笔记本。不同设备能接受的电压、电流和充电策略完全不同。一个负责任的电源系统,最怕的就是在不知道对面是谁的时候自作主张。

所以 PD 的做法很克制:先建立基础连接,再交换能力,再请求档位,再确认切换。

这里可以先记住一个很短的流程:

Source_Capabilities -> Request -> Accept -> PS_RDY -> Explicit Contract

这条线就是本章的主线。

Source 和 Sink:先分清谁在供电

在 USB PD 里,供电方叫 Source,用电方叫 Sink

你把手机插到充电器上,充电器是 Source,手机是 Sink。你把笔记本插到充电器上,充电器还是 Source,笔记本是 Sink。你用笔记本给手机反向充电,这时笔记本就变成 Source,手机是 Sink。

这个概念本身不难,难的是不要把它和数据方向混在一起。USB 里还有 DFP、UFP 这些数据角色,后面还有 Alt Mode、VDM、视频输出等一堆东西。但在这篇里,我们先不展开那些。只要围绕快充来理解,Source 就是“这轮供电的人”,Sink 就是“这轮用电的人”。

从这个角度看,PD 协商其实就是 Source 和 Sink 在确定一件事:这一轮我们到底按什么电源条件工作。

第一步:充电器先发能力列表

USB PD 协商里第一条很重要的消息叫 Source_Capabilities

这个词看起来像规范里的大词,但意思非常朴素:充电器把自己的供电能力发给设备。

我很喜欢用“菜单”来理解它。充电器不是只说一句“我最大功率很高”,而是会把自己能提供的几个档位列出来。比如一个常见的 USB-C 充电器,可能会告诉设备:我可以提供 5V,也可以提供 9V、15V、20V,不同电压下有不同的电流能力。

这时设备看到的不是一个抽象的“65W”,而是一组选项。每个选项背后都可以用 $P=U \times I$ 算出功率。比如某个档位是 20V 3.25A,那就是 $20\text{V}\times3.25\text{A}=65\text{W}$。

在协议里,这些选项通常会以 PDO 的形式存在。PDO 是 Power Data Object,可以暂时理解成菜单上的一个供电套餐。下一章我们会专门讲 PDO、RDO、APDO 和 PPS,所以这里不用急着把格式细节塞进脑子里。第四章只需要先理解:充电器会先把菜单递出来。

这一步很关键,因为设备不能凭空点一道菜单上没有的菜。如果 Source_Capabilities 里没有某个档位,Sink 就不能假装它存在。

第二步:设备根据自己需求发 Request

菜单递出来以后,真正做选择的是设备。

设备会发一条 Request。它的意思大概是:我看完你的能力列表了,我想使用其中这个档位,并且我希望按这个条件工作。

这就是为什么很多时候“同一个充电器,不同设备功率不同”。因为充电器只是提供能力,设备才是发起请求的一方。

比如一台手机可能只请求一个比较保守的档位,平板可能请求更高一点,笔记本又可能请求更高。这里不是充电器偏心,而是每台设备的电池、温度、充电芯片、系统策略都不一样。设备不是为了把充电器榨干而存在,它会按自己的节奏来。

这一点特别重要,因为它能解释很多日常现象。你拿一个高功率充电器给手机充电,手机没有跑到充电器标称上限,不代表充电器一定虚标。更常见的情况是,手机根本没有请求那么高。它可能觉得二十多瓦已经够了,也可能因为电量、温度或协议策略限制,不愿意再往上走。

换句话说,PD 快充里不是 Source 强行决定 Sink 吃多少,而是 Sink 从 Source 的能力里挑一个自己要的。

第三步:Accept 只是同意,不是已经切好电

设备发出 Request 后,充电器如果认可这个请求,会回复 Accept

这里有个很容易忽略的点:Accept 不是“电已经切好了”,它只是“我同意你的请求”。

为什么要分这么细?因为电源切换不是一句话的事。从一个电压切到另一个电压,需要电源控制器调整输出,需要等待电压稳定,也需要确保保护条件成立。PD 协议不希望 Sink 一看到 Accept 就默认新电源已经可用了,所以还需要下一步。

这个设计很像你去店里点餐。店员说“可以做”,只是接受了你的订单;真正能吃,是菜上桌之后。

第四步:PS_RDY 才是“电源准备好了”

当 Source 完成电源状态切换后,会发送 PS_RDY

PS_RDY 可以理解成 Power Supply Ready,也就是电源已经准备好。到这一步,Sink 才能认为新的供电条件可以正式使用。

所以一个更像真实过程的描述应该是:

充电器发菜单 -> 设备点档位 -> 充电器接受 -> 充电器切电源 -> 充电器通知准备完成

这就是为什么我说 USB PD 很谨慎。它不是“设备想要什么,充电器马上切什么”,而是每一步都有确认。尤其是从 5V 进入更高电压时,这种确认就很重要。

如果你用电流表看某些设备,会看到插入后电压并不是一瞬间就到目标档位,而是有一个短暂过程。这个过程背后就可能包含了连接识别、能力发送、请求、接受、电源准备这些动作。肉眼看起来只是数字跳了一下,协议里其实已经走了一套流程。

Explicit Contract:谈妥之后才算正式供电

当 Accept 和 PS_RDY 都完成之后,双方会进入一个叫 Explicit Contract 的状态。

这个词可以叫“显式供电合同”。听起来有点官方,但意思并不玄。它就是 Source 和 Sink 都明确知道:这一轮我们按哪个供电条件来。

比如设备请求了某个 20V 档位,Source 接受并准备完成,那么双方就按这个条件工作。这里仍然可以用 $P=U \times I$ 去理解功率,但重点不在公式,而在“双方都同意了这个状态”。

这个合同不是永久的。后面如果设备温度升高、电池进入快充后段、多口充电器重新分配功率,或者系统策略发生变化,都可能触发新的协商。也就是说,PD 不是开关,而是一段会根据状态变化调整的关系。

这也是很多人用电流表观察快充时会觉得奇怪的地方:刚插上去功率很高,过一会儿又降下来;多插一个设备,原来的设备功率也变了。这些现象不一定是异常,它们可能只是新的供电合同替换了旧的供电合同。

这一章和第三章的分工

第三章解决的是“为什么有些线只能到某个电流上限”。那一章更关注线材、电流能力、E-marker、高功率边界。

第四章解决的是另一件事:在这些边界之内,设备和充电器如何决定具体用哪个档位。

所以如果第三章是在讲“路最多能承受多宽”,第四章就是在讲“车要不要走这条路、走哪一档速度、什么时候换档”。

线材能力当然会影响最终结果,但它在这一章只作为前提存在。真正要理解的主角,是 PD 消息协商。

用电流表看这一章,应该看什么

如果你手里有维简 K2 这类 USB-C 电流表,这一章可以对应到几个现象。

第一,看电压有没有从基础状态跳到更高档位。比如插上后先是 5V,随后进入 9V、15V 或 20V,这通常说明设备和充电器完成了某种协商。

第二,看电压变化之后电流是否稳定。只看电压不够,因为功率还要乘电流。比如同样是 20V,不同电流下的最终功率会差很多。

第三,看插拔、换设备、换充电器时,协商结果是否变化。如果同一台设备在不同充电器上请求到的档位不同,那可能是 Source_Capabilities 不同;如果同一只充电器给不同设备结果不同,那多半是 Sink 的请求不同。

不过也要记住,普通电流表看到的是结果,不一定能显示每一条 PD 消息。它能帮你看到“协商之后变成什么样”,但不一定能完整告诉你“中间每一步消息怎么走”。如果要看完整 PD 消息,需要协议分析工具。

常见误区

充电器标多少瓦,设备就会吃多少瓦吗?

不会。充电器标称的是能力上限,设备请求的是自己当前想要的档位。Source 提供菜单,Sink 点菜,不是 Source 强行把最大功率塞给 Sink。

看到 20V 就代表满血快充吗?

不代表。20V 只是电压,功率还要看电流。比如 $20\text{V}\times1\text{A}=20\text{W}$,而 $20\text{V}\times3\text{A}=60\text{W}$。它们都是 20V,但完全不是一个功率等级。

Request 之后是不是马上就切电压?

不是。Request 之后,Source 还要回复 Accept,然后完成电源切换,最后发送 PS_RDY。对 Sink 来说,PS_RDY 才是“电源准备好了”的信号。

为什么功率会中途变化?

因为供电合同可以重新协商。电量、温度、系统策略、多口功率分配,都可能让设备重新请求一个更合适的档位。

写在最后

这一章真正想讲清楚的是:USB PD 快充不是一个单向输出过程,而是一套有来有回的协商流程。

充电器先告诉设备自己能提供什么,设备再选择自己需要什么,充电器确认并完成电源切换,最后双方进入一个明确的供电合同。理解了这一点,再看手机为什么吃不满标称功率、笔记本为什么功率会变化、多口充电器为什么会重新分配功率,就不会只从“充电器够不够强”这一个角度去想了。

下一章就可以继续拆“菜单”本身。也就是 USB PD 里的 PDO、RDO、APDO 和 PPS。到那一章,我们再具体看:Source_Capabilities 里的每个档位到底长什么样,Sink 的 Request 又是如何表达“我要这个档位”的。

系列相关阅读