2. USB Type-C引脚定义与CC逻辑

Type-C 这个接口,表面看就那么 24 个引脚,对称得让人舒服。但真正决定它“智能”的,反而是那两根不起眼的 CC 引脚。我在做第一个 Type-C 项目时,就天真地以为 CC 只是用来检测正反插的——直到设备死活无法握手,才老老实实去啃协议细节。

这一节,咱们就掰开揉碎,把 CC1/CC2 到底干什么、电阻怎么配置、Detect 检测和 Orientation 判断怎么实现的,讲透彻。

2.1 Type-C 引脚全貌

先看一眼这 24 个引脚的布局。虽然课程重点是 CC,但引脚整体规划得清楚,不然调试时对着 PCB 飞线都找不到位置。

引脚编号信号名功能简述
A1, B1, A12, B12GND地
A4, A9, B4, B9VBUS总线电源 (默认 5V,协商后可升压)
A2, A3, B2, B3Dp / DnUSB 2.0 差分对
A6, A7, B6, B7TXp / TXn, RXp / RXnSuperSpeed 差分对(正反交叉)
A5CC1配置通道 1
B5CC2配置通道 2
A8, B8SBU1, SBU2边带使用(音频、调试等)

注意 CC1 和 CC2 分别位于 A5 和 B5,物理上对称——这就是正反插检测的硬件基础。插进去时,只有一组 CC 会连到对端;另一组悬空。嗯,这就是后面要说的的核心机制。

2.2 CC1 / CC2 引脚功能——不只是检测方向

很多人以为 CC 引脚就是一根电平线,拉高或拉低表示正反。其实远不止这些。CC 在 Type-C 生态里身兼三职:

  • 检测连接与拔出:通过电平变化判断是否插入
  • 识别正反插(Orientation):哪根 CC 有效,就对应哪一面
  • 角色协商的通道:交换 Source/Sink 能力、传输 BMC 编码消息

说白了,CC 就是 Type-C 的“信号员”,插拔握手、供电协商全走这根线。我遇到过新手把 CC 当成普通 GPIO,直接接上拉电阻接到 5V——结果芯片瞬间冒烟。CC 线上有严格的电压窗口,不能乱来。

2.3 电阻配置——Rp 与 Rd

Type-C 协议规定,Source 端(供电方)要在 CC 线上接一个上拉电阻 Rp,Sink 端(受电方)接下拉电阻 Rd。这两个电阻的阻值直接决定了 CC 线上的电压,也间接告诉对端自己的电流能力。

电阻值不是随便选的,标准定义了三种电流能力对应的 Rp 范围:

Source 电流能力Rp 阻值(上拉至 3.3V)CC 电压范围(未协商时)
默认 USB (500 mA / 900 mA)36 kΩ ± 20%0.25 V ~ 0.60 V
1.5 A12 kΩ ± 5%0.70 V ~ 1.15 V
3.0 A4.7 kΩ ± 5%1.65 V ~ 2.45 V

而 Sink 端的 Rd 是固定 5.1 kΩ ± 10%,下拉到 GND。原理很简单:Source 的 Rp 和 Sink 的 Rd 组成分压器,Source 通过测量 CC 电压就知道自己连接的是什么类型的 Sink(还是空载)。

关键电压阈值:Source 判断连接状态时,通常设定 VRa = 0.2 V 作为最低检测阈值,低于此则认为未连接。

实际项目中,我调试过一批样品,发现 CC 电压总是偏高一两百毫伏,导致 Source 误判电流能力——最后查出是 PCB 走线太长引入的压降补偿,校准后就好了。所以建议大家在 CC 检测点附近放一个测试点,方便用示波器抓真实电压。

2.4 Detect 检测——如何判断连接与拔出

Detect 的过程是一个纯硬件电平检测+定时器配合的机制。拿 Source 端举例:

  1. Source 定期(约每 10 ms)对 CC1 和 CC2 注入一个短脉冲电流,测量引脚电压。
  2. 如果某引脚电压落在 0.25 V ~ 2.45 V 之间,且连续监测到一段稳定时间(通常 100 ms 以上),就认为 Sink 已连接。
  3. 如果电压突然掉到 0.2 V 以下,则认为拔出。

Sink 端的检测更简单:它持续监测 CC 线电平。如果从低电平跳到某个电压值(对应 Source 的 Rp 分压),就认为有 Source 接入。

个人经验:我最开始用 MCU 的 ADC 直接读 CC 电压,发现噪声很大,容易误触发。后来加了 10 μF 电容滤波 + 软件均值采样,才稳定下来。记住,Type-C 的连接检测对噪声敏感,硬件滤波不能省。

2.5 Orientation 检测——正反插识别

正反插检测依赖两个 CC 引脚中只有一个会被连接。因为 Type-C 插头是对称的,插入后插头内部的 CC1 会连接到插座 A5 或 B5 中的一个,另一个悬空。Source 同时检测两个引脚,哪一根电压有效,就确定是哪一面。

举个具体例子:

  • 假设插头插入后,插座的 CC1(A5)检测到有效电压(0.25 V ~ 2.45 V),而 CC2(B5)电压接近 0 → 判断为 正面插入(Normal)。
  • 反过来,CC2 有电压、CC1 为 0 → 反面插入(Flip)。

逻辑简单,但注意:两个引脚都有电压怎么办?要么是双角色设备(DRP),要么是异常状态。正常情况不会出现同时有效。

特别提醒:如果 Source 和 Sink 都使用了双角色(DRP),它们会以交替的周期在 Source 和 Sink 模式间切换。此时两个 CC 引脚上可能同时存在 Rp 和 Rd,但协议通过时序错开避免冲突。调试 DRP 项目时,我经常用逻辑分析仪抓 CC 线上的 BMC 信号来确认角色切换是否正常。

2.6 核心逻辑流程图

下面这张图把 CC 引脚的检测、方向识别、电流能力判断串在一起,方便理解整体流程。

CC 引脚检测与 Orientation 判断流程 Source 上电 采样 CC1 和 CC2 电压 任一引脚电压 0.25~2.45V ? 是 判断 CC1/CC2 有效 设置 Orientation + 电流能力 等待 PD 协商 否(未连接) 进入低功耗轮询

流程并不复杂,但每一步的时序和抗抖处理才是坑。我曾经在量产阶段遇到某个批次充电器无法识别手机,查了两天才发现是 Source 端定时器偏差导致检测窗口偏移。最后改用硬件比较器 + 固定 120 ms 防抖,问题解决。

2.7 实际调试中的几个建议

  • 用示波器看 CC 波形:别只依赖万用表。插拔瞬间 CC 电压的瞬态能暴露很多问题,比如接触不良、电阻电容不匹配。
  • 注意 CC 线上的噪声:Type-C 线缆中的高速信号可能会串扰到 CC 上。我有一次排查发现手机在播放视频时偶发断连,最终在 CC 线上加了 100 pF 电容才抑制住。
  • 验证 Rd 精度:Sink 的 Rd 电阻要选 ±1% 精度的,用 ±5% 的可能会让 CC 电压落在检测盲区。

避坑指南:我曾经用了一个便宜的 Type-C 插座,内部 CC 引脚到 PCB 的寄生电容太大,导致 Source 的脉冲检测无法正确读取电平——换了更高质量品牌插座就好了。不要小看机械零件的电气特性。