news 2026/9/16 6:06:59

基于TCPC+负载开关+MCU架构给嵌入式产品升级USB PD功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于TCPC+负载开关+MCU架构给嵌入式产品升级USB PD功能

1. 为什么用“TCPC + 负载开关 + MCU”这个组合给设备加 USB PD

说白了,USB Power Delivery 不是往 MCU 里塞一段协议栈那么简单。它牵扯到 Type-C 的 CC 引脚检测、VBUS 电压等级切换、功率路径保护、还要跟充电器/受电设备完成一整套协商状态机。这次项目要做的事,是把一台老设备的 USB-C 口从“只能 5V 充电”升级成完整 PD 功能,支持按照 USB PD 协议协商到 9V、15V 甚至 20V,并且角色上还能做双角色(既能当 Sink 吃电、也能当 Source 供电)。

我最终选的方案是三颗料协同:PTN5110 负责 Type-C 物理层的检测和 PD 的收发,NX20P5090 管 VBUS 功率路径的通断和保护,主控 R7KA8D2KFLCAC 跑 TCPM(Type-C Port Manager)策略。整套东西做下来,PCB 上新增的器件不多,主控完全不用换,原来那套应用代码也基本不动,只是在上面叠加了一个 PD 策略层。如果你也是做嵌入式产品、想给现有方案加 PD,这篇可以作为一份可直接参考的实操记录。

1.1 三种常见的“加 PD”路线,我为什么没走另外两条

在决定方案之前,我把市面上常见的做法梳理了一遍,大致是三条路,各有各的坑。

第一种是换一颗内部集成 PD PHY 的 MCU。像 STM32G0、STM32G4 这类带 UCPD 外设的芯片,确实能把 Type-C 检测和 PD 收发都收进 MCU 里,BOM 最省。但问题是,你得把整个主控换掉,原来的 PCB 要重画,原来的固件要移植。对一个已经在量产、主控是 R7KA8D2KFLCAC 的产品来说,这个代价太大了,而且 PD PHY 的模拟部分对 PCB 布局、参考时钟的要求都不低,风险反而更高。

第二种是挂一颗独立 PD 控制器,比如 STUSB4500 这种专门做 Sink 的芯片。它的优点是真省心,寄存器配好就能按预设的 PDO 去请求电压。但它的问题是策略太死:它主要面向“被充电的设备”,如果你要的是 DRP、要双向供电、要在协商完成后联动控制自己板上的功率开关,这颗料就不够灵活了。而且它的策略引擎是封闭的,你没法在协商中间插入自己的逻辑。

第三种就是我现在用的 TCPC + 主机策略方案。PTN5110 是标准 TCPC,它把最麻烦的物理层、BMC 编解码、CRC、重传、CC 引脚的 Rp/Rd 检测、VBUS 监测全部包掉,通过 I2C 和主控通信。主控只要按 USB-IF 的 TCPC 规范去读寄存器、收中断、发消息,PD 的状态机策略完全由固件掌握,想怎么定制都行。这条路不要求换主控,新增的 PCB 面积很小,同时保留了最大的灵活性。

我把这三个方向整理成一张对比表,方便后面的人做选型。

方案硬件改动灵活性开发量适合场景
集成 PD PHY 的 MCU换主控,重画板新产品从零设计
独立 PD 控制器(如 STUSB4500)小,加一颗芯片低,策略封闭只需要固定 Sink 请求
TCPC + 主机(本次方案)小,加两颗芯片高,策略在固件现有产品升级、DRP、需联动功率开关

实际做下来,TCPC 方案唯一的“贵”是多了一颗 PTN5110,但对大多数工业级、消费级产品来说,这颗芯片的成本完全在可接受范围内,换来的是不用动主控架构和最大的策略自由度,值。

1.2 TCPM 和 TCPC 到底是怎么分工的

很多人第一次看到 TCPM、TCPC 这两个缩写会懵,我用人话解释一下。USB-IF 规定了一套 Type-C Port Controller Interface 规范,把 Type-C/PD 的功能拆成两层。

TCPC,Type-C Port Controller,是靠近连接器那一侧的东西。它干的是苦力活:监测 CC1/CC2 引脚电平、切换 Rp/Rd 终止电阻、对 PD 报文做 BMC 物理层编码和解码、计算 CRC、处理 GoodCRC 重传、检测 VBUS 电压、产生中断事件。PTN5110 就是一颗标准的 TCPC,这些事全在芯片内部完成,主控完全不用关心一位一位怎么收发。

TCPM,Type-C Port Manager,是大脑。它跑在主控 MCU 里,负责决策:检测到设备接入之后,我是 Source 还是 Sink?我要发什么 Source_Capabilities?收到 Request 之后 Accept 还是 Reject?协商到 20V 之后什么时机去把功率开关打开?这些逻辑全部由 TCPM 这段固件决定。在本次项目里,这段 TCPM 就跑在 R7KA8D2KFLCAC 上,通过 I2C 总线指挥 PTN5110。

这个分工最大的好处是:模拟和协议细节被隔离在 TCPC 里,主控只需要面对“读寄存器、处理中断、写发送缓冲区”这种干干净净的数字接口。调试的时候,凡是遇到物理层问题,比如 CC 波形不对、CRC 一直不过,我基本不用怀疑自己的想法,直接拿仪器量 TCPC 的引脚就行。

1.3 为什么 VBUS 通路上要单独放一颗 NX20P5090

还有一层是不少人会忽略的:VBUS 不是简单拉一根线过去就完事。当协商到 20V 的时候,VBUS 上是有真实功率的,一个板子的电源路径需要承受几安培的电流,还要应对热插拔、负载短路、对端设备异常这类场景。

NX20P5090 这颗料本质上是一个“带保护的功率负载开关”。它相当于一个受控 MOSFET 加上保护电路:有过压保护、过流保护、欠压锁定、浪涌电流限制、软启动这些功能,还能通过 FAULT 脚把故障状态反馈给主控。用它的原因很简单:如果你只用一个普通 MOS 管去控 VBUS,那上游的过压、下游的短路、上电瞬间的冲击电流全得自己拿分立电路去搭,保护阈值还不准,过认证的时候会很痛苦。用这颗料,MOSFET 和保护和状态反馈都在一个封装里,主控只需要一根 EN 引脚就能控制整条功率路径。

后面我会细说硬件电路怎么搭,先把一句话记住:PTN5110 管“协议”,NX20P5090 管“功率”,R7KA8D2KFLCAC 管“脑子”。

2. 硬件电路怎么搭:三颗料各就各位

硬件层面的目标是在不改动主控原有核心电路的前提下,把 Type-C 口升级成完整的 PD 口。整个新增电路可以拆成三块:PTN5110 的检测与通信电路、NX20P5090 的功率通路、主控侧的接口连接和电源时序。

2.1 PTN5110 的最小电路与 CC 引脚处理

PTN5110 的工作电压是 3.3V,这路电源要注意干净,我直接用了主控板上现成的 3.3V,再在芯片电源引脚就近放了一颗 100nF 和 1uF 的退耦电容。它和主控之间的接口就三根线:SCL、SDA、ALERT。I2C 我建议至少跑到 400kHz,PTN5110 本身支持更高的速率,但 400kHz 是个很稳的起步点。

I2C 上拉电阻要重点说。TCPC 通信有个特点,ALERT 中断触发后主控要尽快通过 I2C 读寄存器,如果上拉电阻太大,总线上升沿太慢,在 400kHz 下容易出错。我这块板上 I2C 上拉用的 2.2kΩ 到 3.3V,实测很稳。如果总线上挂了多颗设备,再根据实际负载调整,一般 1k 到 4.7k 之间调,别图省事直接套一个 10k。

CC1、CC2 两个引脚直接连到 Type-C 连接器,中间串一颗 0Ω 或者小阻值电阻即可,但一定要加 ESD 防护。Type-C 口是经常被热插拔和人体接触的,我在这两个脚上放了低电容 TVS 管到地,不然静电打进来烧掉 PTN5110 的 CC 检测电路,返修率会很高。

ALERT 是开漏输出、低有效,需要接上拉到 3.3V,然后连到主控的一个支持外部中断的 GPIO。这个脚非常关键,后面固件的事件驱动全靠它。还有一个 RESET_N 引脚,我建议不要直接悬空,给它接一颗 0.1uF 的电容到地,保证上电时有一个干净的复位脉冲;有些板子会用主控 GPIO 去控制它做软复位,这也是可以的,但最少要有上电自动复位。

VBUS 的检测,PTN5110 有一颗 VBUS 感知引脚,用来监测连接器上的 VBUS 电压。由于 VBUS 在 PD 协商后可能到 20V,不能直接进芯片,我用了两颗电阻组成分压网络,把 20V 分到 3.3V 以下。分压电阻的阻值要稍微注意静态功耗,我用的 100k 和 20k 的分压,静态电流很小,不影响功耗预算。

2.2 NX20P5090 的功率路径设计

NX20P5090 的接法要分角色来看。如果产品是做 Sink 的,VBUS 从连接器进来,经过 NX20P5090 再到板上的充电管理电路;如果产品是做 Source 的,VBUS 从板上的电源转换电路出来,经过 NX20P5090 再到 Type-C 连接器。我这个项目是双角色,所以原理图上是把连接器和板内电源都引到了 NX20P5090 的两侧,用 EN 引脚决定功率流向。

EN 引脚直接接主控 GPIO,注意默认状态下必须保证 EN 是低电平。我在 EN 上加了一颗 100k 下拉电阻,防止主控还没初始化的时候 VBUS 被意外接通。上电瞬间如果 VBUS 先到、功率开关却还没配好,很容易把后级电路打坏,这个下拉电阻就是第一道保险。

电流限制的配置要看 NX20P5090 的规格,这类负载开关一般会有 ILIM 引脚或者相关配置,用一颗电阻设定过流保护点。我按产品实际最大负载电流再加 20% 余量来选的电阻。这里有个经验,电流保护点不要卡得太死,因为热插拔瞬间会有容性负载的浪涌电流,如果保护阈值刚好等于额定电流,开机的瞬间就会被自己保护掉,表现为“一接上就断电”。

输出端的电容要按负载开关的软启动时间来选择。NX20P5090 内部有浪涌电流限制和软启动,但外部电容太大一样会拖慢 VBUS 的上升,太慢会导致对端设备认为供电异常。我实测下来,输出端放 10uF 到 22uF 是比较合适的范围,既能稳压又不会让 VBUS 爬升太慢。

2.3 主控 MCU 侧的接口连接与上电时序

R7KA8D2KFLCAC 这颗主控在接口上只需要付出一个 I2C 外设、一个 ALERT 外部中断 GPIO、一个 EN GPIO、一个可选的 FAULT GPIO。对于一颗 Cortex-M 内核的高性能 MCU 来说,这几乎是零负担。画板的时候,这几个 GPIO 尽量选在一起,方便固件初始化,也方便调试时用万用表勾波形。

上电时序是我这次特别注意的点。PTN5110 的 3.3V 和主控的 3.3V 如果来自同一个电源轨,问题不大;如果是分开的,要保证 PTN5110 先上电或者同时上电。因为 PTN5110 处于 Dead Battery 模式时,要靠 VBUS 或自身 VDD 来维持 CC 引脚的 Rd 下拉,这样才能让已经插着的充电器识别到设备存在。如果主控都跑起来了 PTN5110 还没上电,设备插上充电器会完全没反应,这个问题非常隐蔽。

另外,主控 I2C 引脚如果和别的设备共用总线,要注意 PTN5110 的地址不能冲突。PTN5110 的 I2C 地址和 ADDR 引脚配置有关,我按数据手册的默认配置设的地址,画板前先确认总线上没有第二颗同地址设备,否则初始化的时候总线会乱成一锅粥。

3. 固件落地:把 TCPM 状态机跑起来

硬件焊完只是开始,真正的大头在固件。我这次没有用全套商业 PD 协议栈,因为产品角色和策略并不复杂,而且用商业栈一旦要定制行为,反而被它的框架绑住手脚。我选择基于 TCPC 规范从零写一个精简的 TCPM,总体代码量不大,但能把 PD 协商的每个环节都掌控在自己手里。

3.1 第一步:I2C 通道先打通 PTN5110

写任何 PD 固件之前,第一件事是把 I2C 读写打通,能正确读到 PTN5110 的 Device ID。TCPC 规范的寄存器布局大体是通用的,比如 Device ID 位于寄存器映射的开头、Alert Status、Power Status、Fault Status 这些都有固定偏移,PTN5110 遵循这套布局。我在工程里定义了一个简单的寄存器访问层,封装成下面这种接口。

#define TCPC_REG_DEVICE_ID 0x00 #define TCPC_REG_ALERT 0x02 #define TCPC_REG_ALERT_MASK 0x04 #define TCPC_REG_POWER_STATUS 0x06 #define TCPC_REG_FAULT_STATUS 0x07 static uint8_t ptc_read8(uint8_t reg) { uint8_t val = 0; uint8_t addr = PTN5110_I2C_ADDR; /* I2C 发送寄存器地址,然后读取一个字节 */ i2c_write(addr, &reg, 1); i2c_read(addr, &val, 1); return val; } static void ptc_write8(uint8_t reg, uint8_t val) { uint8_t addr = PTN5110_I2C_ADDR; uint8_t buf[2] = { reg, val }; i2c_write(addr, buf, 2); }

初始化函数里,上电后先读 Device ID,校验是不是预期的芯片型号;然后配置角色(Source、Sink 或 DRP)、配置 I2C 速率、把不需要的中断事件屏蔽掉、最后使能芯片。有一个小细节,先把 Alert Mask 配好再使能中断,否则芯片初始化那一下会冒出一堆无关事件,把主控中断打得焦头烂额。

void ptn5110_init(void) { uint16_t dev_id = ptc_read16(TCPC_REG_DEVICE_ID); if (dev_id != PTN5110_EXPECTED_ID) { /* 打印错误,挂在这里等复位 */ return; } ptc_write16(TCPC_REG_ALERT_MASK, ALERT_TX_SUCCESS | ALERT_RX_MSG | ALERT_CC_STATUS | ALERT_POWER_STATUS | ALERT_FAULT); /* 配置为双角色端口,启用 CC 检测 */ ptc_write8(TCPC_REG_ROLE_CTRL, ROLE_DRP); ptc_write8(TCPC_REG_COMMAND, TCPC_CMD_START); /* 使能 ALERT 中断 */ gpio_irq_enable(ALERT_PIN, GPIO_IRQ_FALLING_EDGE); }

这层封装后面所有代码都复用,建议做得足够薄,别在里面夹业务逻辑,不然调试中断的时候分不清是 I2C 的问题还是策略的问题。

3.2 第二步:事件中断驱动状态机

PD 协商是事件驱动的,TCPC 永远不会主动执行你的策略,它只会把事件通过 ALERT 引脚抛给你。固件的核心就是一个中断里读 Alert Status,然后根据事件类型调用对应的处理函数。我这次的设计用了一个事件循环加一个简单的 PD 状态机结构。

#define PD_STATE_DISABLED 0 #define PD_STATE_ATTACH_SNK 1 #define PD_STATE_ATTACH_SRC 2 #define PD_STATE_NEGOTIATION 3 #define PD_STATE_READY 4 #define PD_STATE_ERROR 5 static volatile uint8_t pd_state = PD_STATE_DISABLED; void ptn5110_alert_isr(void) { uint16_t events = ptc_read16(TCPC_REG_ALERT); if (events & ALERT_CC_STATUS) { handle_cc_change(); } if (events & ALERT_RX_MSG) { handle_rx_message(); } if (events & ALERT_TX_SUCCESS) { handle_tx_success(); } if (events & ALERT_FAULT) { handle_fault(); } /* 写 1 清除已经处理的事件 */ ptc_write16(TCPC_REG_ALERT, events); }

注意,读 Alert Status 之后一定要把对应位写 1 清除,否则中断会一直触发。这个规则和大多数 GPIO 中断清除方式不同,我第一次写的时候漏了这步,现象就是主控一直进中断,其他任务全部卡死。如果你调自己的板子遇到“系统像死机一样”,先怀疑这个。

3.3 第三步:PD 协商与功率开关的联动

从事件到 PD 协商,最关键的一段逻辑是收到消息后的处理。以设备作为 Sink 被充电为例:CC 检测到 Source 接入之后,PTN5110 会收到 Source 发来的 Source_Capabilities 消息,里面带了若干个 PDO(比如 5V/3A、9V/3A、20V/5A)。TCPM 要做的就是解析这些 PDO,从中选一个合适的,回一个 Request 消息。

static void handle_rx_message(void) { uint8_t count = ptc_read8(TCPC_REG_RX_COUNT); uint16_t header = ptc_read16(TCPC_REG_RX_HEADER); uint8_t data[28]; uint8_t msg_type = header & 0x1F; ptc_read_buf(TCPC_REG_RX_DATA, data, count); switch (msg_type) { case PD_MSG_SOURCE_CAPS: /* 解析 PDO 列表并选中一个 */ select_pdo_and_send_request(data, count); break; case PD_MSG_ACCEPT: pd_state = PD_STATE_NEGOTIATION; break; case PD_MSG_PS_RDY: /* 电压已经切换完成,可以接通功率路径 */ pd_state = PD_STATE_READY; gpio_set(EN_NX20P5090, 1); break; case PD_MSG_REJECT: pd_state = PD_STATE_ERROR; break; default: break; } }

发送 Request 消息的代码也不复杂。先往 TX 缓冲区写入消息头和数据,然后写发送命令。PD 消息的 32 位 PDO/RDO 在构造的时候,电压字段每格是 50mV,电流字段每格是 10mA,构造 Request 时要按照这个粒度去编码。我封装了一个统一的发送函数:

static void pd_send_request(uint32_t rdo) { uint16_t header = (1 << 12) | (PD_DATA_REQUEST << 0); /* 1 object, Request */ ptc_write16(TCPC_REG_TX_HEADER, header); ptc_write_buf(TCPC_REG_TX_DATA, (uint8_t *)&rdo, sizeof(rdo)); ptc_write8(TCPC_REG_TX_COUNT, sizeof(rdo)); ptc_write8(TCPC_REG_COMMAND, TCPC_CMD_TRANSMIT); }

完整的协商状态机大致是这样一条链路:TCPM 收到 Source_Capabilities → 选出目标 PDO → 构造 Request(含目标 PDO 位置、请求电压电流)→ 发送 → 等待 Accept → 等待 PS_RDY → PS_RDY 到达后置位 EN 引脚,让 NX20P5090 把功率路径接通 → 进入 Ready 状态。这套流程看着简单,但每一步都受 PD 协议的超时约束,Source 如果在一定时间内等不到你的 Request,或者你在 PS_RDY 后迟迟不拉功率,它会认为设备异常,可能直接断开或回到 5V。

3.4 两个容易被忽略的时序细节

时序上我踩过两个坑,值得单独拿出来说。

第一个是 PS_RDY 之前不能提前拉 EN。刚开始调试的时候,我为了图省事,在收到 Accept 之后就立刻把 NX20P5090 打开了,结果 VBUS 电压还在从 5V 往 20V 爬升的过程中,负载就提前挂上去了,造成很大的冲击电流,甚至把一次协商直接搞挂。正确的做法是等 PS_RDY 消息到达,它表示电压转换已完成、Source 已经准备好带载,这时再开 EN。把 EN 的时序和 PS_RDY 绑定,是这次项目里最值得记住的一条经验。

第二个是在做 Source 的时候,EN 的打开要更谨慎。当一个 Sink 被识别接入,我一开始是立刻把 VBUS 送出去,后来发现有些廉价的 Sink 设备在协商没完成前就从 VBUS 抽电,导致协议没跑完就被打乱。后来我改成在 Source_Capabilities 发出、并且收到合法 Request 之后再开 EN,把默认 5V 的送出时机也挪到了检测到 Sink 接入之后,问题就没了。简单说,Sink 侧等 PS_RDY,Source 侧等 Request,两边都不能手快。

4. 联调实录:从“没反应”到 20V 输出

硬件和固件第一版写完后,联调才是最刺激的阶段。我大概花了整整两天,从完全没反应到稳定输出 20V,中间经历了几个非常典型的坑。这里整理成速查表,方便你对照自己遇到的症状。

4.1 常见问题速查表

现象可能原因排查与解决办法
插上充电器完全没反应PTN5110 没上电或未退出 Dead Battery 模式量 3.3V 电源、ALERT 引脚电平,确认主控初始化时已配置芯片
I2C 读写超时或数据错误上拉电阻过大、速率过高、总线挂死检查上拉阻值,降到 2.2k 试试;复位 PTN5110 和 I2C 外设
主控频繁进中断像死机Alert Status 没有写 1 清除确认中断处理末尾执行了“写 1 清事件”
CC 检测到接入但协商超时PTN5110 的 Power Status 里 VBUS 状态不对用万用表量 VBUS 分压电阻,确认检测引脚电压在合理范围
协商成功后负载一挂就掉电NX20P5090 过流保护点设太低按峰值电流加 20% 余量重新选择 ILIM 配置
Source 设备接上后 5V 不稳EN 打开瞬间浪涌过大检查输出电容是否过大、是否过早开 EN
使用 5A 线缆时协商失败没有启用 VCONN/eMarker 支持确认 PTN5110 的 VCONN 控制和 CC 终端配置正确
热插拔偶发死机静电或 VBUS 瞬间反冲加强 CC 引脚和 VBUS 的 ESD 防护,检查 FAULT 处理逻辑

4.2 现场排查思路和几件趁手工具

排查 PD 问题,光靠万用表是不够的。我这次最依赖的是一个带 USB PD 解码的协议分析工具,把它串在设备和充电器之间,能直接看到 CC 线上的报文交互:Source_Capabilities 有没有发出来、Request 有没有被 Accept、PS_RDY 什么时候到。没有分析仪的时候,让主控把收发的每条消息打日志也是办法,但 PD 协商的时序很快,日志打印本身可能拖慢时序,所以生产环境里主控日志要设计成“记录但不阻塞”的方式。

另外一个实用小工具是一块支持手动切换 Rp/Rd 的 Type-C 调试板。我在调试 Source 模式时,直接在调试板上把 CC 拉成 Rd,模拟一个 Sink 接进来,观察设备有没有正确送出 Source_Capabilities。反过来调 Sink 模式时,用一个 PD 诱骗器或者标准充电器就能触发。

逻辑分析仪也建议备一台。I2C 总线波形、ALERT 中断边沿、EN 引脚的翻转,这三路信号同时抓出来,基本能定位九成的问题。我自己遇到过一次“EN 翻转了但 VBUS 没上来”,就是靠逻辑分析仪发现 EN 信号在 NX20P5090 这一侧被一颗电容拉慢了上升沿,导致开关没有迅速打开。

4.3 关于 FAULT 脚的处理经验

NX20P5090 的 FAULT 输出是开漏、低有效,我在固件里把它接到了主控的一个 GPIO 中断。一旦发生过压、过流、过温,FAULT 会拉低,主控收到中断后要记录故障信息,并把 PD 状态机切到 ErrorRecovery,重新开始一轮检测,而不是死在那里。

我最初的处理是收到 FAULT 就直接关 EN,后来发现有些瞬时过流是热插拔的容性负载导致的,立刻关断会让体验很差。改成“首次 FAULT 记录并等待 100ms,再尝试恢复;连续三次故障才进入锁定状态”之后,实测热插拔的容错能力好了很多。如果你也要做类似处理,恢复逻辑里一定要加延时和次数限制,防止故障反复触发导致开关不断抖动。

5. 收尾工作:合规测试与量产前设备

联调通过不代表能直接量产,USB PD 这种带功率的接口,过了协议数据面还不够,电气特性、保护机制和可靠性都要过一遍,否则真到了用户手里,各种奇怪的充电器和线缆都能把你的设备搞出问题。

5.1 电气和协议层面值得重点验证的场景

协议层面,我建议至少覆盖这些场景:标准充电器接入正常协商、反复热插拔 100 次、协商到最高电压后满载运行、切换到低电压 PDO、双角色切换(Source 与 Sink 互换)、使用不同线缆(普通 USB2.0 线、带 eMarker 的 5A 线)验证。

我这次最深的体会是:不合格的线缆是最大的坑。有的线缆 CC 上的 eMarker 没有正确响应,或者线材压降太大,会导致协商到的电压在负载端严重跌落。如果你做的是高功率产品,线缆压降补偿这件事一定要在协议层或者硬件上提前考虑,否则用户拿一根劣质线,20V 的输出到了设备端只剩 18V,设备会莫名重启。

电气特性方面,VBUS 的过冲、浪涌电流、短路保护响应时间这三项是必测的。我有一个专门的测试步骤:在 VBUS 输出端直接短路,观察 NX20P5090 的过流保护是否快速动作、FAULT 是否正确上报、主控能不能自动恢复。如果这个场景能稳定通过,量产后的售后问题会少一大半。

5.2 量产前设备清单里最容易漏的几项

最后列一份量产前检查清单,全是这次项目里实际踩到或者听到同行踩过的坑。

第一,PTN5110 的 I2C 地址确认。出货的板子上如果 I2C 总线还挂了别的设备,一定要在产测程序里把地址冲突检测写进去,否则贴片贴出来才发现冲突,返工成本极高。

第二,ESD 防护器件不能省。Type-C 口是产品外壳上最容易被接触的接口,CC 和 VBUS 的 TVS 必须贴,而且摆放位置要尽量靠近连接器。这个不是性能问题,是可靠性问题,省下来的是几分钱,赔上的是售后返修率。

第三,固件里一定要有恢复机制。PD 协商和功率控制涉及两个芯片,任何一个状态异常,都要有看门狗或状态机超时能够回到初始状态。我的策略是:任何一步超过协议规定的超时时间,就触发一次完整的复位流程,包括复位 PTN5110、关闭 NX20P5090 的 EN、重新进入检测状态。用户体感上是“重新插拔一下就好”,但内部已经自动恢复了好几次。

第四,产测程序里要多做一步“实际协商到最高电压”的测试。很多产测只测 5V 通路和 I2C 通信,高电压协商只在研发阶段测过。量产一致性差一点,可能就有个别板子在 20V 的时候工作不稳定。产测里放一个 PD 诱骗器或者标准快充头,强制协商到最高档位,运行几秒钟,能拦下不少隐患。

做完这一整套,USB Power Delivery 功能才算是真正“加”到了产品上,不是只在实验室里能跑,而是能在用户手里各种线缆和充电器的混乱环境中稳定工作。如果你正准备给自己的主控方案加 PD,建议顺着 TCPC 这条路走,把协议层交给 PTN5110 这类专用芯片,把功率路径交给 NX20P5090 这类带保护的负载开关,自己把精力花在策略和状态机上,这条路不仅走得通,而且走得稳。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 6:06:58

生鲜行业数字化解决方案:升鲜宝系统架构与实践

1. 项目概述&#xff1a;生鲜配送与零售管理的数字化革命"升鲜宝"系统是一套专为生鲜行业设计的全链路数字化解决方案&#xff0c;它把传统生鲜经营中割裂的仓储、配送、零售环节整合成有机整体。我在生鲜行业信息化领域深耕8年&#xff0c;见证过太多企业因为系统割…

作者头像 李华
网站建设 2026/9/16 6:06:36

图莫斯CAN设备打开失败深度解析:LabVIEW驱动状态机与句柄管理

1. 项目概述&#xff1a;为什么一个“打开CAN设备”的VI值得单独写一篇深度解析&#xff1f;图莫斯&#xff08;TOOMOSS&#xff09;这个国产CAN总线分析仪品牌&#xff0c;在汽车电子、BMS、电机控制器等嵌入式开发一线早已不是新鲜面孔。但真正用过它LabVIEW驱动的人&#xf…

作者头像 李华
网站建设 2026/9/16 6:06:34

纯Transformer端到端图像质量评估(IQA)落地实践

简介&#xff1a;本资源是一套基于Transformer架构的图像质量评估&#xff08;IQA&#xff09;完整实现方案&#xff0c;面向计算机视觉方向的学习者、深度学习初学者及图像处理相关从业者&#xff0c;解决传统CNN/RNN模型在全局感知建模能力不足导致的质量评分偏差问题。压缩包…

作者头像 李华
网站建设 2026/9/16 6:03:56

NPU数据流陷阱:从ARM内存语义到NoC仲裁的四大系统级隐患

1. 项目概述&#xff1a;当“数据流”变成“数据堵流”&#xff0c;AI芯片设计里最隐蔽的坑“数据流AI芯片的陷阱——不要让算法在硬件上玩‘连连看’”&#xff0c;这个标题不是修辞&#xff0c;是我在某次车载NPU架构评审会上拍桌子喊出来的原话。当时团队正为一款基于ARM A5…

作者头像 李华
网站建设 2026/9/16 6:01:27

Flink Unaligned Checkpoint 原理与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 6:01:17

转换队列不是UI动效,而是资源调度与状态管理的复合系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华