2. CC引脚与角色定义:CC1/CC2引脚功能、Source/Sink/DRP角色、Rp/Rd电阻详解
好,咱们今天聊聊Type-C接口里最核心、也最容易让人迷糊的部分——CC引脚。说实话,我刚接触Type-C那会儿,也被CC1、CC2搞得晕头转向。但搞明白这个,你才算真正入了Type-C的门。
2.1 CC引脚到底是干嘛的?
CC引脚,全称是Configuration Channel,配置通道。它不传数据,也不传大功率电源。它的任务很纯粹:让两个设备互相认识一下。
你想想看,两个Type-C设备插在一起,谁是供电的?谁是受电的?要不要升压到20V?要不要进Alternate Mode?这些决策,全靠CC引脚上的那点小信号来完成。
Type-C接口有24个引脚,其中CC1和CC2是两个独立的配置通道引脚。但有意思的是,一根线缆里只连了一根CC线。为什么?我后面会讲。
2.2 Source、Sink、DRP——三种角色
Type-C世界里,设备分三种角色:
- Source(源端):提供电力的那一方。说白了就是充电器、充电宝、带供电的笔记本。
- Sink(接收端):消耗电力的那一方。手机、耳机、小风扇,都是Sink。
- DRP(双角色端口):既能当Source又能当Sink。比如现在的笔记本,插上充电器它是Sink,拔掉充电器插个手机,它又变成Source给手机充电。
我记得第一次做DRP设计时,没处理好角色切换的时序,结果设备插上后反复握手,就是切不过去。后来查了协议才发现,DRP的切换周期有严格规定,不能太快也不能太慢。
2.3 Rp和Rd电阻——身份的象征
设备怎么告诉对方自己是什么角色?靠电阻。
简单说:
- Source设备:在CC引脚上拉一个电阻到Vbus,这个电阻叫Rp。
- Sink设备:在CC引脚下拉一个电阻到GND,这个电阻叫Rd。
当两个设备插在一起,Source的Rp和Sink的Rd就形成了一个分压电路。Source通过检测CC引脚上的电压,就能知道对面是个Sink,而且还能判断出这个Sink想要多大电流。
这里有个关键点:Rp的阻值决定了Source能提供的电流能力。
| Rp阻值 | 对应电流能力 | 典型应用 |
|---|---|---|
| 10kΩ(或56kΩ) | 默认USB电流(500mA/900mA) | 普通USB口 |
| 22kΩ | 1.5A | 中速充电 |
| 4.7kΩ(或10kΩ) | 3A | 快充 |
嗯,这里要注意:不同版本的Type-C规范对Rp阻值的定义略有差异。我建议你以最新的USB-IF规范为准,别拿几年前的老资料来套。
2.4 CC1和CC2——为什么需要两根?
Type-C接口是正反可插的。你插的时候,可能正着插,也可能反着插。CC1和CC2就是为了解决这个问题的。
线缆内部其实只连了一根CC线。当你正着插时,CC1连上了;反着插时,CC2连上了。设备通过检测哪根CC引脚上有电压,就能判断出当前是正插还是反插。
我曾经遇到过一个坑:有个客户设计的Type-C母座,CC1和CC2的走线长度差了太多,导致信号延迟不一致。虽然CC引脚本身不跑高速,但电阻检测的精度受到了影响。从那以后,我要求团队做Type-C设计时,CC1和CC2的走线长度差控制在5mm以内。
2.5 实际设计中的避坑指南
⚠️ 常见错误:
- 把Rp和Rd的阻值搞反了。Source用Rd,Sink用Rp——这是新手最容易犯的错。
- CC引脚上加了太大的滤波电容。电容太大会让电压建立变慢,导致设备识别超时。
- 忽略了CC引脚的ESD保护。Type-C接口经常热插拔,不加ESD保护,芯片很容易被打坏。
💡 我的个人习惯:
做原理图时,我会在CC1和CC2引脚旁边各放一个测试点。调试时用示波器看CC引脚的电压波形,一眼就能看出设备角色识别正不正常。Source端的CC电压应该在0.4V到1.6V之间(取决于Rp和Rd的比值),如果电压不对,先检查电阻值。
2.6 代码示例:如何用MCU检测CC状态
如果你用MCU来做Type-C的CC检测,代码其实不复杂。下面是一个简化的示例:
// 伪代码:检测CC引脚状态
#define CC1_PIN GPIO_PIN_0
#define CC2_PIN GPIO_PIN_1
typedef enum {
ROLE_UNKNOWN,
ROLE_SOURCE,
ROLE_SINK,
ROLE_DRP
} cc_role_t;
cc_role_t detect_cc_role(void) {
uint16_t cc1_voltage = read_adc(CC1_PIN);
uint16_t cc2_voltage = read_adc(CC2_PIN);
// 如果CC1或CC2上有电压,说明对面是Sink
if (cc1_voltage > 200) { // 0.2V以上
return ROLE_SOURCE; // 我是Source
}
// 如果CC1或CC2接地,说明对面是Source
if (cc1_voltage < 50) { // 接近0V
return ROLE_SINK; // 我是Sink
}
// 两边都没检测到,可能是DRP
return ROLE_DRP;
}
实际项目中,你还需要处理去抖、超时、角色切换等逻辑。但核心思路就是这个——通过检测CC引脚电压来判断角色。
2.7 小结
CC引脚是Type-C的"握手通道"。Source通过Rp告诉对方"我能给电",Sink通过Rd告诉对方"我要吃电"。DRP则两边都试试,看对面是什么角色。
搞懂了CC引脚,你就掌握了Type-C的基础。下一章我们会聊PD协议,那才是真正的大功率快充的核心。到时候你会发现,CC引脚上的那点电压变化,背后藏着更复杂的通信协议。
嗯,今天就到这儿。如果你在CC引脚设计上遇到过什么奇葩问题,欢迎来交流。我微信是deep3321,公众号"蓝海资料掘金营"上也会定期分享一些实战经验。