ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

S32K144+TPS929120 LED尾灯“灯关不死”漏电流排查与修复

S32K144+TPS929120 LED尾灯“灯关不死”漏电流排查与修复 这批尾灯控制板开始暗室测试后测试员问我的第一句话就是灯怎么关不死我下意识看了一眼PWM配置占空比已经写到0%代码逻辑也没有问题。但示波器夹在LED负极那一脚确实量到了接近1.2mA的静态电流。这块板子的主控是S32K144通过FlexWire总线下挂一颗TPS929120驱动12通道LEDPWM调光、亮度曲线、故障上报全靠这颗驱动芯片完成。按理说TPS929120本身就是车规级LED驱动器不该出现这种低端问题问题多半出在我自己的硬件和软件配合上。这篇避坑实录写给正在用S32K144加TPS929120做尾灯、氛围灯、日行灯控制板的工程师尤其是板子刚打样回来、正准备调PWM的同学。我会按实际项目推进的顺序把从原理图设计到FlexWire初始化再到漏电流定位和修复的全过程讲清楚最后补充几个S32K144调试时几乎人人都会撞上的锁死问题。1. 这套方案的选型逻辑为什么是S32K144 TPS929120不少人看到S32K144和TPS929120的组合第一反应是“一个MCU加一颗LED驱动而已有什么好讲的”。但车灯控制这类应用选型不是看单颗芯片能干什么而是看组合之后能不能满足整车厂的可靠性和诊断要求。1.1 一颗MCU和一颗LED驱动各自的分工S32K144这颗MCUCortex-M4F内核主频80MHz带CAN FD、LIN、LPUART、FlexIO工作温度范围是车规级。项目里我选它核心原因是它直接挂在整车CAN总线上BCM发过来的灯光控制报文、亮度等级、故障诊断请求都由S32K144负责解析然后转换成具体的PWM亮度值下发给LED驱动。如果你只用一颗普通的MCU也能驱动LED但遇到多通道恒流、开路短路诊断、热关断保护这些事情外围电路会非常复杂而且很难达到车规可靠性的要求。TPS929120负责的事情就纯粹多了12通道恒流LED驱动每通道最大电流几十毫安具体由ISET引脚的电阻设定。它内部有12位PWM发生器意味着4096级调光这在尾灯和氛围灯场景下足够细腻。再加上看门狗、CRC校验、开路短路诊断、热关断保护基本把LED驱动该有的安全机制都覆盖了。1.2 为什么用FlexWire而不是SPI这是原理图设计之前就要想清楚的问题。TPS929120的通信接口是FlexWire本质上是一种基于UART物理层的半双工单线协议而不是SPI。很多工程师习惯性看到“驱动芯片”就画SPI结果发现引脚对不上还得返工。对比项FlexWireSPI通信线数1根信号线加地线至少4根SCLK、MOSI、MISO、CS多芯片级联支持地址编码和菊花链每颗芯片都需要独立CS或者另做级联逻辑错误校验帧内带CRC通常没有内建校验需要软件实现汽车环境适用性单线抗干扰适合短距离板内走线高速时钟容易辐射需要更仔细的布局我当时选FlexWire除了TPS929120只支持这个接口之外还看中它只需要一根线传输数据。灯光控制板在整车上通常放在尾灯内部空间紧张线束越少越好。而且FlexWire的CRC校验可以帮我快速发现通信异常这在整车电磁干扰环境下特别实用。1.3 系统工作流程整个系统的数据流是这样跑的BCM通过CAN总线发送灯光控制报文S32K144收到后解析出目标亮度值然后把亮度值映射成12位PWM占空比再通过FlexWire把配置写入TPS929120。TPS929120根据写入的PWM寄存器和电流设定值以恒定电流的方式驱动每一路LED。这里有一个容易被忽视的点S32K144只是下发配置并不参与PWM波形的产生。PWM调光完全由TPS929120内部完成。好处是MCU负载很轻坏处是如果MCU和驱动芯片之间的寄存器配置不同步或者初始化顺序不对就会出现各种“感觉像是硬件问题”的软件故障。后面要讲的漏电流问题就有一部分原因是出在初始化顺序上。2. 原理图设计里最容易翻车的四个细节原理图设计是整个项目里最考验经验的环节。TPS929120数据手册上的参考电路看起来简单实际画板时有很多细节决定了后面调试是否顺利。我在这块板子上踩了几个坑挑重点讲。2.1 电源和NSLEEP使能脚的时序设计TPS929120的VS引脚直接接车载12V电源但不是说接上去就完事。VS脚的去耦电容不能省100nF加10μF的组合是基本盘而且要尽量靠近VS引脚放置走线要短。车载电源的瞬态冲击很猛VS脚前面我加了一颗TVS管和防反接电路避免电源反接或者抛负载时把芯片打坏。更关键的是NSLEEP脚。这个引脚高电平让芯片进入工作状态低电平进入低功耗睡眠。很多参考设计直接把NSLEEP用电阻上拉到VIO看起来没问题实际上上电瞬间TPS929120会比MCU更早进入工作状态。此时S32K144的LPUART引脚还在复位状态FlexWire总线上的电平不确定TPS929120可能把这段垃圾信号当成有效帧解析轻则通信初始化失败重则在没配置的情况下输出不确定状态LED闪一下甚至微亮。我的做法是用S32K144的一个GPIO单独控制NSLEEP并加一个10kΩ下拉电阻保证上电时默认低电平。软件启动流程里先初始化LPUART再拉高NSLEEP让TPS929120进入工作状态。这样能保证芯片醒来的时候总线已经处于正确的空闲电平不会收到乱码。2.2 输出通道外围LED灯串、ISET电阻和电容的位置TPS929120是恒流驱动LED灯串正极接电源负极接OUTx引脚。每路的最大电流由ISET电阻决定我这里按每路20mA设计电阻值按数据手册公式计算实际用的是42.2kΩ的1%精度电阻。计算时注意ISET电阻的精度直接影响各路电流一致性不要用5%的普通电阻。输出通道上最容易犯的错是并电容。为了过EMC测试很多人习惯在每个OUTx引脚对地并一个100nF电容这在普通LED驱动板上可能没事但在PWM调光场景下会出问题。100nF电容会让PWM边沿变缓还会在PWM关闭后储存电荷给LED提供一个缓慢放电的电流路径表现就是关断后LED有余辉暗室里特别明显。PWM调光通道上就算要加电容也只能加100pF到1nF级别的小电容或者干脆不加靠布局来控制EMC。2.3 输出端下拉电阻位置预留这次漏电流问题折腾了我一个晚上根源之一就是原理图阶段没在OUTx输出端预留下拉电阻位。LED负极和OUTx引脚之间最好预留一个并联到地的电阻位阻值先贴0Ω或者干脆不贴。一旦调试时出现“PWM关闭但LED微亮”这种问题你直接在这个预留位上焊一颗2.2kΩ或者10kΩ电阻就能验证方案不用飞线不用改板。这个习惯我后来沿用到了所有LED驱动电路上成本几乎为零但调试效率提升很大。2.4 FlexWire物理层电平匹配、共地和走线分叉S32K144的IO电平是3.3VTPS929120的VIO如果接3.3V两边电平可以直接对接。如果VIO接了5V就需要串阻或者电平转换否则S32K144的IO会被拉高长期工作可能损坏引脚。FlexWire走线尽量做到点对点从S32K144的LPUART TX引脚到TPS929120的SDO引脚之间串联一个22Ω电阻既能抑制振铃又能在调试时作为断开点。如果板上挂了多颗TPS929120做菊花链信号线要从一颗芯片的SDO出来再到下一颗芯片的SDI不能中途分叉成星型结构否则反射会让波形乱掉通信误码率急剧上升。3. FlexWire通信初始化从波形到寄存器的踩坑记录原理图没问题之后真正的调试从点亮第一颗LED开始。FlexWire初始化看似简单实际跑起来遇到一堆问题。我在这里讲的初始化顺序和参数都是这次项目验证过的可以直接参考。3.1 LPUART参数和FlexWire报文的基本形态FlexWire基于UART我用的S32K144 LPUART配置是8位数据、偶校验、1位停止位波特率500kbps。开始选过1Mbps后来发现板内走线较长时波形边沿不够干净降速到500kbps之后通信非常稳定。对于大多数车灯应用500kbps的速率完全够用没必要追求高速。FlexWire的报文帧里包含设备地址、帧类型、寄存器地址、数据和CRC字段。具体到每一位的定义以TPS929120数据手册为准。这里提醒一句FlexWire不是标准UART协议不能拿一个串口助手随便发数据就指望芯片响应帧格式必须和手册严格对应。调试时有个很实用的验证方式上电后先发一条读状态寄存器命令看返回的数据是否能正确解析。如果读回来的CRC一直校验失败先别怀疑芯片用示波器看看SDO线上的波形高电平是不是能达到VIO电平低电平是不是能拉到接近0V边沿是否过缓。3.2 上电初始化顺序先关输出再配PWM这部分是漏电流问题排查中很重要的一环。TPS929120上电复位后各寄存器的默认值不一定是“输出全关”。如果S32K144在初始化时没有主动把OUT_ON寄存器写成0芯片输出级可能处于使能状态这时候PWM寄存器如果又是满占空比LED就会全亮。正确的初始化顺序应该是// 1. S32K144 LPUART初始化为FlexWire所需参数 // 2. 拉低NSLEEP确认芯片处于低功耗状态 // 3. 延时等待VS电源稳定 // 4. 拉高NSLEEP唤醒TPS929120 // 5. 延时1ms等待芯片内部振荡器稳定 // 6. 发送同步/唤醒命令读取状态寄存器确认LOCK位 // 7. 配置DEV_CONFIG寄存器设置PWM频率等参数 // 8. 写OUT_ON寄存器强制所有通道输出关闭 // 9. 写各通道PWM占空比寄存器 // 10. 最后使能看门狗并进入周期喂狗流程第8步绝对不能省。不管你后续要做什么初始化时先把OUT_ON全部清零让输出级处于确定关闭状态再配置PWM最后按需打开输出。我这次遇到漏电流问题一部分原因就是在调试过程中改了PWM寄存器但没同步检查OUT_ON寄存器状态导致通道在一个不明确的输出状态下工作。3.3 看门狗超时和通信异常的表现TPS929120内部有看门狗S32K144必须周期性通过FlexWire发送喂狗命令否则芯片会认为通信丢失进入安全状态。不同版本的数据手册对安全状态的定义不完全一样有的是输出全关有的是保持最后状态。这里有个容易误判的场景系统正常运行一段时间后如果看门狗没喂上芯片可能主动关闭所有输出此时LED全灭并不代表MCU挂了反过来说如果安全状态是“保持当前输出”那PWM调光过程中突然停住不动也要先怀疑通信链路和喂狗任务不要一上来就查硬件。调试时我在周期任务里加了一个计数变量每次喂狗成功就加1喂狗失败就记录错误码。这样能快速分辨是MCU压根没跑还是FlexWire通信异常导致芯片没收到喂狗命令。3.4 调试FlexWire时示波器怎么抓FlexWire是半双工主发从收和从发主收共用一根线。调试时把示波器探头夹在SDO引脚上用上升沿触发就能抓到总线上完整的帧波形。我通常看三个东西空闲电平是否是高电平、起始位下降沿是否干净、停止位之后是否有毛刺。如果波形正常但芯片不响应再用万用表量一下SDO引脚到MCU TX引脚之间的通路是否真的连通。很多时候是原理图网络名标错了或者PCB布局时串了0Ω电阻但是没贴这种低级错误在调试现场最容易浪费半小时。4. 漏电流问题完整排查链路从“灯关不死”到根因确认回到开头那个问题PWM占空比已经设为0%但暗室里LED还是微亮。这是整个项目中最有价值的一段排查经历我把每一步怎么做、量到什么数据都记录下来。4.1 第一步验证软件配置是否真的正确先别急着怀疑硬件。我通过FlexWire读回当前OUT_ON寄存器和PWM占空比寄存器确认写入的值确实是0。这里注意有些工程师只检查了MCU端变量没检查芯片端实际寄存器结果发现是某个初始化分支把寄存器值覆盖了。我在S32K144里写了一个读寄存器函数通过FlexWire回读TPS929120内部OUT_ON和PWM寄存器打印到串口。回读结果显示有问题的通道PWM寄存器确实是0但OUT_ON寄存器对应位是1。也就是说PWM为0并不等于输出级关闭TPS929120的PWM调光只是控制内部电流源的导通时间占空比为0时理论上没有输出电流但输出级仍然处于使能状态漏电流路径依然存在。4.2 第二步用微安表逐段断开定位漏电路径既然软件配置没法完全关闭通道那就用电流表量到底。我在LED灯串正极处串入微安表实测微亮通道静态电流约1.2mA正常通道约0.2mA。这个数据很关键说明漏电流确实存在而且不同通道之间有差异。接下来做分段排除。先把板子上LED并联的100nF电容拆掉电流降到0.4mA。这就说明电容残余电荷贡献了一部分。然后在OUTx引脚对地飞线加一颗10kΩ电阻电流从0.4mA降到0.15mA。换成2.2kΩ电阻之后静态电流降到0.02mA。到这里基本能确认漏电流主要来自芯片输出级关断后的高阻态并非理想断路而是存在一条微弱的漏电路径并联电容又把这个漏电在关断瞬间放大了。4.3 第三步用热风枪验证漏电流与温度的关系为了进一步确认漏电路径在芯片内部而不是PCB表面污染我用热风枪把TPS929120局部加热到85℃左右再测微亮通道的静态电流从1.2mA升到了2.5mA。温度升高漏电流变大这是半导体结漏电的典型特征说明芯片内部输出级在关闭状态下确实存在漏电不是PCB漏电或外部污染。这步验证非常重要它决定了修复方向。如果是PCB污染或者助焊剂残留清洗板子就能解决如果是芯片内部漏电就必须从硬件设计上提供泄放路径把漏电流引导走而不是指望芯片自己能完全阻断。4.4 根因分析PWM关断不等于输出断路TPS929120内部每个输出通道的PWM功能本质是控制恒流源的通断时间比例而不是在输出引脚上串联一个机械开关。当PWM占空比为0%时芯片内部确实不主动输出电流但输出级的高阻态仍然存在由ESD保护结构、寄生二极管和内部偏置电路共同形成的亚阈值漏电通路。这个漏电流通常只有几十微安到几毫安具体大小取决于芯片批次、温度和PCB周边电路。在LED负载面前这个漏电会被放大。LED的动态阻抗很高尤其在小电流区间I-V曲线非常陡峭几十微安的漏电流就能让LED进入可见发光状态。再加上PCB走线和并联电容的耦合效应暗室里看起来就是“灯没关干净”。所以问题的完整链条是TPS929120输出级关闭时存在固有漏电流路径原理图没有为输出端提供足够低阻抗的对地泄放通道LED并联电容又把瞬态漏电放大最终表现为PWM调光关闭后仍有微光。5. 修复方案与复测数据硬件和软件各改了一处找到根因之后修复方案反而简单了。我做了两个改动一个在硬件一个在软件两者缺一不可。5.1 硬件改动OUTx引脚增加下拉电阻最终方案是在每一路OUTx引脚对地增加一颗2.2kΩ的下拉电阻。这颗电阻的作用是给漏电流提供一条低阻抗的泄放路径把OUTx引脚的静态电压钳在接近0V的位置。LED灯串正极接12V负极接OUTx当OUTx引脚被下拉到接近0V时LED两端电压远低于导通阈值自然就不会微亮。选2.2kΩ而不是10kΩ是因为实测2.2kΩ能把静态电流压到20μA左右而10kΩ只能到150μA。阻值再小当然泄放效果更好但会增加正常点亮时的额外功耗。点亮时LED电流是20mA经过OUTx引脚到下拉电阻的电流只有约0.5mA对整体效率影响很小。阻值再小到几百欧就会明显增加损耗得不偿失。改板的时候我在每一路OUTx到GND之间预留了位子即使以后换更灵敏的LED灯珠也可以随时调整下拉阻值。5.2 软件改动PWM为0时同时关闭输出使能位硬件加了下拉电阻后漏电流已经压到很低但软件侧我还做了一个防御性改动当某个通道的目标亮度为0时不仅仅写PWM寄存器为0同时把该通道对应的OUT_ON位清零彻底关闭输出级。从0恢复亮度时先置位OUT_ON再更新PWM寄存器。这个改动的逻辑是不要单纯依赖PWM占空比为0来关断LED而是把OUT_ON作为输出级的总开关。PWM占空比控制的是导通时间比例OUT_ON控制的是输出级是否使能两者组合才有最彻底的关断效果。5.3 修复后的实测数据修复完成后我重新测试了静态电流数据如下测试条件改动前静态电流改动后静态电流25℃常温PWM0%1.2mA0.02mA85℃高温PWM0%2.5mA0.05mA25℃常温PWM1%正常发光正常发光85℃高温PWM1%正常发光正常发光暗室目视检查所有通道在PWM为0时均无可见微光。整晚连续点亮测试LED色温和亮度没有异常偏移FlexWire通信也一直稳定在线。这里再补充一个实际经验修复后我又在另外两片板子上做了同样改动结果一致。这说明问题不是个别芯片的个体差异而是一个普遍存在的设计缺陷需要在原理图层面规避。6. 调试S32K144时绕不开的锁死与恢复漏电流问题解决之后项目进入正常联调阶段。但调试S32K144的过程中我还撞上了另一个几乎每个S32K开发者都会遇到的大坑芯片被锁死连不上调试器。6.1 症状IAR报错J-Link连不上现象很典型在IAR里点了一下全片擦除然后烧写新程序突然弹出错误提示无法连接到目标J-Link在Commander里也显示找不到芯片。第一反应是板子坏了但量了电源和晶振都正常MCU的复位脚也能拉低就是连不上调试接口。网上搜了一圈发现这个问题有个统一的说法S32K144不小心全擦除之后芯片可能进入安全锁定状态。原因是Flash配置区里存有安全字节如果代码里配置了CSEC或者全片擦除时把安全字节擦成了某个锁定值调试接口就会被关闭。特别是在尝试解锁CSEC功能之后如果没有正确完成解锁流程全片擦除会让芯片恢复成默认的安全状态导致调试器无法访问。6.2 恢复流程J-Link Commander解锁我用的是J-Link Plus恢复流程比较简单。打开J-Link Commander连接目标芯片之前先执行unlock Kinetis这个命令会发送一段解锁序列解除Kinetis系列芯片的调试接口锁定。执行完命令后给板子断电重新上电再打开IAR就可以正常连接和烧写了。如果你用的是PEmicro调试器也可以尝试通过S32 Design Studio里的Flash工具执行解锁操作。无论哪种工具核心思路都是一样的在芯片进入调试接口锁定状态后通过特定的解锁序列恢复访问权限。6.3 防止再次锁死的操作习惯经历过一次锁死之后我调整了烧写流程。以前图省事每次都是全片擦除再烧写现在改成只擦除应用扇区保留Flash配置区。S32K144的Flash配置区里存有FOPT、FSEC这些关键字节只要不动它们芯片就不会因为误擦除进入锁定状态。另外如果项目里确实要用CSEC安全功能建议把解锁流程和密钥备份到一个绝对安全的地方。CSEC一旦真正启用就不是简单unlock Kinetis能解决的需要走Debug Mailbox的Challenge/Response流程。这个流程我在实验室里完整跑过一遍涉及计算响应值、串口交互等步骤非常繁琐比锁芯片痛苦得多。非必要不开CSEC是这段时间最真实的体会。最后再分享一个工程习惯。从这次漏电流问题之后我在原理图阶段凡是涉及LED PWM调光的通道默认都会预留一个下拉电阻位。这个习惯帮我避免了很多次“灯关不死”的返工。调试S32K144的时候也一样每次烧写前先确认Flash配置区不会被误擦除再全片擦除。工程上的很多坑其实都是这些小习惯没养成等到现场出问题才返工。
返回列表