USB Type-C CC逻辑芯片要不要?Rp/Rd与PD协商解析
2026/9/17 4:57:43 网站建设 项目流程

简介:围绕「USB Type-C 设备是否需要 CC 逻辑芯片」这一常见设计疑问,这份技术文档面向硬件工程师、嵌入式开发者及消费电子方案设计人员,系统梳理 DFP、UFP、DRP 三类端口差异,以及 CC 配置通道在连接检测、正反插识别、VBUS 管理与 USB PD 通讯中的作用。内容结合数据走线逻辑模型,分析 USB2.0 与 USB3.0/3.1 场景下 MUX 方向检测和阻抗连续性的取舍,并给出电源适配器、电脑、手机、移动电源、U 盘、耳机等典型设备是否必须配置 CC 逻辑检测与控制芯片的判断依据。资源包内含 1 个 PDF 文件,约 127KB,篇幅精简便于随时查阅。目前已有 2868 人学习,适合在 Type-C 接口方案选型、原理图评审与供电设计时对照参考,快速厘清何时必须加 CC 芯片、何时可以简化省略。

1. 手头这块 Type-C 板子到底要不要 CC 逻辑芯片

先给结论:需要的不是"芯片"这个形态,而是 CC 引脚上必须存在正确的端接电阻,以及必要的角色协商能力。只做受电、只吃 5V 的设备,两颗 5.1kΩ 下拉电阻就能替掉 CC 逻辑芯片;一旦涉及对外供电、超过 3A 的电流、高于 5V 的电压、DisplayPort 这类 Alternate Mode,或者要做双角色电源(DRP),就必须有能主动驱动 CC 电平、收发 BMC 报文的控制器。实际项目里最容易翻车的是中间地带:板子上焊了 Type-C 座子,CC 只接一颗电阻,插某些线缆能用、换个方向就断电,或者明明插的是 65W 充电器却只能拿到 5V。下面按角色判断、电阻方案、芯片方案、实测排错四段,把 USB Type-C 与 CC 逻辑芯片的关系拆开讲。

2. CC 引脚上的 Rp/Rd 分压:Type-C 角色检测的电气原理

2.1 CC1、CC2 与方向检测:座子上那两根线在干什么

Type-C 是 24 针双面对称连接器,CC1 在 A5 位,CC2 在 B5 位,线缆内部只有一根 CC 走线连通,另一根在插头方向确定后会被复用为 VCONN,给线缆里的 e-marker 芯片供电。这就是"正反插都能用"的物理基础:Source 端同时监测 CC1 和 CC2,哪一根上检测到下拉,就说明插头是哪个方向,进而决定 SuperSpeed 差分对走哪一组通道。

注意,方向检测这件事只对 USB 3.x/4 的高速对有意义,USB 2.0 的 D+/D- 在座子上是双面并联的,不依赖方向判断。但受电设备仍然必须在 CC1 和 CC2 上各放一颗 Rd,因为插头朝哪一面是不确定的。很多廉价扩展坞"反插不识别"的根因就在这里:设计者以为一颗 5.1kΩ 接在 CC 上就够,实际上只有一半概率能碰上。

在没有 USB PD 的时代,CC 上做的全部事情就是模拟分压:Source 用 Rp 把 CC 拉高,Sink 用 Rd 把 CC 拉低,两端连上以后 CC 线上出现一个静态电压,双方各自读这个电压来判断对方是什么角色、能给/要多少电流。这是一个纯直流、纯电阻的协商过程,没有任何数字通信,也正因如此,纯 Sink 设备不需要逻辑芯片。

2.2 Rp 三档与 vRd 检测窗口:Default、1.5A、3A 是怎么被读出来的

Source 端的 Rp 不是一个固定值,而是按能提供的电流分三档。Sink 端固定用 5.1kΩ(规范要求 ±10% 容差),所以 Sink 读到的电压完全由 Source 的 Rp 决定。下表是常见的对应关系,实际阈值以 USB Type-C 规范为准,这里给的是工程上通用的窗口。

Source 能力档位Rp 阻值CC 上拉电源Sink 端 vRd 典型窗口Sink 可吸取电流
Default USB56kΩ3.3V 或 5V0.25V ~ 0.61V500mA(USB 2.0)/ 900mA(USB 3.x)
1.5A @ 5V22kΩ3.3V 或 5V0.61V ~ 1.23V1.5A
3.0A @ 5V10kΩ3.3V 或 5V1.23V ~ 2.04V3.0A
e-marker 线缆Ra ≈ 1kΩ0.15V ~ 0.25V请求 VCONN,不代表受电

Sink 芯片(或者 Source 内部比较器)就是拿 CC 上测到的电压去比这几个窗口。窗口之外还有两个边界:低于 0.15V 左右视为未连接或无效,高于 2.04V 视为异常,通常按 Default 保守处理或者直接拒绝供电。

用 Python 把名义分压算一遍,能直观看出每个档位落在哪:

# 计算 Source 用不同 Rp 时,Sink 端 Rd 上分到的电压 vRd VDD_SRC = 5.0 # Source 内部 CC 上拉电源,规范允许 4.75V~5.5V,也有设计用 3.3V RD = 5.1e3 # Sink 端下拉电阻,标准值 5.1kΩ ±10% # Source 三档 Rp 与对应的 Sink 检测窗口(单位 V) RP_TABLE = { "Default USB": (56e3, 0.25, 0.61), "1.5A @ 5V": (22e3, 0.61, 1.23), "3.0A @ 5V": (10e3, 1.23, 2.04), } for name, (rp, lo, hi) in RP_TABLE.items(): vrd = VDD_SRC * RD / (rp + RD) # 串联分压,Sink 侧看到的电压 hit = lo < vrd < hi # 是否落在该档位的合法窗口内 print(f"{name:12s} Rp={rp/1e3:5.1f}k vRd={vrd:6.3f}V window=({lo},{hi}) hit={hit}")

代码里VDD_SRC * RD / (rp + RD)是标准的分压公式,hit用来判断这一档是否能被正确识别。跑出来会看到:Rp=56k 得到约 0.42V,落在 Default 窗口;Rp=22k 得到约 0.94V,落在 1.5A 窗口;Rp=10k 得到约 1.69V,落在 3A 窗口。三档拉得足够开,所以纯模拟分压的容错其实不错——前提是电阻精度别用错,±5% 的普通贴片电阻就够,用 4.7kΩ 或 10kΩ 当 Rd 则必然误判。

2.3 只做 Sink 要不要 CC 逻辑芯片:三个判断条件

判断顺序可以简单化:

  1. 设备只受电、不对外供电,且最高只要 5V。那么两颗 5.1kΩ 到 GND 即可,不需要 CC 逻辑芯片。
  2. 设备要对外供电(Source)。哪怕只是固定 5V/1.5A 输出,CC 上也必须有 Rp;如果这个输出口还要兼容不同线缆、要报告电流档位,用固定电阻能做,但一旦要支持双角色切换就必须上芯片。
  3. 需要 USB PD,也就是电压超过 5V、电流超过 3A、或者需要 PPS 可调压。此时 CC 上要跑双相标记编码(BMC)的报文,必须有收发器和协议栈,纯电阻彻底无能为力。

这里有个反直觉的点值得强调:Sink 端只有 Rd 时,即使插上 100W 的氮化镓充电器,也只能拿到 5V。原因是 USB PD 的协商由 Sink 主动发起——Sink 要先通过 CC 上的 BMC 发出 Request,Source 才会把电压抬上去。只有 Rd、没有 PD 控制器,Sink 在电气上就是"哑巴",Source 不会主动升压。所以"充电慢"经常不是充电器的问题,而是设备侧根本没有 CC 逻辑芯片。

3. 用两颗 5.1kΩ 电阻替代 CC 逻辑芯片的最小电路与验证

3.1 正确接法与错误接法:CC1/CC2 必须各自独立下拉

正确做法非常朴素:CC1 经一颗 5.1kΩ 到 GND,CC2 经另一颗 5.1kΩ 到 GND,两颗电阻参数完全一致,布局上尽量靠近连接器,走线短而等长。这样无论插头朝哪一面,总有一根 CC 被下拉,Source 能检测到、能判断方向、能给 5V。

错误做法主要有三种,都会在特定条件下失效:

接法现象原因
两颗 CC 共用一颗 5.1kΩ反插不识别,或供电时断时续未连通的那根 CC 被当作 VCONN,共用电阻把 VCONN 拉到 GND
用 10kΩ 或 4.7kΩ 当 Rd插上不供电,或只给极短时间分压落在合法窗口外,Source 判定为无效负载
只在一根 CC 上放电阻约一半概率不工作插头方向不确定,未接的那面没有下拉

第一行是最隐蔽的坑:VCONN 是 Source 主动输出到 CC 上的 5V 左右电源,如果两颗 CC 被一颗电阻连在一起,等于把 VCONN 短路到地,轻则 Source 保护关断,重则烧掉 Source 侧的 CC 驱动。区分"共用一颗"和"各一颗"仅看原理图很容易看漏,务必在 PCB 网表上核一遍。

提示:如果用万用表在断电状态下量 CC 对 GND 的阻值,正确接法应该是 5.1kΩ 左右;如果量出来 2.55kΩ,说明两颗电阻被并联了,那就是共用节点的错误接法。

3.2 用 Python 把 vRd 分压算一遍,确认落在 Source 的检测窗口

电阻选型别只看标称值,容差边界也要算。5.1kΩ 通常用 ±1% 的厚膜电阻,但电源侧 Rp 的误差更大,Source 内部上拉电源本身也有 ±5% 波动。下面这段脚本扫一遍最坏组合,验证设计余量:

# 最坏情况扫描:Rd 容差 ±1%,Source 上拉电源 4.75V~5.5V RD_NOM, RD_TOL = 5.1e3, 0.01 VDD_MIN, VDD_MAX = 4.75, 5.5 def vrd(rp, rd, vdd): return vdd * rd / (rp + rd) for name, (rp, lo, hi) in { "Default USB": (56e3, 0.25, 0.61), "1.5A @ 5V": (22e3, 0.61, 1.23), "3.0A @ 5V": (10e3, 1.23, 2.04)}.items(): rp_min, rp_max = rp * 0.95, rp * 1.05 # Rp 按 ±5% 估算 worst = [] for rd in (RD_NOM * (1 - RD_TOL), RD_NOM * (1 + RD_TOL)): for vdd in (VDD_MIN, VDD_MAX): for r in (rp_min, rp_max): worst.append(vrd(r, rd, vdd)) print(f"{name:12s} vRd range = {min(worst):.3f} ~ {max(worst):.3f} V, " f"in_window={lo < min(worst) and max(worst) < hi}")

脚本做了三层嵌套:电阻容差、电源波动、Rp 容差,最后取极值区间。参数上RD_TOL对应电阻精度,VDD_MIN/VDD_MAX对应 Source 侧电源范围。如果in_window打出 False,说明这一档在最坏情况下会被误判,实际项目里就要么换更高精度电阻,要么接受它退化成 Default 档——对只吃 5V 的 Sink 来说,退化通常可以接受。

3.3 上电实测:万用表测 CC 电压、主机侧读供电档位

做完板子别急着下结论,用两台仪器就能闭环验证。万用表直流档,黑表笔接 GND,红表笔依次点 CC1、CC2,插上 Source 后应该只有一根读到 vRd 电压(约 0.3V~2.0V 之间,取决于 Source 档位),另一根接近 0V 或浮空。如果两根读数一样,多半是共用电阻的错误接法。

主机侧(Source 是电脑或开发板)可以用 sysfs 交叉确认协商结果:

# 在 Linux 主机侧确认设备是否枚举成功、协商到的供电档位 lsusb -t # 看设备挂在哪条总线、速率是 480M 还是 5G cat /sys/class/power_supply/usb/current_max # 单位 uA,常见平台会给出协商后的电流上限 cat /sys/class/power_supply/usb/voltage_now # 单位 uV,插上后应稳定在 5000000 附近

current_max的路径因平台而异,有的在/sys/class/power_supply/usb/,有的在.../tcpm-source-psy-*下,找不到就先用ls /sys/class/power_supply/列一遍。这个值能直接告诉你 CC 分压被识别成了哪一档:900000 对应 Default USB 3.x,1500000 对应 1.5A,3000000 对应 3A。如果插上后电压仍是 5V、电流上限只有几百毫安,而你的 Source 明明是 65W 的,那就印证了前面那句——Sink 侧没有 PD 控制器,协商根本没开始。

4. 必须上 CC 逻辑芯片的四类场景与控制器选型参数

4.1 Source、DRP、USB PD、Alternate Mode 分别缺什么能力

把"需要芯片"的场景拆开看,缺的能力其实各不相同:

做 Source。固定 5V 输出可以用两颗 Rp 电阻实现,但电流档位一旦要可调、或者要区分插进来的是 Sink 还是 e-marker 线缆,就需要检测 CC 电压并动态切换 Rp 的逻辑,这已经接近一个状态机了。

做 DRP(双角色电源)。设备既可能供电也可能受电,比如笔记本上的 Type-C 口。这种口必须在 CC 上周期性翻转 Rp 和 Rd 状态(业界叫 toggle),等对方响应后再锁定角色。这个动作必须由芯片或 MCU 定时器驱动,电阻完全做不到。

要 USB PD 快充。CC 上要跑 300kbps 左右的 BMC 编码报文,包含 Source_Capabilities、Request、Accept、PS_RDY 这一整套状态机,还涉及 CRC 和重传。必须有模拟前端收发器加协议栈。

要 Alternate Mode。DisplayPort Alt Mode、Thunderbolt 这类功能依赖 PD 的结构化 VDM(Vendor Defined Message)协商,属于 PD 协议的上层扩展,同样必须过 PD 控制器。

顺带一提,如果线缆里有 e-marker,Source 需要给它供 VCONN 并读取线缆能力(能承受多少电流、支持什么速率)。这个动作也要芯片参与,纯电阻方案读不了 e-marker。

4.2 三类实现路径对比:纯电阻、分立比较器、专用 PD 控制器

实现路径典型器件形态成本量级能做到做不到
纯电阻5.1kΩ / 56kΩ / 22kΩ / 10kΩ几毛钱以内Sink 受电、固定档 SourcePD、DRP、Alt Mode、读 e-marker
分立方案比较器 + 分压网络 + MCU 的 ADC检测对方档位、简单角色切换BMC 收发、PD 协议栈、VDM
专用控制器集成 CC 模拟前端 + PD 协议栈的芯片完整 PD、DRP、Alt Mode需要固件配置、需要 I2C 主控配合
MCU 内置 PD带 UCPD/Type-C 外设的 MCUPD 与主控一体,BOM 最省需要自己搞协议栈或买授权

选型的实际判断标准是:只要出现"主动驱动 CC 电平""收发 BMC 报文""周期性翻转角色"中的任意一条,就直接上专用控制器,别在分立方案上省那几毛钱。分立比较器能做的最多是"读一下对方给了多少电流档位",用来点亮一个指示灯,做不了真正的协商。

4.3 CC 逻辑芯片选型与外围参数核对清单

选好芯片之后,外围参数要逐条核:

核对项要求常见错误
CC 串联电阻一般预留 0Ω,部分设计串小阻值做限流忘留,改板时无法调
CC 对地电容按芯片手册给,通常几十 pF 量级电容过大,BMC 边沿被吃掉
ESD 防护CC 直接连连接器,必须加 TVS只保护 VBUS,CC 裸奔
VCONN 供电路径Source 侧要有 VCONN 开关直接拿 VBUS 灌,烧 e-marker
Rp/Rd 精度按规范容差选,一般 ±1%~±5%用 10kΩ 凑数
中断与复位芯片 INT 引脚要接主控轮询导致响应慢,协商超时
固件版本PD 协议栈要能升级出兼容性问题只能换料

读取 CC 状态通常走 I2C,下面是一段通用形态的读取代码,寄存器地址必须以具体芯片手册为准:

# 通过 I2C 读取 CC 逻辑芯片的角色与连接状态(寄存器地址仅为示例) import smtplib # 占位,实际使用对应平台的 I2C 库 I2C_ADDR = 0x22 # 7 位从机地址,以芯片手册为准 REG_STATUS = 0x40 # 状态寄存器 BIT_ATTACHED = 1 << 0 # 已检测到对端 BIT_ORIENT = 1 << 1 # 0 表示 CC1 连通,1 表示 CC2 连通 BIT_ROLE = 1 << 2 # 当前角色:Source / Sink def read_cc_state(bus): raw = bus.read_byte_data(I2C_ADDR, REG_STATUS) return { "attached": bool(raw & BIT_ATTACHED), "cc_pin": "CC2" if raw & BIT_ORIENT else "CC1", "role": "Source" if raw & BIT_ROLE else "Sink", "raw": hex(raw), }

这段代码的用途是把"设备插没插、插哪一面、现在是什么角色"三个状态读出来打印。参数部分:I2C_ADDRREG_STATUS必须替换成你选的芯片的真实值,位定义同理;BIT_ORIENT的极性各家不同,有的芯片是 1 表示 CC1,上板前先拿一根已知方向的线缆标定一次,别照抄别人的位定义。

5. CC 链路排错:抓 BMC 波形、读 PD 报文判断芯片有没有白装

焊了 PD 控制器但功能还是不对,最有效的办法是直接看 CC 上的波形。用示波器单端探头(带宽 100MHz 以上足够)接 CC 对 GND,触发方式设成下降沿、触发电平设在 1V 左右。分两种情况:

只做模拟档位协商时,CC 上是一条稳定的直流电平,插拔瞬间只有缓慢的充电曲线,没有跳变。这说明双方只走了 Rp/Rd 分压,PD 没有启动。如果此时你的板子上焊了 PD 芯片,先查三件事:芯片有没有正常上电和复位、I2C 能不能读到器件、CC 引脚是不是被错接到了其他网络。

PD 真正协商起来时,CC 上会出现一串密集的跳变——BMC 编码的报文,速率约 300kbps,脉宽在微秒量级。能抓到这串波形,说明物理层通了,问题大概率在协议层:Request 没发出去、Source_Capabilities 没解析对、或者 PPS 电压步进算错。这时候换 PD 分析仪或者带 PD 解码功能的逻辑分析仪,把报文解出来看交互时序,比在代码里打日志高效得多。

一个实用的验证技巧是在 CC 上预留可切换的负载:设计阶段在 CC 网络里串一个 0Ω,旁边留一颗手焊 5.1kΩ 的焊盘。调试时先只焊这颗 5.1kΩ,让设备退化成纯 Sink 模式,确认 Source 能稳定给 5V;确认无误后再把电阻拿掉、启用 PD 控制器。这样能把"硬件连接问题"和"PD 协商问题"分离开,避免两种故障混在一起排查。

另一个高频故障是协商成功但电压不稳。常见原因是 CC 上的滤波电容取值过大,BMC 的上升沿被拉缓,Source 解调误码导致反复重协商。处理方式是按芯片手册把 CC 对地电容降到推荐值,同时确认 CC 走线没有和 VBUS 或开关电源的噪声路径并行太长。若设备在满载时掉回 5V,再回头核对 Rp 档位与 Request 的电流值是否匹配——Sink 请求的电流不能超过 Source 在 Source_Capabilities 里广播的上限,否则 Source 会主动切回默认档位保护自己。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询