ARTICLE DETAIL

资讯详情

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

CAN收发器选型与唤醒机制:从TJA1043到TJA1145的完整实践指南

CAN收发器选型与唤醒机制:从TJA1043到TJA1145的完整实践指南 1. 认识两个主角TJA1043与TJA1145的定位差异做车载CAN网络的朋友这几年一定绕不开两个收发器型号TJA1043和TJA1145。一个是NXP家族里的老将一个是为网络管理场景专门打磨的新贵。很多刚接触AUTOSAR网络管理的工程师第一次看到“收发器还要配SPI、还要单独做唤醒配置”都会愣一下收发器不是插上就能用吗怎么到了TJA1145这里就变得这么复杂这里我先说结论TJA1043和TJA1145根本不是一个代际的产物也不是简单的高低配关系。TJA1043是标准高速CAN收发器走的是“硬件自动判断唤醒”的老路子TJA1145则带了SPI接口和可编程唤醒过滤引擎能精确做到“这帧报文该我管我才醒”是真正配合AUTOSAR网络管理和整车低功耗需求的存在。这篇文章我打算把两个芯片的选型逻辑、唤醒机制、AUTOSAR配置过程以及实际测试中容易踩的坑一次说清楚。不管你是做车身控制器、域控制器、BMS还是网关只要涉及多节点睡眠唤醒这篇内容都能帮你少走弯路。1.1 TJA1043经典高效CAN收发器适合普通休眠唤醒TJA1043在2010年左右开始大批量上车直到今天还在大量使用。它支持CAN 2.0最高1Mbps有正常模式、静音模式、待机模式和睡眠模式四种工作状态。最核心的是它带INH引脚待机或睡眠时可以通过INH释放外部稳压器把MCU和外围电路彻底断电做到整车静态电流很低。TJA1043的远程唤醒靠的是芯片内部的唤醒逻辑待机模式下收发器仍然在监听总线只要总线上出现了特定的唤醒模式通常是满足一定时序规则的显性脉冲序列芯片就把INH拉高让MCU重新上电。这种方案的优点是外围电路简单不需要额外软件配置硬件上电就默认能用缺点是唤醒条件粗放芯片只能识别“总线上有符合规则的显性电平序列”它不关心这帧报文是不是发给自己的。实际项目中TJA1043方案最大的痛点就在这总线上一旦有别的节点在发网络管理报文或者有电磁干扰在CAN线上打出一串显性脉冲ECU就可能被莫名唤醒。整车静置一晚静态电流莫名其妙大了查到最后往往就是某个节点的TJA1043被总线上的毛刺触发把MCU带起来了。1.2 TJA1145为SPI控制和选择性唤醒而生TJA1145是NXP专门针对CAN网络管理尤其是AUTOSAR NM推出的收发器。它和TJA1043最大的区别有两点第一是支持CAN FD通信速率最高到5Mbps数据段第二是芯片内部集成了一个可编程的唤醒过滤引擎MCU可以通过SPI接口提前把唤醒报文的CAN ID、掩码、帧类型写进芯片寄存器里之后在待机模式下只有CAN ID匹配的报文才能触发唤醒。这个能力在AUTOSAR网络管理里极其重要。整车级的NMNetwork Management报文通常有固定ID比如0x500、0x501这类每个节点只关心自己的NM报文。TJA1145可以直接过滤到“只认自己的NM ID”总线上的其他报文一概不认。这样一来MCU可以睡得非常深静态功耗可以压到几十微安级别而且误唤醒的概率大幅降低。另外TJA1145的电源管理更灵活。它同样有INH引脚但通过SPI配置可以支持本地唤醒、远程唤醒甚至主机主动让其进入睡眠状态的组合和EcuMECU状态管理配合起来整个下电流程是软件可控、状态可查的。1.3 一张表看懂关键差异很多工程师选型时会直接看数据手册参数不过我更习惯先看架构差异再看电气参数。下面这张表是核心差异建议收藏。对比项TJA1043TJA1145支持的CAN协议CAN 2.0最高1MbpsCAN FD最高5Mbps数据段控制接口无纯硬件引脚控制模式SPI接口可配置模式与唤醒过滤待机电流约几十微安级具体看负载约几十微安级过滤引擎开启时也很低远程唤醒机制检测总线上的唤醒脉冲模式可编程CAN ID过滤支持标准帧/扩展帧唤醒过滤灵活性无无法区分报文ID支持多个过滤组可配置掩码和ID范围INH引脚有有外部MCU睡眠深度需MCU进入低功耗但可能被误唤醒MCU可深度断电只有匹配报文才唤醒AUTOSAR支持需额外的唤醒处理逻辑天然适配CanTrcv、EcuM唤醒管理典型应用简单节点、无复杂NM策略域控制器、网关、AUTOSAR网络管理节点一句话总结如果你的ECU是简单节点总线上没有复杂的NM调度TJA1043完全够用但如果你的ECU要参与整车级网络管理有明确的睡眠唤醒策略TJA1145几乎是绕不开的答案。2. 唤醒机制拆解为什么网络管理场景下TJA1145更合适很多做应用层的工程师对唤醒机制不太敏感觉得“反正MCU有外部中断总线上有数据就醒了”。但放到整车环境下这个思路很容易翻车。整车静态电流有标准要求每一个ECU都不能在无人打扰的时候偷偷醒来所有动作都要在明明白白的唤醒条件下触发。2.1 三种唤醒方式本地唤醒、远程唤醒、选择性唤醒先统一一下概念后面聊起来不绕本地唤醒Local WakeECU自身的某个IO发生了变化比如KL15点火信号来了、车门把手开关被拉低MCU检测到后主动把收发器从睡眠模式唤醒。这种唤醒和CAN总线没有关系是最可控的唤醒源。远程唤醒Remote Wake总线上的其他节点发出了唤醒信号本节点的收发器检测到总线上有通信活动然后通过引脚通知MCU。TJA1043就是这种机制它不看报文ID只看总线上有没有“像报文”的东西。选择性唤醒Selective Wake收发器内部有过滤引擎能识别特定的CAN ID或者特定的报文内容只有匹配才唤醒MCU。TJA1145就是这种机制它本质上把一部分网络管理的判断逻辑下沉到了收发器硬件里。这里有一个关键区别值得多说一句TJA1043的远程唤醒本质上是检测“总线上的显性电平时序”是否满足一定条件。也就是说只要有一个节点在总线上发任何报文它都有可能会被唤醒。在总线报文比较少的年代这个方案够用但在现代整车上总线动不动就几十帧上百帧报文轮番广播TJA1043几乎是被动地“醒个不停”。2.2 TJA1043的唤醒缺陷按位识别导致误唤醒我亲身经历过一个项目车身控制器用的TJA1043整车下线后静置测试静态电流超标了20多毫安。排查了一整天最后用电流钳一个个节点往下找发现是一个车窗控制器被总线报文唤醒了。由于车窗控制器不支持本地唤醒验证一旦被远程唤醒就会进入运行模式总线静默后也不会主动睡眠就这么一直醒着。罪魁祸首就是总线上另一个模块在整车上电后发了一串诊断报文时序恰好符合TJA1043的唤醒模式车窗控制器就被“误伤”了。这个问题在TJA1043方案里非常典型收发器只管“总线上有显性电平序列”它不关心这帧报文是谁发的、要发给谁。总线利用率越高被误唤醒的概率越大。如果说得再直白一点TJA1043的唤醒逻辑相当于小区门口保安听到有人按了下门铃就开门它不看来访者的脸也不管找的是不是这家。而TJA1145的方案相当于闸机上装了人脸识别只有名单里的人来了才会放行。2.3 TJA1145的过滤引擎按CAN ID精确过滤让MCU睡得更沉TJA1145的过滤引擎通过SPI配置可以写入多个过滤组。每个过滤组可以设置CAN ID、ID掩码以及标准帧还是扩展帧。芯片在待机模式和睡眠模式下内置的CAN收发器和过滤逻辑仍然在工作它会把总线上的报文实时解析拿CAN ID和配置好的过滤条件比对只有完全匹配才把唤醒信号拉出来。这里的细节值得展开一下。TJA1145内部其实不是简单的报文解析器它有一套完整的CAN协议控制器逻辑可以识别SOF、仲裁场、控制场、CRC场等。也就是说芯片不仅要“看到显性电平”还要确认这是“一帧合法的CAN报文”再确认“CAN ID是否匹配”三个条件都满足的情况下才拉高INH。这一套组合下来误唤醒概率几乎可以忽略。对做AUTOSAR网络管理的工程师来说这个特性意味着什么意味着我们可以把CanNm的报文ID直接写到TJA1145里让整车静默时总线上的非NM报文随便发不会惊动任何节点只有和本节点相关的NM报文才能把ECU从深度睡眠里拉起来。MCU可以安心地关掉所有外设电源连CAN控制器都不用供电静态电流自然好看。注意TJA1145的过滤配置在没有初始化之前芯片默认处于普通模式不会过滤任何报文。调试时一定要确认SPI通信正常过滤寄存器真的写进去了否则它和普通收发器没有区别。3. 硬件迁移要点从TJA1043到TJA1145的实际改造选型如果确定要换TJA1145硬件设计上的工作量不会太大但有几个关键点必须盯住不然软件怎么调都调不通。3.1 引脚兼容性与外围电路差异TJA1043和TJA1145的引脚定义并不完全兼容不能直接替换。TJA1043是纯硬件引脚控制STBY引脚、EN引脚决定了工作模式TJA1145则多了一组SPI引脚SCK、MOSI、MISO、CSN模式切换和状态读取都靠SPI命令完成。如果你是从TJA1043迁移到TJA1145必须把原来接STBY和EN的GPIO腾出来改成SPI接口。大多数MCU都有硬件SPI外设直接用硬件SPI驱动就好如果MCU的SPI资源紧张也可以软件模拟只要时序达标即可。优先级上CSN引脚建议用GPIO控制灵活度高SCK、MOSI、MISO可以用硬件SPI。硬件上还有一个常被忽略的点TJA1145的VIO引脚。它决定了IO电平域接3.3V还是5V取决于你的MCU电源域。如果MCU是3.3VVIO必须接3.3V如果接5VSPI引脚电平就可能超过MCU的耐压轻则通信异常重则烧坏引脚。3.2 电源设计INH引脚如何控制稳压器TJA1043和TJA1145都带INH引脚但这个引脚的控制逻辑在睡眠模式下的表现有细微差别。TJA1043进入待机或睡眠后INH释放一般是被动拉低或高阻外部稳压器的使能端被拉低MCU电源断开。TJA1145除了同样的行为之外还允许软件通过SPI来控制INH的输出状态灵活性更高。实际硬件设计时INH引脚通常接一个上拉电阻到VBAT再接稳压器的EN引脚。芯片上电时INH处于活跃状态使能稳压器芯片进入睡眠模式后INH变为非活跃状态稳压器失能。这个回路设计不好会出现上电时序问题如果INH上拉电阻阻值太大稳压器EN引脚被拉高的时间太长MCU反复上电失败整车上电后节点就是不工作。我建议INH到稳压器EN之间串一个10k左右的电阻并在EN引脚对地加一个100nF电容做滤波既能保证电平切换稳定又能防止总线毛刺误触发上电。实际调试时可以用示波器对比INH和电源轨的上电时序确保INH拉高在先、电源稳定在后。3.3 CAN网络角度终端电阻、共地、PCB布局这里要提一个很有意思的细节终端电阻对唤醒检测也有影响。CAN总线终端电阻的标准接法是总线两端各120欧两个并联之后等效60欧。如果终端电阻丢失或者阻值偏差过大总线上的显性差分电压会偏离正常范围收发器可能无法正确识别唤醒帧。特别是在TJA1145的选择性唤醒场景里过滤引擎需要完整解析一帧CAN报文如果信号质量差到CRC都过不了芯片会认为这帧报文无效自然也不会触发唤醒。这也是为什么很多现场“总线明明有数据但ECU就是不醒”的问题最后查到根因是终端电阻一边被拆掉了。另外TJA1043和TJA1145都是需要共地的。CAN总线是差分信号但不代表可以不共地。共地阻抗过高时两个节点的CAN收发器之间会有电位差轻则影响差分电平判断重则破坏收发器。排查唤醒不稳定问题时先量一下节点之间地电位差是不是在允许范围内往往能省很多时间。PCB布局方面TJA1145因为多了SPI接口走线会比TJA1043多几根注意SPI信号不要和CAN差分线平行走太长距离避免串扰。CANH和CANL要成对走线保持间距一致最好在靠近连接器的地方加共模电感减少整车线束带来的电磁干扰。4. AUTOSAR网络管理框架下的下电与唤醒配置讲完硬件进入软件部分。如果你用的是AUTOSAR经典平台网络管理的下电和唤醒配置会牵扯到EcuM、BswM、CanSM、CanIf、CanNm、CanTrcv这一整套模块。很多新手一看到这些缩写就头大其实抓住主线就清楚了。4.1 下电流程从CanNm到BswM到EcuM的一条链先说下电。整车下电后应用层不再发请求ComM会从通信模式切换到No Communication模式。CanNm收到这个信号后经过一定时间的超时判断进入Prepare Bus Sleep模式此时它不再发送NM报文同时也不再期待接收NM报文。接下来是BswM模式管理的活。BswM里配置了状态机当CanNm上报“总线准备睡眠”时BswM会按预设规则执行一系列动作调用CanSM去激活通信通道CanSM再往下走把CanIf的状态切到STOPPEDCanDrv的CAN控制器也跟着停止。这一层的目的是先把协议栈的工作停下来让CAN控制器不再产生任何中断。最后是EcuM。EcuM是ECU顶层状态管理它负责把整个ECU带入睡眠。配置时需要把唤醒源设置为CAN唤醒CanWakeupSource并设置唤醒验证选项。下电的最后一步通常是调用CanTrcv_SetOpMode把收发器切到睡眠模式。TJA1145的话还要通过SPI先配置好唤醒过滤再睡眠顺序不能反。4.2 TJA1145在AUTOSAR中的配置细节TJA1145对应的AUTOSAR驱动是CanTrcvCAN收发器驱动。在Vector的工具链里CanTrcv是一个独立配置模块需要把收发器类型选成External通信接口选成SPI。CanTrcv配置里最核心的几个字段CanTrcvWakeupSource设置成CANTRCV_WAKEUP_SOURCE_BUS表示远程唤醒由总线报文触发。CanTrcvWakeupControllerRef指向对应的CAN控制器用于唤醒验证。CanTrcvWakeupSupport设置为TRUE让CanIf具备唤醒验证能力。CanTrcvSPIComChannel配置SPI通信通道对应MCU的SPI外设。CanTrcvSPIWakeupFilter这里就是TJA1145选择性唤醒的过滤配置把本节点关心的NM报文ID填进去。配置完后EcuM在唤醒源配置里需要把CAN唤醒源关联到CanIf的通道上。当TJA1145检测到匹配报文INH拉高MCU电源恢复MCU重启或者从复位状态恢复EcuM进入启动流程然后去检查唤醒源。这里有个容易踩的坑如果EcuM配置了唤醒验证Wakeup ValidationCanIf会在一定时间内检查总线上是否真的有通信活动验证通过后才认为这是有效唤醒如果验证超时EcuM可能又回到睡眠状态。TJA1145虽然已经过滤过一遍了验证机制尽量还是开着它能在软件层面二次拦截异常信号。4.3 迁移后软件调整清单从TJA1043方案切到TJA1145软件上的改动大致有这几项CanTrcv驱动从无SPI的通用驱动换成TJA1145专用SPI驱动。EcuM的唤醒源配置需要增加CanWakeupSource并配置唤醒验证参数。BswM状态机中增加睡眠前配置收发器过滤器的动作保证收发器睡眠后过滤条件已生效。应用层的NM报文ID要和TJA1145过滤寄存器里的ID保持一致。NM报文ID通常由整车网络规范决定但很多项目里强制要求NM报文必须是扩展帧配置时注意区分标准帧和扩展帧。从TJA1043方案切到TJA1145方案时注意CanNm模块的重复报文、超时时间参数是否需要根据整车网络架构重新标定这部分和收发器更换无关但往往会被一起改出现问题时不好定位。提示TJA1145的过滤规则是在初始化时通过SPI写入的。如果MCU深度断电后寄存器内容丢失而在MCU上电初始化完成前总线上已经有NM报文发出这个节点就会错过唤醒窗口。所以在EcuM初始化序列里CanTrcv的初始化和过滤配置必须放在通信使能之前而且顺序越靠前越好。5. 实测遇到的坑与排查技巧工程上最怕的不是方案不会做而是现象出现了不知道怎么下手。这几年我在CAN唤醒相关的项目里踩过的坑和排查过的现场问题基本可以归成下面几类。5.1 误唤醒总线上的杂散报文把ECU叫醒这是最让人头疼的问题之一。TJA1043方案的误唤醒前面已经说过换到TJA1145之后如果还出现误唤醒大概率是过滤配置没生效。排查思路从三处入手第一确认SPI写操作有没有成功回读校验。很多SPI驱动的读写是同一个命令字写完要马上读一遍确认第二确认过滤条件是不是配置成了“可接受所有ID”的模式。有些驱动默认的过滤掩码是全零全零掩码等于不过滤什么报文都能唤醒第三用示波器抓TJA1145的INH引脚配合总线报文分析看它到底是被哪一帧报文拉起来的然后在寄存器里把对应ID加进屏蔽条件里。5.2 唤醒失败、睡眠电流异常、Bus-Off恢复唤醒失败先量INH有没有拉高INH没拉高说明收发器都没识别到有效唤醒帧问题出在物理层和过滤层INH拉高了但MCU没跑起来问题出在电源时序或者复位电路MCU跑起来了但被唤醒验证给毙了问题出在CanIf的超时参数上。睡眠电流异常是另一个高频问题。如果整车静态电流偏大优先按“电流-节点”定位法逐个排查。对单个节点来说用示波器看INH是否真正进入低电平状态看MCU电源轨是否被完全切断。如果INH是低的但电源轨还是高说明稳压器的EN逻辑反了或者INH和EN之间被其他电路拉高了。Bus-Off问题也和收发器有关系。某些工况下总线干扰严重CAN控制器进入Bus-Off状态需要恢复。TJA1043和TJA1145都支持Bus-Off后的恢复但恢复需要CAN控制器重新进入正常模式这个过程在AUTOSAR里由CanSM处理。如果频繁Bus-Off建议先检查终端电阻、共地、布线等物理层因素不要一开始就怀疑收发器芯片坏了。5.3 常见问题速查表现象可能原因排查方式能发送不能接收滤波器配置错误掩码把ID过滤掉了回读SPI寄存器检查掩码设置ECUsleep 后被总线数据唤醒TJA1145过滤配置未生效或掩码过宽确认SPI写入成功检查过滤掩码唤醒后反复重启INH/稳压器时序问题电源不稳定抓INH和电源轨时序调上拉/滤波CAN FD通信失败收发器不支持CAN FD或显性位时间不够确认是否使用TJA1145检查波特率配置静态电流超标INH未真正拉低或某节点未进入睡眠逐节点测电流抓INH状态总线干扰导致唤醒终端电阻缺失、地电位漂移检查总线终端电阻和共地阻抗唤醒验证超时CanIf验证窗口太短调整CanIfValidationTime参数SPI读写失败VIO电平不匹配、SPI速率过快确认VIO电压降SPI速率还有一个容易忽略的小问题如果TJA1145的CSN引脚在初始化时被拉低但没有正确释放芯片会一直处于SPI通信状态总线上的报文收发都可能异常。排查时先用示波器看SPI片选时序是否完整。6. 选型建议与个人心得聊到这里大部分技术细节都展开了。最后说说我对选型的一些真实想法算是给后来的朋友一点参考。6.1 平台规划角度什么时候继续用TJA1043如果你的项目是传统12V车身ECU整车网络架构不复杂不需要参与AUTOSAR的复杂网络管理总线上报文量也不大TJA1043依然是性价比极高的选择。它外围电路简单软件不用专门写收发器驱动MCU只需要管自己的睡眠唤醒成本上也比TJA1145低一块钱左右。对成本敏感的车型来说这一块钱在百万级销量面前不是小数目。6.2 什么时候必须上TJA1145反过来只要你的ECU要参与整车级AUTOSAR网络管理要支持CAN FD要对静态电流有严格要求或者总线上报文非常多、误唤醒问题已经影响到了可靠性那就别犹豫直接上TJA1145。另外如果项目是网关、域控制器这类节点它们往往既是NM报文的生产者又是消费者对唤醒的精确性和响应速度都有更高要求TJA1145的可配置过滤能力基本是刚需。6.3 给后来者的一点经验我自己做过一次从TJA1043到TJA1145的迁移最大的感受是硬件改起来不难难的是一开始没想清楚整个唤醒链路的职责划分。收发器负责物理层检测CanIf负责唤醒验证EcuM负责状态切换BswM负责协调调度。任何一个环节配置不对都会出现“看起来收发器醒了但程序没起来”或者“程序起来但又睡下去了”的诡异现象。建议新项目立项阶段就把唤醒链路的架构图画出来标清楚每个模块的职责和接口确认谁先谁后再开始写代码。等到整车联调阶段再改唤醒方案代价要大得多。再分享一个小技巧TJA1145的过滤功能不仅能用来做网络管理唤醒也可以用来做故障诊断的唤醒过滤。比如你想让ECU在收到特定诊断请求时才从睡眠状态醒来直接把诊断请求ID配进过滤寄存器就行。这个用法比用普通GPIO做本地唤醒判断要省电得多实测下来静态电流可以再压低一截。最后别怕把TJA1145的SPI读写代码写复杂它值得花时间调通。一旦调通后面做其他平台的移植都只是重复劳动了。
返回列表