双C口快充为何需要两颗PD芯片?主从架构深度解析
做双C口快充的人迟早会撞上这么一个问题明明一颗PD芯片也能出两路Type-C为什么原厂参考设计和量产项目反而更爱放两颗我最早接一个65W氮化镓双口充电器项目时也想着省成本用一颗多口PD控制器硬扛结果被插拔时序折磨到怀疑人生。后面切成“主控从控”的双PD芯片架构USB Type-C充电方案才算彻底跑通。Power Delivery这个东西表面上看就是CC线上发几组报文真正把一个多口充电产品做好难点全在系统级协同——谁的功率能分多少、谁先插谁后插、哪一路挂了怎么隔离这些单靠一颗芯片硬扛往往顾此失彼。这篇聊的是一套非常典型的双芯片方案一颗主控PD芯片负责全局策略一颗从控PD芯片负责第二路端口协议两芯片通过I2C协同实现多口功率动态分配。我以自己做的65W双C口氮化镓充电器为实例展开讲清楚芯片选型、硬件设计、固件策略以及调试过程中踩过的坑。1. 为什么一个充电器里要放两颗PD芯片1.1 单颗芯片做双口为什么总差一口气很多国产PD控制器宣传“单芯片双C口”芯片内部确实支持两套CC逻辑寄存器也够但真正做起产品来会碰到几个绕不过去的问题。第一是引脚和资源的物理瓶颈。PD控制器不只要处理CC1/CC2的插拔检测和协议报文还得管理两路独立的VBUS电压检测、电流采样、负载开关控制、VCONN输出。一颗芯片的GPIO和ADC通道数量是固定的同时管两路时通常只能“分时复用”或者砍功能。比如第二路经常不支持独立的PPS调压或者两路共享同一个电流采样输入导致没法精确知道每个口的实时功耗。第二是故障隔离很难做。如果两路Type-C都挂在同一颗PD芯片上某一路的CC脚被静电打坏或者VBUS上浪涌导致芯片内部逻辑复位另一个口也会跟着断。实际量产产品最怕的就是这种“一口出事全口归零”的情况特别是安规和可靠性评估阶段这种问题非常难跟客户解释。第三是协议状态机的相互干扰。PD的Source协商是有状态机约束的同一颗芯片同时维护两路Source状态机在极端时序下会出现内部信号竞争。我在调试时遇到过两个口同时插拔其中一路的Source_Capabilities发送被打断然后整个芯片协议栈卡死必须重启才能恢复。两路物理层挨得太近电磁耦合也会让CC信号质量变差。1.2 “主控从控”架构的分工边界既然单颗芯片硬扛不理想那就把一件事拆成两件事做。双芯片方案里两颗PD芯片的角色完全不一样主控芯片负责第一路Type-C的完整Source/DRP功能同时是整个系统的策略中心。它计算总功率预算、决定每一路能拿到多少瓦、处理过温过流等系统级故障。主控一般选GPIO丰富、I2C主从灵活、固件可定制的型号。从控芯片只负责第二路Type-C的Source协议协商相当于把PD协议的处理做成一个相对独立的模块。从控检测到设备插入后通过GPIO通知主控“我要开始协商了”主控批准后从控才允许设备发起Request。发生故障时从控先把本地输出断开同时上报主控。这样拆完以后优点很明显两路的协议状态机完全隔离每路出问题只影响自己开发可以并行硬件调试时每一路都能独立验证后续扩展第三路只需要再加一个从控主控的策略逻辑不用大改。2. 65W双C口方案的芯片选型逻辑2.1 主控选TPS65994AD的理由我这次做主口的主控芯片用的是TI的TPS65994AD。之所以在这么多PD控制器里选它核心是看中它的接口资源和可编程性。TPS65994AD集成了完整的PD3.0协议栈和PPS支持内部带ARM核可以通过固件配置实现比较复杂的系统策略。它最强的部分是接口资源多路GPIO可以接负载开关、温度采样、LED状态I2C主从都支持这意味着它可以主动去读从控芯片的状态不需要外部再挂一颗MCU来仲裁。对双口方案来说主控拥有I2C主能力非常关键很多PD芯片只能做从机那就得额外配MCU做总控成本和开发量都上去了。另外它还集成了VBUS路径控制逻辑可以直接驱动外部N-MOS省掉专门的栅极驱动芯片。Type-C座子到PD芯片之间的电压检测、电流检测它内部都有对应通路外围不需要再放大堆运放。2.2 从控选CYPD3175的思路从口我选了英飞凌CYPD3175这是CCG3PA系列的老将在适配器受电端/供电端都大量出货专门为电源适配器场景优化过。它最吸引我的一点是外围极其简单。CYPD3175内部集成了MCU、协议栈、高压LDO还有专门给反激适配器用的反馈控制脚可以直接连接光耦来控制输出电压。对我们这种用氮化镓反激架构的充电器来说从口做20W输出时不需要另加辅助控制芯片CYPD3175自己就能把电压环路稳住。它原生支持PD3.0和PPS电流和电压精度都够。成本比主控低不少用在第二路不心疼。更重要的是它可以配置为纯I2C从机主控通过I2C就能修改它的输出功率限制这正好满足我们的主从协同需求。2.3 为什么不用两颗同型号芯片有人会问既然两颗芯片要互相通信为什么不直接用两颗相同的PD控制器这样软件不是更好维护吗我实际对比过这个方案发现坑更多。首先I2C地址冲突很麻烦两颗同型号芯片的从机地址通常一样需要靠硬件引脚拉高低来区分白白占两个GPIO其次两颗芯片都内置完整的策略层那到底谁听谁的系统里没有一个天然的仲裁者往往得再加MCU成本反而更高。每颗芯片的GPIO资源都一样但你第一路需要的大电流路径控制和第二路需要的支持逻辑完全不是一个量级用两颗高配芯片属于典型的浪费。异型号组合的核心思路是让从控成为“会说话的哑巴”只做协议翻译不做决策主控做“大脑”掌握所有功率和故障信息。职责清晰故障才好定位。我把两颗芯片的关键差异做了个表方便你在选型时快速对号入座对比项TPS65994AD主控CYPD3175从控协议能力PD3.0/PPS可扩展EPRPD3.0/PPS工作角色Source/Sink/DRPSource为主内置处理器ARM核策略可定制MCU协议栈固化I2C角色主/从从功率路径支持外部NMOS驱动适配器源端反馈控制外围复杂度中低成本量级中高中等偏低3. 硬件上必须盯住的三个关键链路3.1 CC引脚的钳位保护网络PD芯片的CC1/CC2引脚是直接连到Type-C座子上的插拔瞬间、静电放电、甚至线缆反接时最先冲击的都是这里。很多硬件工程师在调试阶段不装ESD保护也能正常工作一旦送去打静电就原形毕露。我的做法是在靠近Type-C座子的位置放一颗低结电容TVS管结电容尽量小于2pF否则会影响CC线上的信号上升沿导致握手失败。另外Source端CC线上必须要有Rd下拉电阻也就是标准的5.1k电阻让对端Sink能识别出这是一个电源输出口。优先使用PD芯片内部的Rd不要在外面额外并联一个5.1k电阻否则等效下拉阻值会偏离标准插拔检测可能出现误判。如果参考设计确实要求外挂也要确认并联后的等效值在5.1k±5%以内。还有一个很多人容易漏掉的VCONN。如果你的产品要支持带emark芯片的线缆必须在VCONN引脚上预留供电通路。这颗主控可以内部切换VCONN来源从控那边则简单一些直接在CC2上挂个LDO备用即可。3.2 VBUS功率路径从65W到20W的取舍主口要做到65W输出典型档位是20V/3.25A从口20W一般走9V/2.22A或者15V/1.33A。两路功率等级不同VBUS路径的器件选择逻辑也不一样。主口的负载开关要按20V/3.25A选型RDS(on)最好低于30mΩ同时要留1.5倍以上的电流裕量也就是峰值按5A算避免开关管长期高温老化。从口20W对开关管要求就宽松很多RDS(on)放宽到50mΩ以内都能接受成本和尺寸都能降下来。电流采样电阻的位置也值得纠结。高边采样精度高、安全性好但采样信号需要电平移位驱动和保护电路复杂低边采样简单方便但共模干扰大而且要特别小心负载短路时产生的地弹。PD芯片内部如果带电流检测通路优先利用外部采样电阻的走线要采用开尔文接法两根采样线分别走到电阻两端不要并行走线否则采样电压会被寄生电阻干扰。VBUS滤波电容的容值也要克制。Type-C座子端需要放0.1uF加10uF左右的混合电容来抑制EMI但电容太大时插入瞬间的浪涌电流会非常大而且VBUS的充放电时间可能超出PD规范中tVBUSon的要求导致对端识别电源就绪失败。我在原型机上一开始放了2个22uF陶瓷电容结果用协议分析仪看PS_RDY时序发现VBUS上升到稳定电压的时间比规范上限多了近1ms后面减到10uF才正常。3.3 I2C总线和中断线的整体设计双芯片协同依赖I2C而I2C通信的稳定性是整个系统的命脉。我采用主控TPS65994AD作为I2C主从控CYPD3175作为I2C从另外还可以把一颗MCU挂在同一条总线上做调试监控但正常运行时不让它参与仲裁避免多主冲突。从控的I2C地址要通过硬件引脚预先配置好确保和总线上其它设备不冲突。I2C上拉电阻的选择是按总线上设备数量和通信速率来的。400kHz模式下用2.2k到4.7k的上拉电阻比较常见。阻值太大上升沿变缓时序宽松度不够阻值太小灌电流过大芯片IO可能承受不住。两条主控芯片的I2C电平如果不一样还要在中间加电平转换电路我是直接让两颗芯片都工作在3.3V这个档位省掉转换芯片但这个要在选型阶段就确认好不能等画板时才想起来。中断线的处理原则是每颗PD芯片的INT线接主控的独立GPIO不要并联。如果并联主控只能通过读寄存器来区分是哪个端口触发了事件读寄存器本身又依赖I2C一旦通信出问题连故障定位的能力都没了。分线之后主控可以在几微秒内知道是哪一路插入、拔出或者报错对处理插拔竞态非常关键。4. 固件与策略两颗芯片是怎么“商量”功率的4.1 PD协商的基础链路要理解两颗芯片之间怎么配合先得清楚PD协商的基本流程。Source端作为充电器会主动发送Source_Capabilities消息告诉对端“我能提供哪些电压电流组合”通常包括5V/3A、9V/3A、15V/3A、20V/3.25A这些PDO。Sink设备从中选一组自己想要的回复Request消息。Source收到后先发Accept然后调整VBUS到目标电压再发PS_RDY表示电源已就绪。PPS模式则更进一步Sink可以更细粒度地请求电压电流电压以20mV步进、电流以50mA步进调整这非常适合手机直充场景。双芯片方案里要重点想清楚的是Source_Capabilities该怎么发、Request能不能被接受这不该由每颗芯片各自决定而应该由系统层面的功率预算决定。4.2 功率分配的决策流程我在这套方案里做的是“主控预授权”模式而不是“每次请求都实时仲裁”。具体实现是主控在初始化时根据当前各端口状态给从控写入一个“最大允许功率”的授权值。从控收到协议层的Request之后只做一件事情看请求功率有没有超过预授权值。没有超过就直接正常走Accept流程超过了就降级到低功率PDO或者拒绝。也就是说从控在协商过程中不需要回头问主控这样处理延时会低很多协议时序上更安全。假如每次Sink发Request都要从控先通过I2C问主控“我能答应吗”主控再算一遍再回复一次I2C读写消耗几十微秒PD协商时序虽然没那么苛刻但并发场景下容易出现排队尤其两个口同时插拔时两路都在做I2C访问延迟抖动会被放大。预授权模式牺牲了一点灵活性换来了稳定。我把系统里的功率状态整理成了一张表场景主口状态从口状态系统总功率只有主口工作65W20V/3.25A无输出65W只有从口工作无输出20W9V/2.22A20W双口同插从口请求20W45W15V/3A20W9V/2.22A65W双口同插从口小功率55W20V/2.75A10W5V/2A65W过温降额45W10W55W主控根据这些状态变化通过I2C向从控更新预授权值。从控不保存系统级的功率策略只保存一个“当前最大不能超过多少瓦”的数字。4.3 插拔时序和竞态处理双口充电器最容易出问题的是两个口同时插入。从控检测到CC信号变化后会立刻通过GPIO拉高中断线。主控收到中断后第一步不是去读详细状态而是先把从口的预授权功率算出来并写入从控然后才允许从控进入Source协商流程。这个顺序不能反。如果从控先进入协商在预授权功率还没更新的情况下它发出的Source_Capabilities还是旧的。比如当时预授权为0但它已经按默认配置发出支持9V/3A的PDO正好Sink请求9V/2A这时候从控又拿不到新授权只能拒绝或者表现异常。处理拔除事件同样有讲究。当某个Sink设备被拔走主控理论上可以把多出来的功率分给还在工作的那个口但PD协议里Source不能随意修改已经协商好的PDO。换句话说拔掉从口后主口“不会自动变成65W”除非主口上的Sink重新发起一次协商请求。所以不要在产品宣传里承诺“任意口热插拔后自动提升到65W”这在标准PD协议下实现起来会伤害用户体验除非用厂商私有协议或者主动发起重协商。这一点是我调试过程中印象最深的地方。4.4 故障场景过流、过温、断线过流保护通常是靠负载开关自身完成的开关管会在电流超过阈值后直接断开同时给PD芯片发一个故障信号。从控把故障信息通过中断线报告给主控。主控处理时会把从口预授权功率清零避免从控反复尝试协商。过温降额是我加了温度采样之后才完善的。氮化镓充电器整机小散热紧张持续双口满功率运行两三小时机内温度能到80℃以上。我在主控的ADC上接了NTC热敏电阻超过70℃阈值时主控将总功率预算从65W降到55W优先保证主口从口最多只能输出10W。这样整机温度回落后还能再恢复65W。5. 实测复现的那些坑和调试方法5.1 协议分析仪上出现的“二次Request被NAK”第一次把整个双口逻辑调通后我接上协议分析仪做时序验证。测试动作是先把一个负载设备插到从口协商到9V/2.22A正常然后拔掉再重新插回去结果第二次只能协商到5V/3A请求9V被NAK。排查过程花了两天。最后发现是拔除事件处理时主控更新了从控的预授权功率但从控侧没有清掉上一次协商时缓存的“请求失败记录”导致它在下一次收到9V的Request时认为功率受限直接NAK。协议分析仪只显示从控拒绝不会告诉你它内部策略是什么。修法是在主控写入新预授权值后让从控做一次软件复位级别的状态重置清除内部缓存。这个操作不能通过I2C直接写某个寄存器实现得在从控固件配置里把一个“重新协商”标志打开。原厂的配置工具里这种选项容易被忽略。5.2 插头瞬间的VBUS负压毛刺示波器挂在Type-C座子VBUS引脚上插头接触瞬间抓到一个约-1.1V、持续2us的负压毛刺。这个毛刺的来源是Type-C座子端的输入电容插头插入瞬间电容通过接地路径放电电流突变在功率地回路上产生负压。负压会灌到PD芯片的VBUS检测引脚长期累积容易损伤芯片内部的ESD二极管。我加了两个措施一是在VBUS检测通路串联一个1kΩ电阻限制反向电流二是在负载开关输出侧并联一个防反灌的快恢复二极管把负压钳位在-0.3V以内。再次打静电和做插拔实验毛刺明显减小。5.3 静电枪打一次就协议卡死送测静电时±8kV接触放电打Type-C座子主口还能工作但从控状态机直接卡死CC线不再响应任何请求。之所以从控先挂是因为它离座子更近而且CC线上没有加低容TVS。整改动作有两个。第一是在座子到从控CC引脚之间加低容TVS靠近座子放。第二是在从控复位引脚上把复位低电平时间拉长到20ms以上确保静电引起的瞬间掉电后芯片能稳定复位并重新和主控完成I2C枚举。如果复位时间太短主控还没准备好从控可能一直处于半初始化状态表现就是“不响应不报错死得很安静”。5.4 老化测试暴露的功率分配缺陷第一次做高温老化让主口持续跑65W从口跑20W两小时后测外壳温度到了79℃。主控附近温度最高因为主控承担了主要的协议处理和功率路径控制。后来我加入了过温降额逻辑同时调整了PCB布局把主控从氮化镓功率级附近挪开一点。温度降到65℃时降额手段才第一次生效。这也提醒我功率分配不只是逻辑层的事还要和热设计联动。6. 这套架构往后还能怎么扩展双芯片方案在65W双C口产品上验证通过后我发现它其实是一套可以横向复用的系统架构。如果要做三口充电器只需在I2C总线上再挂一个从控芯片主控策略层增加一个“第三口”逻辑。I2C地址要提前规划最多可挂的设备数量由地址位决定不够就用I2C交换机扩展。功率分配从两路变成三路算法复杂度会上升但核心的“预授权”思想不变只是要更加注意各端口请求的优先级排序。如果要做PD3.1 EPR也就是140W甚至更高功率的方向主控选型要选支持EPR的型号从控可以继续用成熟偏中低成本的方案。但硬件上必须同步升级VBUS路径上的MOS耐压要能扛28V负载开关电流等级要按5A以上选电缆本身也得支持EPR标记。PD3.1还带来了AVSAdjustable Voltage Supply电压调节步进更细功率分配会比PD3.0平滑很多多口场景下的策略可以做得更精致。最后分享一个我个人的项目体会两颗芯片看起来比单芯片多买了一份料但它把协议处理、功率分配、故障隔离这几个问题彻底拆开了。调试时每一路都能单独验证出问题时定位也快。用顺了这套主从架构后面做三口、做EPR都只是加节点、改权限的问题不用把底层逻辑推翻重来。如果你正准备做多口快充产品建议直接从这个主从架构起步。