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 输出的拓展坞
我曾经踩过的坑: 第一次画 Source 的 CC 线时,以为只要把 Rd 下拉电阻焊上去就行。结果插上 Sink 后,CC 电压死活不到 0.4V。查了三天发现是电阻焊错了封装——明明是 5.1kΩ,我用了 51kΩ。Source 的 CC 线路上必须接 5.1kΩ 下拉电阻 Rd,这个值错不得。

4.2 Sink:受电方

Sink 是接收电源的一方。它通过 CC 线表达自己需要多少电压和电流,但绝不主动送电。

  • 电压请求:通过 PD 协议发送 “Request” 报文
  • 最大拉取:取决于 Source 能提供的功率,Sink 只能向下兼容
  • 典型设备:手机、笔记本、手持仪器、无人机
我建议: 设计 Sink 时,一定要做好“死电池”启动。如果电池完全没电,CC 检测电路可能先靠 VBUS 的残电启动。我有个项目就因为没加 VBUS 欠压锁定,插上 Source 后反复重启——Sink 的 CC 逻辑必须在 VBUS 低于 4V 时也能工作。

4.3 DRP:双角色端口

DRP(Dual Role Port) 是“墙头草”。它的 CC 线会在 Source 和 Sink 之间来回切换,谁先被对方识别就固定角色。

  • 角色切换:初始时每 50~100ms 切换一次,直到建立连接
  • DRP 数据:通过接入 Type-C 连接线,实际角色由 CC 线的电压决定
  • 典型设备:支持 PD 的笔记本电脑、带 PD 的显示器、双向充电宝
核心区别一句话: Source 只出不进,Sink 只进不出,DRP 既进又出但同一时刻只能扮演一个角色。

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。

USB Type-C 电源角色切换流程 未连接 CC 线检测 固定 Source 固定 Sink DRP 角色切换 尝试 Source (Rp 上拉) 尝试 Sink (Rd 下拉) 连接建立 ⚠️ 关键点 DRP 切换周期通常 50~100ms 未连接时不断交替 Rp/Rd

4.7 实用建议与避坑清单

  1. 检测 CC 电压:Source 的 CC 引脚电压在 0.4V~1.2V 之间,Sink 的 CC 电压在 0.2V~0.6V。DRP 模式下的 CC 电压会周期性变化,不要用普通 GPIO 直接读,建议用比较器或 ADC。
  2. 注意 De-bounce:CC 线上的毛刺可能导致角色误判。我习惯在固件里做 10ms 的去抖滤波。
  3. 死电池检测:Sink 设备如果没电,VBUS 为 0,CC 检测电路可能无法工作。要用低功耗的 CC 逻辑,如 TUSB320 这类芯片自带死电池唤醒。
  4. DRP 的 Try.Source 和 Try.Sink:PD 规范里定义了 Try.Source 偏好和 Try.Sink 偏好。比如笔记本电脑常用 Try.Source,让它在连接手机时优先当 Source,避免手机反充笔记本。
我曾经踩过的另一个坑: 在一个双角色充电宝项目里,我把 DRP 的 Rp 电阻选成了 10kΩ(本应是 5.1kΩ)。结果插到笔记本上,笔记本死活识别成 Sink,导致充电宝反充笔记本。后来才发现 Rp 的值决定了 Source 的电流能力标识,也影响 CC 电压。5.1kΩ 对应 500mA,10kΩ 会让 CC 电压偏高,误导对方识别。

明白了这三种角色,再看 PD 协议里的电源协商、角色切换、PR_Swap、DR_Swap 这些概念就简单多了。做实际项目时,我建议你先搞清楚设备是固定角色还是 DRP,再选对应的 CC 管理芯片。如果做 DRP,一定要预留切换失败的重试机制——我至少见过 3 次因为切换死循环导致设备无法充电的事故。