FEATURED · 精选文章

USB Type-C CC逻辑芯片要不要?Rp/Rd与PD协商解析

发布时间 / 2026/9/17 4:57:59
来源 / 创域科博编辑部
栏目 / 资讯中心
USB Type-C CC逻辑芯片要不要?Rp/Rd与PD协商解析 简介围绕「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.61V500mAUSB 2.0/ 900mAUSB 3.x1.5A 5V22kΩ3.3V 或 5V0.61V ~ 1.23V1.5A3.0A 5V10kΩ3.3V 或 5V1.23V ~ 2.04V3.0Ae-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用来判断这一档是否能被正确识别。跑出来会看到Rp56k 得到约 0.42V落在 Default 窗口Rp22k 得到约 0.94V落在 1.5A 窗口Rp10k 得到约 1.69V落在 3A 窗口。三档拉得足够开所以纯模拟分压的容错其实不错——前提是电阻精度别用错±5% 的普通贴片电阻就够用 4.7kΩ 或 10kΩ 当 Rd 则必然误判。2.3 只做 Sink 要不要 CC 逻辑芯片三个判断条件判断顺序可以简单化设备只受电、不对外供电且最高只要 5V。那么两颗 5.1kΩ 到 GND 即可不需要 CC 逻辑芯片。设备要对外供电Source。哪怕只是固定 5V/1.5A 输出CC 上也必须有 Rp如果这个输出口还要兼容不同线缆、要报告电流档位用固定电阻能做但一旦要支持双角色切换就必须上芯片。需要 USB PD也就是电压超过 5V、电流超过 3A、或者需要 PPS 可调压。此时 CC 上要跑双相标记编码BMC的报文必须有收发器和协议栈纯电阻彻底无能为力。这里有个反直觉的点值得强调Sink 端只有 Rd 时即使插上 100W 的氮化镓充电器也只能拿到 5V。原因是 USB PD 的协商由 Sink 主动发起——Sink 要先通过 CC 上的 BMC 发出 RequestSource 才会把电压抬上去。只有 Rd、没有 PD 控制器Sink 在电气上就是哑巴Source 不会主动升压。所以充电慢经常不是充电器的问题而是设备侧根本没有 CC 逻辑芯片。3. 用两颗 5.1kΩ 电阻替代 CC 逻辑芯片的最小电路与验证3.1 正确接法与错误接法CC1/CC2 必须各自独立下拉正确做法非常朴素CC1 经一颗 5.1kΩ 到 GNDCC2 经另一颗 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, fin_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.x1500000 对应 1.5A3000000 对应 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 的结构化 VDMVendor Defined Message协商属于 PD 协议的上层扩展同样必须过 PD 控制器。顺带一提如果线缆里有 e-markerSource 需要给它供 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 外设的 MCU中PD 与主控一体BOM 最省需要自己搞协议栈或买授权选型的实际判断标准是只要出现主动驱动 CC 电平收发 BMC 报文周期性翻转角色中的任意一条就直接上专用控制器别在分立方案上省那几毛钱。分立比较器能做的最多是读一下对方给了多少电流档位用来点亮一个指示灯做不了真正的协商。4.3 CC 逻辑芯片选型与外围参数核对清单选好芯片之后外围参数要逐条核核对项要求常见错误CC 串联电阻一般预留 0Ω部分设计串小阻值做限流忘留改板时无法调CC 对地电容按芯片手册给通常几十 pF 量级电容过大BMC 边沿被吃掉ESD 防护CC 直接连连接器必须加 TVS只保护 VBUSCC 裸奔VCONN 供电路径Source 侧要有 VCONN 开关直接拿 VBUS 灌烧 e-markerRp/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_ADDR和REG_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 会主动切回默认档位保护自己。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻