第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看看自己的家底,行或者不行,回个信儿。
标准的协商流程分四步走:
- 连接检测:Type-C插上,Source通过CC引脚上的Rp电阻检测到Sink的Rd下拉。这标志着物理连接建立了。
- 能力宣告:Source通过CC线,主动发出一包Source_Capabilities消息。这包消息里列出了它支持的所有电压电流组合——也就是我们后面要重点讲的PDO。
- 请求与接受:Sink收到Source_Capabilities后,在里面挑一个最合适的组合(比如想要9V 2A),发回一个Request消息给Source。Source觉得没问题,就回一个Accept。这就是RDO(Request Data Object)发挥作用的地方。
- 功率切换: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协议协商的“骨架”。你可以把它存下来,每次分析问题时拿出来对照。
1.5 为什么这一章对排查问题如此重要?
说句实在话,我见过太多工程师买了个几千块的协议分析仪,把CC线上的波形抓下来,看着满屏的16进制数据发愣。为什么?因为他们不知道Source_Capabilities消息里,第2个PDO的位域到底代表什么电压。
只有把协议的发展脉络、角色分工、数据对象格式搞清楚了,你才能在分析失败案例时,一眼看出是Source发的PDO不合理,还是Sink的RDO参数越界了。后面29章的所有案例,都是建在这个基础之上的。
个人经验:我自己做调试时,习惯先把Source_Capabilities消息里的PDO个数和电压值写下来。如果实际示波器上VBUS的电压跟Sink请求的不一致,那问题大概率出在Source的固件逻辑上,而不是硬件上。这个小技巧,帮你省一半的排查时间。
好了,这一章我们就先聊到这儿。你得记住PDO是菜单,RDO是订单,协商是四步走。脑子里有这个框架,后面再遇到握手失败、电源反复跳动、协议栈卡死等问题,你就有方向了。