
上个月我在调一块Type-C转SATA扩展坞的原型板遇到一个很典型的需求设备插着U盘和HDMI同时还要给手机回充。客户要的就是“边充电边OTG”这种最朴素的效果。手机作为Host读取U盘数据扩展坞同时给手机供电。一开始我用了一颗带PD能力的MCU结果半个星期都在啃协议栈代码越写越痛苦最后换成了LDR6028这颗专门的PD协议芯片三天把所有功能都跑通了。这篇就把这次实战的原理、电路、设计细节和踩过的坑整理出来给正在埋头画Type-C周边设备的朋友做一个参考。LDR6028的核心价值就是帮你把USB PD协议协商的活儿包下来你只需要关心外围电源路径怎么走、数据线怎么接。配合一颗正确设计的VBUS开关就能让手机一边作为Host控制U盘一边以Device角色充电。整个过程涉及Type-C物理层、CC引脚的上下拉配置、PD协议的Data Role Swap / Power Role Swap、以及VBUS通路的隔离设计。下文会从协议原理讲到完整电路最后再聊几个实际量产才会发现的坑尽量把这颗芯片用透。1. 边充电边OTG的实现思路为什么非要用PD协议芯片1.1 应用场景与硬件痛点先把场景说清楚。市面上很多Type-C扩展坞、车载互联盒、工业HMI触摸屏都要求主设备通常是一部手机或平板作为USB Host连接外设同时又希望通过同一个Type-C口给自己充电。比如车载无线CarPlay盒子一边接车机USB口取电一边接手机识别为车机再比如Type-C转千兆网口加USB 3.0的扩展坞手机插上去后既要加载网络驱动又要维持电量。如果产品使用传统的Micro-B接口这个需求反而简单因为Micro-B的OTG和充电引脚是分开的。但Type-C接口只有一组VBUS和CC引脚物理上天然共享端口所以必须依靠PD协议中的“数据角色切换”和“电源角色切换”来实现。标准USB PD协议允许两个设备互相协商谁作为供电方、谁作为数据主机都可以动态变化。LDR6028就是专门做这件事的专用芯片。如果不使用PD芯片只靠单片机去处理比较麻烦你需要自己检测CC1/CC2的电压判断是接入了DFP还是UFP再决定自己的VBUS是输出还是输入。考虑到还要支持边充边OTG就需要在协议层与电源切换之间做大量状态机判断。于是绝大多数工程师选择一颗专用PD控制芯片把“身份判断”交给硬件自己只需要控制电源路径。1.2 LDR6028解决的“身份争议”LDR6028作为USB PD物理层和协议层控制器内部集成了CC逻辑、PD协议引擎和I2C配置接口。它的主要工作模式是DRP也就是双角色端口。上电后它会通过CC引脚不断探测对端判断连接设备是Source、Sink还是DRP。如果你把LDR6028配置为“DRP with Try.SNK”那么它在检测到手机时倾向于作为Sink去取电同时如果手机也支持数据角色交换它就可以申请成为DFP让手机数据方向转为Host模式。这样在外人看来扩展坞同时干了两件事电源角色上扩展坞是Sink受电方手机是Source供电方手机给扩展坞充电数据角色上扩展坞是DFP数据的下行端口手机是UFP数据的上行端口扩展坞作为Host控制U盘。这个组合在PD协议里是完全合法的因为Power Role和Data Role是独立协商的。LDR6028的通讯协议栈会先完成“电源角色”的确定再根据场景主动或被动触发“数据角色交换”从而实现边充电边OTG。你要做的只是配置好LDR6028的初始化寄存器或者通过I2C在运行中调整角色。2. 拆解Type-C的引脚与PD协议协商过程2.1 Type-C物理引脚里CC、SBU、VBUS各管什么事画原理图前必须把Type-C母座的引脚弄清楚。一个全功能Type-C母座通常是24Pin或16Pin其中24Pin的完整引脚如下引脚名功能与本文相关的重要性A1/B1, A12/B12GND公共地A4/B4, A9/B9VBUS供电主通道A5CC1配置通道负责角色识别与PD通信B5CC2同上A6Dp1USB 2.0差分信号正极B6Dp2? 实际上是Dn1需要注意Type-C引脚命名通常是A6/Dp1、B6/Dn1、A7/Dn1这里容易混乱。Type-C 24Pin中A6是USB数据线正极A7是USB数据线负极B6/B7是第二对D/D-用于翻转。更精确A6(Dp1), A7(Dn1), B6(Dp2), B7(Dn2)。SBU1是A8SBU2是B8。A8/B8SBU1/SBU2边带信号用于USB4、DisplayPort、模拟音频A2/B2, A3/B3传输高速差分对用于USB3.0/4.0、DP、PCIe实际设计14Pin或16Pin母座会省略部分高速对保留USB2.0的数据线D/D-以及CC1/CC2、SBU1/SBU2、VBUS和GND。CC引脚Configuration Channel是Type-C接口的灵魂。在没有任何PD通信时CC1/CC2上的电压决定了端口角色SourceDFP通过在CC引脚拉上10kΩ电阻到5V表示自己可以提供电源SinkUFP通过在CC引脚下拉5.1kΩ电阻到地表示自己需要取电DRP则是交替在两个角色之间切换并可以动态识别对端。当两端的CC上下拉配置正确VBUS就会在tCCDebounce时间后送出5V这就是基本的BC1.2之前的Type-C默认供电。而PD协议是在这组CC线上传输双相标记编码BMC信号进行更复杂的通信。PD报文里包含Source_Capabilities供电能力、Request请求电压电流、PS_RDY电源就绪等消息通过它们可以协商出挡位比如20V/3A甚至更高的PDO。2.2 PD协议是如何通过CC总线“谈”出电压和角色当LDR6028的CC引脚检测到特定电压后它会启动PD物理层的BMC解码识别对端发送的SOP’报文。如果对端是一个充电器那么LDR6028会收到Source_Capabilities报文里面包含了充电器支持的PDO列表。作为SinkLDR6028会从中选一个合适的PDO发送Request报文请求比如9V/2A对端收到后发送Accept和PS_RDY随后VBUS就从5V升至9V。但如果对端是手机手机默认是DRP或Sink那么扩展坞可能需要扮演Source给手机提供VBUS。可“边充电边OTG”的要求是扩展坞给手机充电但数据上扩展坞是Host。此时有两种方式让扩展坞作为SourceDFP给手机供电手机作为Sink然后手机主动发起Data Role Swap使手机变为DFPHost这样扩展坞就作为UFPDevice。让扩展坞作为Sink先取电然后通过协议发起Data Role Swap把数据角色互换。LDR6028支持对端发起的DR_Swap请求也可以自己发起PR_Swap、DR_Swap。即它既能把整个端口做成一推一拉的复合端口也能通过动态角色切换满足边充边用的需求。这比纯硬件方案灵活得多。3. LDR6028内部机制与典型工作模式3.1 LDR6028的角色管理DRP/DFP/UFP如何切换LDR6028内置了一个精简的MCU和协议栈上电可以通过外部引脚或I2C配置工作模式。实际量产的扩展坞最常用的配置是“Auto DRP”。在这种模式下LDR6028会周期性进行角色探测当CC分别连接到Source或Sink时它自动决定自己是Sink还是Source。需要注意的是LDR6028作为PD控制器只能控制VBUS的通断指令不直接通过大电流。它的内部只是CC相关的控制模块和状态机大多数引脚为低功耗的逻辑接口。因此外面需要搭配一颗VBUS电源开关/负载开关Load Switch或MOS管电路由LDR6028输出使能信号来控制电源通断。例如当检测到充电器时LDR6028会通过GPIO开启“充电路径”的MOS管让VBUS电流流向系统电源当作为Source时它会开启“输出路径”的MOS管把系统主电压通过VBUS送出去。3.2 边充边OTG时电源路径和数据路径如何分离要边充电边OTG最关键的是不能让两个电源路径互相打架。整个系统有三条明显的路径VBUS输入路径从Type-C VBUS引脚进来经过充电控制芯片或DC-DC降压给系统供电VBUS输出路径当扩展坞作为Host时系统电源可能是锂电池电压或者来自身边另一路USB供电需要升压到5V/9V通过VBUS引脚输出给手机USB数据路径手机D/D-到LDR6028的USB数据引脚再转接到USB Hub或外设接口。如果输入和输出共用同一个VBUS就会发生“自己给自己充电”的冲突。解决方法是使用一个负载开关将Type-C的VBUS与内部电源隔离。当充电时外部VBUS经过开关接入内部当对外输出时内部电源经过另一组开关输送到VBUS。这两组开关绝不能同时打开。LDR6028的应对方式是输出两个可编程控制信号例如“VBUS_EN_Input”和“VBUS_EN_Output”并且在固件里做了互锁。你在做原理图时需要跟随芯片的推荐配置来连接MOS管或负载开关。很多参考设计使用两颗P-MOS背靠背组成双向开关或者直接用一颗集成负载开关芯片。除此之外CC方向还必须正确。如果LDR6028正处于Sink模式进行充电那么手机作为Host的那一侧握手可能靠的是USB协议层枚举只要D/D-信号正常即使VBUS正在充电数据通路照样可以工作。许多工程师误以为“充电时CC被拉低USB数据就不能用”实际上USB2.0的数据线D/D-独立于CC只要CC正确驱动了电源协商流程D/D-上仍能正常跑USB数据。4. 完整电路设计原理图与关键元件选型4.1 主控电路LDR6028引脚连接与外部电阻下面给出一套经过验证的LDR6028外围电路设计。以常见的QFN封装为例LDR6028的关键引脚分组如下不同封装脚位号略有差异建议以官方数据手册为准引脚分组引脚名称连接说明CC1/CC2CC1, CC2分别接Type-C母座的A5、B5。每个CC引脚需要并联一颗大约1μF电容到地作为滤波。如果需要防雷击再串100Ω电阻。VBUS感知VBUS_DET通过电阻分压检测VBUS电压用于判断外部是否供电。如果VBUS_DET超出LDR6028输入电压范围需要分压网络通常直接用1MΩ/100kΩ分压到3.3V以下。系统电源VDD, GNDLDR6028的工作电压一般3.3V需要从系统电源用LDO单独供电。在VDD就近放置0.1μF与4.7μF电容。I2C接口SDA, SCL系统MCU如果需要对芯片进行配置可以连接I2C同时各加10kΩ上拉到3.3V。GPIO控制GPIO1, GPIO2通常用于VBUS路径使能。GPIO1接输入电源开关控制GPIO2接输出电源开关控制。根据系统逻辑调整电平常规为高电平有效。复位RESET_N低电平有效接RC复位电路典型值10kΩ上拉并100nF电容到地。实际原理图中我还在CC1/CC2上各串了一颗33Ω电阻。这里的作用不是限流而是是抑制高频噪声和ESD瞬态让BMC信号更干净。这个电阻值不是拍脑袋定的它是兼容PD物理层规范的阻抗匹配范围官方参考电路也基本是10~56Ω。4.2 VBUS路径与控制电路设计VBUS通路是一个容易画错的地方。我的建议是使用两颗独立的负载开关芯片而不是自己用MOS管搭。负载开关芯片内置过流、过压、软启动可靠性远高于分立方案。充电路径Sink模式Type-C VBUS输入 → 负载开关U1的输入VINLDR6028 GPIO1控制U1的EN引脚U1输出到系统充电管理芯片或Buck电路输入输出路径DFP/Source模式系统5V/9V电源 → 负载开关U2的输入VINLDR6028 GPIO2控制U2的EN引脚U2输出到Type-C VBUS引脚LDR6028内部会对GPIO状态做互锁确保同一时刻只有一个路径使能。但为了硬件安全我还会在每一路加一个“与门”做硬互锁防止固件异常导致两个开关同时导通。两颗芯片都用带反向截止的理想二极管功能更好例如TPS25940或更便宜的SGM2577。选型时注意最大连续电流至少满足3A导通电阻要尽量低。USB Cable接入时会有浪涌电流Type-C母座的VBUS旁边必须放置通常采用吸电流能力较强的钽电容或MLCC可以放220μF/25V电解电容与10μF陶瓷电容并联。如果空间紧张至少也要放两颗100μF/16V 0805 X5R陶瓷电容。4.3 SBU/SBU2与USB2.0高速数据线的处理对于标准的USB2.0边充边OTG应用SBU1/SBU2并不是必需的。但如果你还要兼容模拟音频或DisplayPort就一定要把SBU1/SBU2连接到LDR6028的“SBU交叉切换”引脚。Type-C正反插时SBU1和SBU2需要交换否则模拟音频或DP的辅助通道会错位。支持USB4或DP的产品SBU的处理是重中之重。USB2.0数据线D/D-的处理相对简单。通常把Type-C母座的A6/A7和B6/B7都引出来通过一个双刀双掷模拟开关例如TS3USB221A做主从切换。LDR6028有USB数据信号的控制引脚可以输出一个方向信号给模拟开关。注意USB2.0信号是差分对差分阻抗90Ω±10%布线时保持两根线等长、紧耦合最好走表层并包地。实测中如果D/D-走线过长插入U盘识别会不稳就要在靠近Type-C母座处增加共模电感但共模电感的谐振点不能选太低否则USB高速模式会掉速。4.4 保护电路与ESDType-C接口本身裸露在外极易受到静电放电和热插拔冲击。我在设计时做了以下保护CC1/CC2上各加一颗3.3V的TVS二极管方向从正到地防止CC脚损坏SBU1/SBU2上各加一颗4.7V TVSVBUS上加一颗5V或略高于工作电压的TVS双向常用SMBJ15CA或SMBJ30CA根据你使用的最大PDO电压选择D/D-上加低容值ESD保护芯片容值必须小于2pF否则会影响USB信号完整性。另外LDR6028对ESD比较脆弱尤其是最靠近排线端子的CC脚我第一次画板时省了TVS测试用手摸了一下母座金属外壳芯片就挂了。后来在母座外壳引脚上还额外增加了一个1MΩ电阻接到地起到泄放电荷的作用。5. PCB布局与实测注意事项5.1 高频信号与电源的布局分区LDR6028本身是一个低频协议芯片但外围的USB2.0差分线、Type-C母座所带来的高速信号也容易产生干扰。做PCB时最好做到三个独立区域Type-C母座区域母座背面放置ESD和共模电感LDR6028控制区CC信号从母座到芯片尽量短小于15mm走线宽度6~8mil左右两侧包地电源区负载开关、电感、DC-DC要远离CC和D/D-走线避免开关噪声耦合到CC线上影响PD通信。CC走线需要特别注意不要与VBUS走线平行长距离靠近。我曾经有一版PCBCC线从母座到LDR6028走了约3cm旁边有一段5V的VBUS过孔阵列结果插入充电器后LDR6028偶尔无法正常握手。排查发现是VBUS上的开关噪声通过平行走线耦合到了CC给CC线增加了50Ω电阻后再加一个1nF电容滤波就好了。最终建议CC线上加一个RC低通滤波器但R不能太大否则会改变CC引脚的检测电平。5.2 热设计与过流测试边充电边OTG还有一个容易忽视的指标热。当手机在玩游戏并同时通过Type-C口充电时扩展坞不仅要承载手机输出给U盘的电流还要承载充电电流整个系统的功率可能超过10W。如果又使用升压芯片把电池电压提升到5V来给U盘供电效率只有90%左右那么升压芯片上的损耗就接近1W。在4层板的电路板中间层用大面积铜皮散热非常必要。实测时我用了以下流程先用电子负载模拟手机吸收400mA的OTG输出电流同时测试充电输入再用真机插入U盘并开启电量显示长时间运行2小时用热成像仪观察LDR6028和负载开关的温度。如果负载开关表面温度超过85℃就换更低导通电阻的型号或者加大铺铜散热范围。有一版设计使用了一颗最大导通电阻30mΩ的负载开关在3A充电电流下功耗为0.27W温度接近75℃长期运行不放心。后来换了一颗导通电阻18mΩ的温度一下子降了15℃。所以选型时导通电阻不能只看标称值还得看过流条件下的温升曲线。5.3 与不同设备兼容的调试记录LDR6028虽然协议兼容性不错但市面上的设备五花八门我在调试过程中遇到三类典型问题某些老式安卓手机只能固定作为主设备不能成为PD电源这时扩展坞必须处于Source模式才能给手机充电。LDR6028需要在Try.SRC模式优先作为Source但同时又要求手机作为Host读取U盘这就意味着要等数据角色切换完成后再反方向充电。实测这类老手机很挑时序需要在初始化配置中延长角色保持时间否则握手失败。某些PD充电器对DR_Swap支持不友好比如部分车充在扩展坞请求变成Source时直接拒绝。这种情况只能把扩展坞配置为强制Sink即通过外部跳线或I2C设置为UFP模式优先保证充电数据方向再依靠USB协议本身去枚举。USB2.0信号线上的模拟开关方向切换如果切换瞬间VBUS还没稳定手机可能会误判为USB线缆拔出。此时需要软件控制顺序先打开VBUS输出再切换数据开关等100ms后再让LDR6028启动外设枚举。我在代码里增加了一个“枚举延迟”状态当检测到手机作为Host发起枚举时延迟200ms再打开数据开关实测兼容性提升明显。6. 关于LDR6028的配置下载与调试建议LDR6028自身支持在线固件下载一般通过I2C接口可以用官方的烧录器把配置文件写进去。量产时也可以用MCU在系统启动时动态下发配置比如USB_Vendor_Command。我在设计中预留了一个3×2的烧录排针把SDA、SCL、GND、3V3、复位引出来方便调试时连上位机。第一批样板拿到后一定要先烧录一个最保守的配置DRP模式、PDO只开放5V/3A先把所有硬件通路验证通过再逐步增加电压挡位和角色切换功能。调试时用逻辑分析仪抓CC线上的BMC信号是最高效的方法。如果没有高级分析仪可以通过STM32的GPIO模拟采样看波形观察是否有持续0.5ms的低电平脉冲序列。我遇到过CRC校验一直失败的情况最后发现是CC线的参考地分割不正确导致信号地回流路径过长解决方法是把CC线的地包围做到母座附近并让LDR6028的地引脚和Type-C母座的外壳地形成短间歇连接。另外LDR6028的I2C地址是可以配置的一般有两位地址引脚。如果你在同一块板上放了两颗LDR6028比如一个管Type-C上行口一个管下行口记得把地址焊成不同值。我曾经偷懒直接复制粘贴电路导致两颗芯片I2C地址冲突系统MCU每次读取到的寄存器数据全乱套。7. 个人体会别把PD芯片当成全自动万能模块最后聊一点实际经验。LDR6028确实帮我们省掉了协议栈的工作但“边充电边OTG”这个需求背后还有大量系统层面的细节。电源路径的隔离、数据通路的切换时序、保护电路、热设计、兼容性测试这些工作占了整个项目百分之七十的时间。PD芯片只是把最复杂的“通话”部分包办了真正决定量产顺利与否的还是你对整机供电架构的理解。如果你刚开始做Type-C相关产品我建议先买官方评估板把它连接到手边的手机和充电器观察它的角色切换行为再回到自己的原理图里去调整。不要一上来就追求支持几十瓦快充那样只会陷入各种协议兼容的泥潭。从5V/3A的慢充跑通完整链路再把电压升上去你会发现很多坑都能提前暴露。整个项目做完之后我的结论是LDR6028适合做Type-C数据与电源复合产品的“中控”性价比高、外围简单。配合正确的负载开关和USB模拟开关实现边充电边OTG并不是一件玄学的事。只要硬件上没有电源短路、CC走线足够干净、数据通路切换逻辑正确量产良率就能维持在一个很稳的水平。希望这篇实战记录能让你少走一点弯路。