第1章:USB PD协议简介——从0到240W的进化之路

各位工程师朋友们,欢迎来到《PD协商失败常见原因与排查案例》的第一章。我是你们这门课的老朋友,在嵌入式电源领域摸爬滚打了十来年,踩过的坑、烧过的板子,凑起来能摆满一整个实验台。

今天咱们先不急着上手排查故障,得先把地基打牢。USB PD(Power Delivery)协议,到底是个什么玩意儿?它怎么发展来的?Source和Sink之间又是怎么“讨价还价”的?这些搞不明白,后面排查问题就像在黑夜里找开关,全靠瞎摸。

1.1 协议发展历程:从5V到48V的飞跃

最早期的USB,大家都熟——5V,500mA,总共2.5W。给手机充个电都得等半天。后来有了USB BC 1.2,能到1.5A,但还是不够塞牙缝的。

真正的转折点,是USB Type-C接口的出现。这玩意儿不光能正反插,还藏着一条CC(Configuration Channel)线。这条CC线,就是PD协议进行通讯的“电话线”。

版本 发布时间 最大功率 核心变化
USB PD 1.0 2012年 100W (20V/5A) 首次引入PD协商概念,基于BMC编码
USB PD 2.0 2014年 100W (20V/5A) 全面拥抱Type-C接口,明确定义PDO和RDO
USB PD 3.0 2015年 100W (20V/5A) 加入快速角色交换、固件更新等高级功能
USB PD 3.1 2021年 240W (48V/5A) 扩展功率范围(EPR),引入AVS和SPR

核心要点:我个人的习惯是,拿到一个新项目,先看它支持的PD版本。如果是PD 3.1的项目,千万别拿PD 2.0的协议分析仪去抓包,有些字段格式不一样,你会怀疑人生的。

1.2 功率协商基本流程:Source与Sink的“讨价还价”

PD协议里的角色分配挺有意思。提供电力的叫Source(源端),比如充电器、移动电源;消耗电力的叫Sink(接收端),比如手机、笔记本电脑。

协商流程,说白了就是Sink告诉Source:“老哥,我现在功率不够了,能不能给我升级到20V 3A?”Source看看自己的家底,行或者不行,回个信儿。

标准的协商流程分四步走:

  1. 连接检测:Type-C插上,Source通过CC引脚上的Rp电阻检测到Sink的Rd下拉。这标志着物理连接建立了。
  2. 能力宣告:Source通过CC线,主动发出一包Source_Capabilities消息。这包消息里列出了它支持的所有电压电流组合——也就是我们后面要重点讲的PDO。
  3. 请求与接受:Sink收到Source_Capabilities后,在里面挑一个最合适的组合(比如想要9V 2A),发回一个Request消息给Source。Source觉得没问题,就回一个Accept。这就是RDO(Request Data Object)发挥作用的地方。
  4. 功率切换:Source确认协商成功后,会在CC线上发一个PS_RDY(Power Supply Ready)信号,然后把VBUS的电压从默认的5V切换到协商好的电压上。Sink检测到电压稳定后,开始拉载。

小提示:我建议你记住一个数字——协商超时时间。规范里规定,整个协商过程必须在几十毫秒内完成。如果你发现设备反复重启或者充电断断续续,大概率是协商超时了。后来的章节我们会专门讲这个。

1.3 PDO与RDO:电压电流的“菜单”和“点菜”

这两个概念是PD协议里的基石,必须吃透。

  • PDO(Power Data Object):这是Source端提供的一份“菜单”。每一行PDO就是一个电压电流组合。比如固定PDO写着“5V/3A”,可编程PDO写着“3.3V~21V/5A”。Source可以一次性广播多个PDO,让Sink去选。
  • RDO(Request Data Object):这是Sink端下的一份“订单”。Sink拿到菜单后,从中挑选一个PDO,然后填入自己实际想要的电压(如果是PPS还可以微调)和最大电流。RDO的结构比PDO复杂,因为它包含了Operating Current(运行电流)和Max Current(最大电流)两个参数。

为什么要有两个电流参数?你想想看,一个笔记本待机时可能只需要1A,但开始编译代码时瞬间需要3A。Sink在RDO里告诉Source:我现在最多用到3A,但正常情况下只要1A。Source就可以据此更好地分配总线资源。

数据对象 发送方 作用 关键字段
PDO Source 宣告支持的能力 电压、电流、类型(固定/PPS/AVS)
RDO Sink 请求特定的功率配置 PDO位置、运行电流、最大电流、解锁位

我曾经踩过一个坑:有一次我设计的Sink设备,在RDO里把Operating Current写成了0。结果Source一看,认为你这个设备不需要功率,直接拒绝协商,维持5V默认电压。你以为它会容错处理吗?不,协议栈是严格按规范来的。所以千万注意,RDO里的电流值必须合理。

1.4 本章知识体系总览

下面这张图,是PD协议协商的“骨架”。你可以把它存下来,每次分析问题时拿出来对照。

USB PD 功率协商知识体系图 协议发展历程 1.0 → 2.0 → 3.0 → 3.1 核心角色 Source (供电) vs Sink (受电) 数据对象 PDO(菜单) + RDO(订单) 功率协商基本流程 连接→能力→请求→切换 ① 连接检测 CC线检测Rp/Rd ② 能力宣告 Source_Capabilities ③ 请求与接受 Request → Accept ④ 功率切换 PS_RDY → VBUS切换 实战要点 版本兼容性 · 协商超时 · CC线质量 · PDO/RDO解析 核心目标:理解USB PD的通信骨架,为故障排查打下基础 掌握每一层的作用和约束,才能快速定位协商失败点在哪儿

1.5 为什么这一章对排查问题如此重要?

说句实在话,我见过太多工程师买了个几千块的协议分析仪,把CC线上的波形抓下来,看着满屏的16进制数据发愣。为什么?因为他们不知道Source_Capabilities消息里,第2个PDO的位域到底代表什么电压。

只有把协议的发展脉络、角色分工、数据对象格式搞清楚了,你才能在分析失败案例时,一眼看出是Source发的PDO不合理,还是Sink的RDO参数越界了。后面29章的所有案例,都是建在这个基础之上的。

个人经验:我自己做调试时,习惯先把Source_Capabilities消息里的PDO个数和电压值写下来。如果实际示波器上VBUS的电压跟Sink请求的不一致,那问题大概率出在Source的固件逻辑上,而不是硬件上。这个小技巧,帮你省一半的排查时间。

好了,这一章我们就先聊到这儿。你得记住PDO是菜单,RDO是订单,协商是四步走。脑子里有这个框架,后面再遇到握手失败、电源反复跳动、协议栈卡死等问题,你就有方向了。