4. 电源角色定义:Source、Sink、DRP 的概念与典型应用场景
咱们做 USB Type-C PD 设计,第一个要搞明白的就是电源角色。说白了,就是谁给电、谁收电、谁既能给又能收。我当年刚接触 PD 协议时,就被这三个角色搞晕过——以为 Source 就是充电器,Sink 就是手机,结果拿到一个双向充电宝就傻眼了。
4.1 Source:供电方
Source 是提供电压和电流的一方。它永远处于“出力”的角色,对外输出 power。
- 电压输出:从 5V 到 20V(PD 3.0 支持 AVS 可调电压)
- 电流能力:500mA(BC 1.2)到 5A(PD EPR)
- 典型设备:墙充、车充、充电宝、带 PD 输出的拓展坞
4.2 Sink:受电方
Sink 是接收电源的一方。它通过 CC 线表达自己需要多少电压和电流,但绝不主动送电。
- 电压请求:通过 PD 协议发送 “Request” 报文
- 最大拉取:取决于 Source 能提供的功率,Sink 只能向下兼容
- 典型设备:手机、笔记本、手持仪器、无人机
4.3 DRP:双角色端口
DRP(Dual Role Port) 是“墙头草”。它的 CC 线会在 Source 和 Sink 之间来回切换,谁先被对方识别就固定角色。
- 角色切换:初始时每 50~100ms 切换一次,直到建立连接
- DRP 数据:通过接入 Type-C 连接线,实际角色由 CC 线的电压决定
- 典型设备:支持 PD 的笔记本电脑、带 PD 的显示器、双向充电宝
4.4 三种角色的对比表格
| 特性 | Source | Sink | DRP |
|---|---|---|---|
| CC 上拉/下拉 | Rp 上拉电阻 | Rd 下拉电阻 | 交替 Rp 和 Rd |
| 供电方向 | 向外输出 | 向内输入 | 可切换 |
| PD 报文 | 发送 Source_Capabilities | 发送 Request | 根据当前角色决定 |
| 典型应用 | 充电器、车充 | 手机、耳机 | 笔记本、充电宝 |
| 角色固定 | 永久 | 永久 | 动态 |
4.5 典型应用场景
4.5.1 笔记本插充电器
充电器是 Source,笔记本是 Sink。CC 检测到 Rp 和 Rd,建立连接。Source 发送 5V~20V 的电容,Sink 按需请求。笔记本电池充满后,你可能会觉得 Source 该关掉——其实不是,PD 会协商降电压或进入 PPS 来小电流充电。
4.5.2 双向充电宝与手机
充电宝是 DRP。插上手机时,充电宝先当 Source,手机当 Sink。拔掉手机,插到墙充上,充电宝自动切换为 Sink,墙充给充电宝充电。我测试时发现,有的 DRP 芯片切换太慢,导致手机端误判成“没有连接”,所以要注意 DRP 的切换周期不要超过 100ms。
4.5.3 显示器 + 笔记本
显示器是 DRP(因为它既可以从笔记本取电,也可以给笔记本供电)。早期设计里,显示器往往固定为 Sink,导致笔记本无法通过 USB-C 给它供电。现在的 DP Alt Mode 显示器大多支持 DRP,可以智能决定谁供电。
4.6 角色切换流程简图
下面这张 SVG 图帮你理清 DRP 的角色切换流程。当两个 DRP 设备互连时,它们会在 Source/Sink 之间“抢角色”。谁先抢到 Rp 上拉,另一方自动变成 Sink。
4.7 实用建议与避坑清单
- 检测 CC 电压:Source 的 CC 引脚电压在 0.4V~1.2V 之间,Sink 的 CC 电压在 0.2V~0.6V。DRP 模式下的 CC 电压会周期性变化,不要用普通 GPIO 直接读,建议用比较器或 ADC。
- 注意 De-bounce:CC 线上的毛刺可能导致角色误判。我习惯在固件里做 10ms 的去抖滤波。
- 死电池检测:Sink 设备如果没电,VBUS 为 0,CC 检测电路可能无法工作。要用低功耗的 CC 逻辑,如 TUSB320 这类芯片自带死电池唤醒。
- DRP 的 Try.Source 和 Try.Sink:PD 规范里定义了 Try.Source 偏好和 Try.Sink 偏好。比如笔记本电脑常用 Try.Source,让它在连接手机时优先当 Source,避免手机反充笔记本。
明白了这三种角色,再看 PD 协议里的电源协商、角色切换、PR_Swap、DR_Swap 这些概念就简单多了。做实际项目时,我建议你先搞清楚设备是固定角色还是 DRP,再选对应的 CC 管理芯片。如果做 DRP,一定要预留切换失败的重试机制——我至少见过 3 次因为切换死循环导致设备无法充电的事故。