3. 基本源/宿角色定义与识别

说到Type-C PD协议,最基础的问题就是,谁供电、谁用电。说白了,这就是源和宿的区别。我在项目中见过不少新人把这两个角色搞混,结果调试时怎么都测不到VBUS——原来压根就没搞清楚谁是供电方。

先下个定义:

  • 源(Source)——提供VBUS的端口,典型如充电器、笔记本或充电宝。
  • 宿(Sink)——消耗VBUS的端口,比如手机、鼠标或者一个开发板。

3.1 角色怎么定下来的?

Type-C连接器上有两路CC(Configuration Channel)线:CC1和CC2。每根CC线上挂的上拉或下拉电阻,直接决定了设备声明自己是Source还是Sink。嗯,这就是硬件层面的角色标识,不需要先跑协议。

具体规则其实很简单:

  • Source端在CC线上放一个上拉电阻Rp(典型值4.7kΩ或36kΩ,取决于电流能力)。
  • Sink端在CC线上放一个下拉电阻Rd(典型值5.1kΩ)。

插入时,CC线被拉低到某个电平,双方通过检测CC电压判断对方角色。我记得第一次看Spec里这张表时还觉得绕,后来用手边的电阻分压算了几次就清楚了。

角色CC线上电阻检测到的CC电压范围(典型)VBUS状态
SourceRp上拉约0.2 ~ 1.6 V(取决于Rd/Rp分压)提供5V
SinkRd下拉约1.6 ~ 2.4 V(当另一侧为Source时)等待VBUS
DRP(双角色)交替切换Rp/Rd周期变化根据对手角色决定

小经验:调试时用示波器看CC线上的电压最直观。Source端电压一般稳定在0.4V左右(针对5V 3A能力);如果电压接近0V,很可能是线缆坏了或Rd没焊上。

3.2 角色识别流程

从物理连接到角色确定,走了这几步:

  1. 连接检测——Source检测CC线是否被Rd拉到某个电平(通过电压比较器)。
  2. 电流能力声明——Source根据Rp值,告诉Sink它最多能提供多少电流(0.5A / 1.5A / 3A)。
  3. Sink响应——Sink读取CC电压,知道自己连上了Source,并开始拉VBUS(通过内部负载开关)。
  4. VBUS建立——Source打开VBUS开关,输出5V。此时Sink获得供电,可以启动MCU。
  5. PD协商(可选)——如果双方都支持PD,则通过CC线开始发一个个PD消息,协商更高的电压和电流。

我用一个流程图把这几个步骤串起来,大家对着看更清楚。

角色识别流程(Source 视角) 连接插入 CC线检测(电压?) 判断:对手是Sink? 开启VBUS(5V) PD协商(可选) CC电压 < 0.2V → 无设备 CC电压 0.2~1.6V → 有Sink 若对手也是Source → 不提供VBUS 通过CC线协商PDO

关键点:Source 角色不是自己“选”的,而是由硬件电阻固定死的。但DRP(双角色端口)可以周期切换Rp/Rd,插入时根据对手角色动态决定自己是source还是sink。我调试DRP时最怕遇到两边都是DRP且切换相位刚好相反——握手会失败,CC线上出现乱七八糟的波形。

3.3 避坑指南:角色识别中的常见陷阱

先说说我踩过的坑。以前做一款Type-C充电器,焊好板子上电死活没输出。量CC1对地电压,0V。又量CC2,也是0V。当时就懵了——明明我焊了Rp上拉到3.3V啊。

后来发现,芯片内部自带上拉电阻,我又在外部额外加了一个,两个并联后阻值太小,CC电压被拉到了0V以下(其实是保护二极管导通了)。嗯,教训就是:选Source端芯片时,先确认内部是否有Rp,别重复加。

其他典型问题:

  • Rd焊错阻值——Sink端要求5.1kΩ,你用了4.7kΩ,Source检测到的CC电压会偏高,可能误判为“电缆标记(eMarker)”或直接拒绝供应VBUS。
  • CC线序反接——Type-C插头正反插都可,但CC1和CC2是对称的。如果Sink只在一路CC上放了Rd,另一路悬空,有些Source会兼容,有些则会超时重试导致启动慢。
  • VBUS先于CC稳定——这是违反Spec的行为。我见过一些山寨充电器,插入后VBUS瞬间就上来了,根本没等CC检测完。结果接上PD设备后直接烧坏对方的eMarker。强烈建议:VBUS上电必须晚于CC稳定至少10ms。

严重警告:在做Source设计时,千万不要把CC线直接接到MCU的GPIO就完事。CC线上的电压可能达到5V或更高(PD协商时),而MCU的IO口往往只有3.3V耐压。一定要加电平转换或专用CC逻辑芯片。我曾经帮客户改过一块板,就是GPIO直连,烧了三次MCU才发现问题。

3.4 如何在调试中快速验证角色

手头没有专用分析仪?没关系。拿一个万用表或示波器,测三根线就够了:

  1. CC1对GND——电压接近0.4V → 这端是Source,且对方接了Rd;电压接近1.6~2.4V → 这端是Sink,对方是Source。
  2. VBUS对GND——如果量到5V,说明角色已经确立、VBUS已建立。
  3. VBUS对CC1——如果VBUS有5V而CC1只有0.4V,说明这是个标准Source;如果VBUS有5V而CC1有3.3V或1.8V,说明这里可能有个eMarker或PD芯片在拉着。

为什么CC电压不是固定的?说白了你量到的就是Rp和Rd的分压。举例:Source的Rp=4.7kΩ上拉到3.3V,Sink的Rd=5.1kΩ下拉到GND,那么CC线上的电压就是 3.3V × 5.1kΩ/(4.7kΩ+5.1kΩ) ≈ 1.73V。用这个数去反查,就能知道电阻值对不对。

个人习惯:设计一款新板子时,我会先在原理图上把CC检测电压的计算公式写出来,然后打样回来第一件事就是用万用表验证这个电压。如果差了超过10%,一定回头查电阻或上拉电源。

3.5 角色识别与PD协议的关系

硬件角色识别成功之后,PD协议才开始介入。简单说:

  • Source先是输出5V,然后通过CC线发送“Source Capabilities”消息,告诉Sink自己能提供哪些电压电流组合(PDO)。
  • Sink收到后,可以选择接受默认5V,也可以请求一个更高电压的PDO。

但这一切的前提是——角色已经确认过了。如果Source没检测到Rd,它根本不会打开VBUS,更不会发任何PD消息。所以,每次调试PD不通时,我永远先查CC电阻和电压,而不是一上来就去翻PD报文。

嗯,这部分就讲这些。记住一句话:角色识别是硬件层的,PD协商是软件层的;硬件没握手,软件再折腾也没用。