这段时间我在折腾一块基于LDR6500的Type-C多功能小板,它得同时干三件事:从PD充电器里诱骗出20V电压用来供电、跑串口通信、临时还能给别的手机反向充个电。三个需求凑到一起,就撞上了Type-C协议里最绕的那个点——DFP和UFP的“身份”切换。折腾到最后,结论反而很清晰:能不能丝滑切换,关键就看IO电平怎么控制CC引脚上的那组电阻网络。
这篇文章写给正在做Type-C接口板、PD诱骗器、或者想把手头USB设备改造成Type-C接口的硬件玩家。LDR6500这颗芯片在DIY圈子里不算冷门,但大多数教程只讲“怎么诱骗固定电压”,很少聊“怎么让它听IO电平的话,在主机和从机之间来回切换”。我把自己踩过的坑和验证过的电路整理出来,直接给可落地的方案。
1. 项目缘起:为什么Type-C接口需要“主从切换”
1.1 从一根线既要充电又要传输数据说起
Type-C接口最让人头疼的地方就是它太“全能”了。一根线既能充电又能传数据,插上手机它能当充电器,插上电脑它能当外设,插上显示器它还能当视频信号源。这个全能背后是一套完整的角色协商机制,也就是DFP(下行端口,可以理解为“主”)和UFP(上行端口,可以理解为“从”)的识别与切换。
比如我做的这块板子,它本身要从PD充电器取电,这是标准的UFP身份。但当我需要它临时给手机反向充电时,它又得扮演DFP身份,去控制VBUS输出。这两个身份在一个物理接口上共存,还不能同时出现,否则会出大问题——两边的电源同时往里怼,轻则烧线,重则烧设备。
LDR6500就是这颗用来处理“身份”问题的芯片。它本身是PD协议控制器,能通过CC引脚和充电器协商电压,但它默认只站在UFP这一侧。要让整个接口能在“主”和“从”之间切换,就得靠IO电平去控制外部电路,把Type-C的CC引脚重新“装扮”成对应身份该有的样子。
1.2 主从切换的本质是CC引脚上的电阻网络
很多刚开始接触Type-C的朋友容易搞混一个概念:Type-C的“主从切换”不是靠软件协议切换的,物理上靠的是CC引脚上接的电阻。
Type-C规范里有两颗关键电阻:Rp和Rd。DFP这侧会在它的CC1/CC2引脚上接一个上拉电阻Rp到电源,典型值是56kΩ;UFP这侧会在自己的CC引脚上接下拉电阻Rd到地,典型值是5.1kΩ。两边一插上,DFP通过检测CC引脚上的电压就能知道对面接的是一个UFP设备。插上之后,VBUS才被允许输出5V。
所以“主从切换”的本质,就是切换CC引脚上的电阻网络:表现为“主”时,让CC引脚挂上拉电阻Rp;表现为“从”时,让CC引脚挂下拉电阻Rd。IO电平控制本质上就是控制MOS管或模拟开关,把对应的电阻接进电路或者切出去。理解这一点,后面看电路图就不迷糊了。
1.3 LDR6500在这套方案里扮演什么角色
LDR6500的作用要分两层看。第一层,它作为PD协议芯片,内置了Rd下拉电阻,能在CC线上和充电器完成PD握手,协商出9V、12V、15V、20V这些电压档位。这层功能是“从”身份。
第二层,它的IO口可以输出高/低电平,用来控制外部电路。我们正好可以利用这个特性:让IO去控制MOS管或者模拟开关,将CC引脚从“LDR6500内部Rd”切换到一个外部Rp上拉网络。这样整个接口对外就表现成DFP,能给别的设备供电。
不过这里有个关键点要提前说清楚:LDR6500本身是Sink侧芯片,它的内部Rd是一直挂在CC引脚上的。如果想在同一颗芯片、同一个CC引脚上既保留LDR6500的协议协商能力,又要在需要时切换到外部Rp上拉,必须加隔离或选通电路,不能直接把上拉电阻并到CC线上,否则内部Rd和外部Rp会形成一个分压,两头都不讨好。这一点我后面会展开讲。
2. LDR6500引脚级拆解:每个脚位都别浪费
2.1 引脚功能与供电设计
LDR6500常见的封装是SOP-8,引脚不多,但每个脚都有讲究。核心引脚包括:VDD、GND、CC1、CC2,以及一组IO配置脚。不同批次、不同后缀的型号,具体引脚命名会有差异,我这边讲的是通用逻辑,实际接线一定以你手头datasheet为准。
供电设计上,LDR6500内部集成了LDO,VDD输入范围很宽,可以直接从VBUS取电,也能用外部3.3V供电。我实际测试时是从VBUS飞线到VDD,板子上再放一颗AMS1117-3.3V给IO控制电路和逻辑部分供电。要注意的是,如果VBUS还没建立(比如设备没被识别),芯片供电要靠外部电源,不能依赖VBUS,否则会出现“插上没反应”的循环。
CC1和CC2是协议通信脚,也是身份检测脚。Type-C接口不分正反,所以CC1、CC2都要接出来。做诱骗应用时,充电器的Rp会通过CC引脚被LDR6500内部检测到,芯片据此确认连接并发起PD请求。这颗芯片的CC引脚耐压余量一般,热插拔瞬间容易有毛刺,建议在CC引脚上并联TVS管或ESD保护器件,我后面实操章节会给具体型号。
2.2 CC1/CC2与PD诱骗的核心逻辑
PD诱骗的原理其实很“笨”:当LDR6500作为Sink插到PD充电器上时,充电器作为DFP,会在CC引脚上输出一个上拉电压。LDR6500检测到CC引脚上的电压落在有效区间内,就判定“对面是PD电源”,于是开始按PD协议发起电压协商请求,比如“我要20V”。充电器通过CC引脚上的数字通信确认请求,然后调整VBUS输出。
整个过程中,CC引脚既是“身份检测”线,又是“协议通信”线。这就是为什么它特别敏感,不能随便乱接。很多DIY玩家直接把CC引脚悬空或者接地,结果充电器根本不输出VBUS,或者明明插着充电器却只能吃到5V,就是这个原因。
还有一个细节:LDR6500做诱骗时,CC引脚上必须有它内部的下拉特性(Rd),否则DFP无法识别设备连接。很多同学做“PD诱骗线”时会自己外挂一颗5.1kΩ电阻到地,其实LDR6500内部已经有这个下拉,外部再接就重复了,除非你用的是不带Rd的简化版本芯片。这个要看具体型号手册。
2.3 输出电压档位与IO脚的用途
LDR6500的输出电压档位一般不是软件随意配的,很多型号是靠外部模式选择引脚的电平组合来定,常见的有5V、9V、12V、15V、20V这几个固定档。实际使用中,如果你只需要固定一个电压,可以把模式脚直接接成固定电平,电路非常简单。
但做“主从切换”时,IO脚用途就变了。我们不再是单纯选电压,而是要用IO输出电平控制外部MOS管。这里有一个容易被忽略的问题:IO脚通常不能直接驱动PMOS栅极到合适的电平,因为PMOS导通需要栅极比源极低一定电压。所以实际设计里,要么加一级NPN/NMOS做电平转换,要么用一个NMOS去控制PMOS的栅极通路。
另外,LDR6500的IO脚数量有限,不可能既接模式选择又接切换控制还接状态指示。我的做法是:输出电压档位全部外接跳线帽固定,IO脚留出来专门做切换控制。这样虽然少了一点“灵活性”,但逻辑清晰、调试方便,也避免IO脚复用打架。
3. IO电平控制主从切换的落地电路
3.1 方案总览:两路MOS管搞定身份翻转
整套主从切换电路可以拆成两条通路来看。第一路是“从”通路:CC引脚通过芯片内部Rd下拉,同时协议通信由LDR6500接管,这是设备原本的UFP身份。第二路是“主”通路:CC引脚断开和LDR6500内部Rd的连接,改接一个外部的56kΩ上拉电阻到3.3V或VBUS,整个接口对外表现为DFP。
两条通路不能同时导通,需要靠IO电平互斥控制。我最终用的方案是:一颗N沟道MOS管控制下拉电阻通路,一颗P沟道MOS管控制上拉电阻通路,两颗MOS管的栅极分别由两个IO脚控制。为了避免切换瞬间同时导通,IO控制逻辑上做了简单互斥,比如一个脚输出高、另一个脚必须输出低。
这里要特别强调开头提到的那个坑:不能直接把56kΩ上拉并到LDR6500的CC引脚上。因为LDR6500内部的Rd下拉还挂在CC线上,你并一个Rp上去,等效于Rp和Rd分压,CC电压就直接被拉到中间值。DFP侧检测器一看电压不对,根本不会认为你是一个有效设备。所以“主”通路必须先把LDR6500内部Rd从CC线上隔离掉,再接入外部Rp。
3.2 参数计算:5.1k和56k不是拍脑袋定的
很多新手会问:为什么一定是5.1k和56k?能不能换?答案是:Type-C规范里对这两个电阻的取值有相对严格的范围要求,不能随便换。
Rp上拉电阻如果取56kΩ,接到5V电源时,和UFP侧的Rd(5.1kΩ)分压,CC引脚电压大概在0.4V左右。DFP侧内部的比较器就是根据这个电压范围来判断“有没有设备接入”。如果电阻值偏差太大,电压落到检测窗口外,两边都认不出对方。
Rd下拉电阻取5.1kΩ也是同理。它既要保证和Rp分压后落在DFP的检测阈值内,又不能太小导致电流消耗过大、CC线上的通信信号被压死。PD通信是靠CC引脚上的模拟信号传输的,取值偏差过大还会影响通信波形,导致握手失败。
实际选料时建议用1%精度的贴片电阻,温漂小的那种。我这块板子上5.1k和56k都用的是1%精度,实测CC引脚电压稳定,没有出现偶发识别不了的情况。
3.3 关键时序与保护设计
IO电平控制主从切换,最容易出问题的是热插拔瞬间和上电初始时序。
先说上电初始状态。板子上电瞬间,LDR6500的IO脚电平如果没有被初始化,MOS管栅极可能处于浮空状态,这时候CC网络到底是“主”还是“从”完全不确定,就会出现“插上去一会儿识别一会儿不识别”的诡异现象。解决办法是在IO脚上加上下拉电阻,给栅极一个确定的默认电平。我的板子上电默认是“从”身份,因为作为充电设备首先得能被充电器识别、建立VBUS,然后再靠软件切到“主”身份去干别的活。
再说热插拔。Type-C插拔瞬间CC引脚会有抖动,IO电平切换如果太频繁,容易在连接还没稳定的时候就把电阻网络切来切去。我在控制线上滤了一层RC低通,大概2ms左右的时间常数,让切换信号和插拔抖动隔离开。另外,CC引脚上各加了一颗ESD/TVS管到地,型号用的是ESD9L5.0D3,这颗管子的钳位电压对CC信号影响很小,但能有效保护LDR6500和MOS管的栅极,实测热插拔几十次没出过问题。
控制逻辑上用代码来表达的话大概是这样:
#define IO_DFP PA0 // 控制PMOS栅极,接入Rp上拉 #define IO_UFP PA1 // 控制NMOS栅极,接入Rd下拉 void role_as_ufp(void) { digitalWrite(IO_UFP, HIGH); // 打开NMOS,Rd接入,表现为从机 digitalWrite(IO_DFP, HIGH); // 关闭PMOS,Rp通路断开 } void role_as_dfp(void) { digitalWrite(IO_UFP, LOW); // 关闭NMOS,Rd通路断开 digitalWrite(IO_DFP, LOW); // PMOS导通,Rp接入,表现为主机 }这里PMOS是低电平导通,所以切“主”时要让IO_DFP输出低电平。初次调试很容易在这绕晕,我建议用万用表测CC引脚对地电阻来验证当前身份,而不是上来就看设备反应。
4. 实操:搭一块可切换身份的Type-C小板
4.1 物料清单与Type-C 16Pin连接器选型
物料方面,核心器件其实不多,随手就能列出来:LDR6500芯片一片、Type-C 16Pin母座一个、AMS1117-3.3V线性稳压一片、NMOS两颗(2N7002或AO3400)、PMOS一颗(AO3401)、1%精度电阻若干(5.1k、56k、10k)、TVS管两颗、滤波电容若干、接插件看个人习惯。
Type-C连接器选型上,网上经常能看到“Type-C 16Pin 2MD”之类的料号,很多人一看16Pin就以为能用,实际要看具体Pin定义。16Pin连接器通常是双排引脚,涵盖了VBUS、GND、CC1、CC2、D+/D-、SBU1/SBU2等信号,但不同厂家、不同封装形态的引脚顺序会有差异。有的16Pin把A/B面的VBUS合并成两三个引脚,有的保留全部独立引脚,焊之前一定要拿到规格书,别凭记忆焊接。
如果你只做PD诱骗加USB2.0通信,其实不一定要用16Pin。用带CC引脚的8Pin或6Pin连接器就够了,省得一堆用不上的高速差分引脚在板子上空着徒增焊接难度。我之所以选16Pin,是因为后面想扩展视频数据通路,提前把SBU和高速差分对留出来。
| 器件 | 型号/规格 | 数量 | 作用 |
|---|---|---|---|
| LDR6500 | SOP-8(具体后缀按需求电压选) | 1 | PD协议协商 |
| Type-C 16Pin母座 | 16Pin全针 | 1 | 物理接口 |
| AMS1117-3.3 | 3.3V LDO | 1 | 逻辑供电 |
| NMOS | AO3400 | 2 | 控制Rd下拉/辅助开关 |
| PMOS | AO3401 | 1 | 控制Rp上拉 |
| 电阻 | 5.1k 1% | 2 | Rd下拉 |
| 电阻 | 56k 1% | 2 | Rp上拉 |
| TVS | ESD9L5.0D3 | 2 | CC引脚保护 |
| 电阻 | 10k | 若干 | 栅极下拉/配置 |
4.2 焊接顺序与最小系统点亮
焊接顺序很重要,别一上来就把十六个脚的连接器焊上。我的习惯是先焊电源部分,再焊LDR6500最小系统,最后焊CC网络和Type-C座子。
先把AMS1117-3.3V焊好,输入接5V,输出3.3V,确认电压稳定。然后把LDR6500的VDD接到3.3V或VBUS,GND接好,模式选择引脚按需求接成固定电压档位。这时候先不接Type-C座子,用镊子把CC引脚碰一下充电器的CC通路,或者用PD诱骗测试器连接,确认LDR6500能被电脑或充电器识别。
最小系统亮起来之后,再焊Type-C座子。座子焊完,先用万用表量一下CC1、CC2引脚到地电阻。如果当前是UFP模式,应该能测到大约5.1kΩ的阻值;如果是DFP模式,应该测到56kΩ左右。阻值不对,说明MOS管控制逻辑有问题,别急着上电。
整板通电后,我习惯先用一个支持PD的充电器测试“从”身份:插上充电器,VBUS应该能从5V升到设定电压。然后再用IO控制切到“主”身份,拿另一台手机或者诱骗负载接上去,能正常出电就说明切换链路完整了。
4.3 与CH340联动:串口板如何正确接Type-C
CH340和Type-C的连接问题,网上问得特别多,尤其是“需要串电阻吗”。这个问题要分两部分回答:CC引脚要不要串电阻,以及数据引脚要不要串电阻。
CH340是一颗USB转串口芯片,它本身完全不知道Type-C的存在。当你把CH340做成一个Type-C接口的串口板时,CH340的D+和D-直接接Type-C座子的D+和D-。这时候真正的关键不是串不串电阻,而是CC引脚上必须接正确的Rd下拉电阻(5.1kΩ),让电脑端的DFP能识别到这是一个UFP设备。CC引脚如果悬空,电脑会认为什么都没插,数据不通、供电也不出。
至于D+/D-线上串22Ω电阻,这是USB信号完整性角度会做的处理,用来匹配线路阻抗、抑制反射。短距离的串口板实测不串也能工作,但走线稍长或者用了杜邦线之后,串上22Ω会更稳。我建议这四颗22Ω电阻预留焊盘,调试时先用0Ω代替,之后根据波形决定要不要换成22Ω。
如果你是自己做Type-C转CH340串口板,最简单可靠的办法就是:CC1和CC2各接一颗5.1kΩ下拉电阻到地,D+/D-之间正常接CH340,不需要额外复杂电路。如果是用LDR6500一起做诱骗加串口的板子,那CH340的CC逻辑就可以由LDR6500那条通路顺带处理,但要注意切换成DFP身份时,挂在CC上的Rd会被摘掉,串口功能在这种状态下可能需要重新插拔才能被识别。
5. 常见故障与排查实录
5.1 插上没反应:CC电阻和身份检测排查
“插上充电器没反应”是这类板子最常见的故障,排查方向基本就集中在CC电阻网络。
先用万用表量CC引脚对地电阻。UFP模式下应该看到5.1kΩ左右,DFP模式下应该看到56kΩ左右。如果阻值对不上,先查MOS管有没有接反、栅极电压有没有被正确拉高/拉低。很多新手把NMOS的源极和漏极接反了,导致电流通路不通,阻值自然不对。
还有一种情况是阻值正常但插上充电器仍然没反应。这种时候要测VBUS上有没有5V。如果VBUS一直为0,说明充电器的DFP根本没有识别到设备,问题大概率出在CC线上的TVS管或ESD器件漏电,把CC电压钳得太低。我遇到过TVS管焊反导致CC电压被死死拉在地上的情况,拆掉TVS后一切正常。
还有一个隐蔽问题:LDR6500的CC引脚虚焊。SOP-8封装引脚间距不小,但CC脚周围如果堆积了助焊剂,也会造成接触不良。这种故障非常难查,怀疑虚焊的时候用烙铁重新拖一遍稍微加点焊锡,比用放大镜看靠谱。
5.2 华为MateBook 13 Type-C口失效的排查思路
网上搜“Type-C接口失效”经常会看到笔记本相关案例,比如MateBook 13的Type-C口突然不能充电也不能传数据。这种整机接口失效的问题,从主从切换的视角能给不少排查启发。
笔记本的Type-C口是典型的DRP双角色端口,它会周期性在CC引脚上切换Rp和Rd,去发现对面是什么设备。如果这个切换电路出问题,比如CC引脚附近的ESD保护器件损坏、负责DRP切换的模拟开关短路,接口就会表现出时好时坏或者彻底失效。这跟DIY板子上的主从切换故障,本质上是一个原理。
碰到整机接口失效,第一件事不是拆机换芯片,而是换线换充电器排除线缆问题。第二步用带CC检测的工具看CC1、CC2的电压波形,确认笔记本有没有周期性的DRP切换过程。如果CC引脚完全没有波形,大概率是主板CC通路上的元器件挂了,常见的就是ESD/TVS管烧穿或者协议控制器周边损坏。如果CC有波形但VBUS始终不出,那问题可能出在供电侧的MOS管或协议芯片上。个人维修整机主板风险不小,但排查逻辑是通用的,对我们做DIY板子也有参考价值。
5.3 排查流程与工具建议
给各位一套我常用的排查流程,遇到问题按顺序走,能省下大量瞎猜的时间。
第一步,确认物理连接。Type-C线有没有问题?座子焊点有没有连锡?这一步用眼睛看加万用表通断档测。
第二步,量电源。板子上电后,3.3V是否正常?VBUS是否按预期出现?LDR6500的VDD脚电压是否在规格范围内?
第三步,量CC电阻。按当前预期身份,CC对地电阻是否为5.1k或56k左右。这一步能快速定位MOS管控制逻辑的问题。
第四步,看CC电压/波形。接上充电器或电脑后,用示波器看CC引脚上的波形。正常协商时,CC引脚会有明显的电压跳变和通信脉冲,没有波形说明身份检测没建立。
第五步,看VBUS输出。如果CC协商正常,VBUS应该在约定时间内升压。VBUS不升,问题在LDR6500的PD请求环节或者反馈网络。
工具方面,万用表和示波器是必须的,示波器不需要太好,100MHz双通道足够。再备一个带PD协议的Type-C测试工具,能直接读CC上的通信报文,排查PD协商问题非常省事。没有协议测试工具的话,用诱骗负载测VBUS输出也能覆盖大部分场景。
| 故障现象 | 优先排查项 | 排查方法 |
|---|---|---|
| 插上无任何反应 | CC电阻网络、TVS漏电 | 万用表量CC对地电阻 |
| VBUS一直是5V不升压 | LDR6500 PD请求失败 | 示波器看CC通信波形 |
| 切到DFP后不对外供电 | PMOS导通条件、Rp通路 | 量CC对地电阻是否为56k |
| 偶尔能识别偶尔不行 | IO脚浮空、热插拔抖动 | 确认初始电平、加RC滤波 |
| 串口不识别 | CC悬空、D+/D-接反 | 确认Rd接入、数据线对调 |
6. 写在最后:几处踩坑体会
这套方案我前后迭代了三版,最有价值的一条经验是:IO电平控制主从切换,绝对不能只控制一路电阻,把另一路直接悬空。必须保证在任意时刻,CC引脚上只有一个明确的身份电阻网络,要么Rp、要么Rd,不能两边都在,更不能两边都没接。我第一版电路就是只做了Rd下拉的NMOS控制,切换成DFP时只断开下路,结果测得CC引脚完全悬空,充电器死活不认设备。
还有一个小技巧值得分享:我在板子上加了两个LED指示灯,一个标记UFP状态、一个标记DFP状态,直接用IO控制。调试的时候可太有用了,一眼就能看出当前身份是什么,不用每次都拿万用表去量CC电平。这个成本几乎为零,但体验提升非常明显。
后续如果要往商业产品方向走,建议把LDR6500的方案升级成带I2C接口的PD芯片,用MCU动态配置电阻网络和PD协议参数,灵活性会强很多。但LDR6500这套IO电平控制的思路,胜在简单、可靠、成本低,非常适合快速验证和中小批量产品。如果你正在做Type-C相关的板子,不妨照着这个思路先搭一套最小系统试试,把CC电阻网络的测量和理解吃透,后面遇到再复杂的DRP切换问题都不会慌。