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状态 |
|---|---|---|---|
| Source | Rp上拉 | 约0.2 ~ 1.6 V(取决于Rd/Rp分压) | 提供5V |
| Sink | Rd下拉 | 约1.6 ~ 2.4 V(当另一侧为Source时) | 等待VBUS |
| DRP(双角色) | 交替切换Rp/Rd | 周期变化 | 根据对手角色决定 |
小经验:调试时用示波器看CC线上的电压最直观。Source端电压一般稳定在0.4V左右(针对5V 3A能力);如果电压接近0V,很可能是线缆坏了或Rd没焊上。
3.2 角色识别流程
从物理连接到角色确定,走了这几步:
- 连接检测——Source检测CC线是否被Rd拉到某个电平(通过电压比较器)。
- 电流能力声明——Source根据Rp值,告诉Sink它最多能提供多少电流(0.5A / 1.5A / 3A)。
- Sink响应——Sink读取CC电压,知道自己连上了Source,并开始拉VBUS(通过内部负载开关)。
- VBUS建立——Source打开VBUS开关,输出5V。此时Sink获得供电,可以启动MCU。
- PD协商(可选)——如果双方都支持PD,则通过CC线开始发一个个PD消息,协商更高的电压和电流。
我用一个流程图把这几个步骤串起来,大家对着看更清楚。
关键点: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 如何在调试中快速验证角色
手头没有专用分析仪?没关系。拿一个万用表或示波器,测三根线就够了:
- CC1对GND——电压接近0.4V → 这端是Source,且对方接了Rd;电压接近1.6~2.4V → 这端是Sink,对方是Source。
- VBUS对GND——如果量到5V,说明角色已经确立、VBUS已建立。
- 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协商是软件层的;硬件没握手,软件再折腾也没用。