ARTICLE DETAIL

资讯详情

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

TJA1145低功耗CAN收发器:静态电流控制与选择性唤醒设计实践

TJA1145低功耗CAN收发器:静态电流控制与选择性唤醒设计实践 做车身电子和网关开发的工程师多半都跟静态电流这个指标搏斗过。整车上几十个ECU挂着常电每个节点哪怕只漏几百微安放几天蓄电池就亏得发不动车。车载网络里最难管的就是CAN收发器——它挂在总线上要时刻监听总线信号不能随便断电。TJA1145这颗NXP的高速CAN收发器专门解决的就是这个矛盾既保持极低功耗又能在CAN FD网络中实现选择性唤醒。这篇文章基于TJA1145数据手册和我在实际项目里的使用经验聊聊这颗芯片的低功耗设计思路、唤醒过滤机制以及配合MCU和AUTOSAR软件栈做下电配置时需要注意的事。1. 从整车静态电流说起TJA1145要解决的真问题1.1 静态电流为什么是汽车电子设计的硬指标现在的新车电子模块数量轻松超过50个。哪怕在断电锁车的状态下很多功能依然要工作遥控钥匙、蓝牙连接、T-Box远程控制、防盗报警。这些模块必须在整车上电前先醒着听。整车的静态电流通常要求做到几十毫安以内甚至更低分摊到每个常电节点往往只剩几百微安甚至几十微安的预算。CAN收发器作为物理层器件只要通电挂载在总线上就需要消耗一定的静态电流。传统的高速收发器比如TJA1051或者TJA1043虽然也做了低功耗模式但它们唤醒之后通常会直接拉高INH让MCU上电MCU一旦上电运行整个节点的功耗一下子就上去了。更关键的是普通收发器的远程唤醒往往是任意合法总线活动都能触发MCU醒来之后发现是一堆无关消息白白消耗能量。1.2 TJA1145的差异化定位TJA1145是NXP推出的高速CAN收发器它最大的特点是把选择性唤醒下沉到物理层芯片里。这颗芯片在待机模式下依然监听总线但不会对每一条帧都做出反应而是根据SPI预先配置好的ID过滤规则只有命中的帧才会真正唤醒系统。也就是说在MCU完全断电或处于极低功耗状态的情况下芯片内部已经在帮你筛选消息了。这颗芯片还有一个关键设计INH引脚。通过INH可以控制外部电源稳压器的使能脚。进入休眠模式后INH输出变成低电平把后级的DC-DC或者LDO关掉MCU连同外围电路一起断电整个节点相当于从系统上切断。这个思路比单纯芯片自己省电高了一个维度值得仔细琢磨。同时TJA1145有多个子型号其中TJA1145A/FD支持CAN FD数据段速率最高到5Mbps满足当前越来越普遍的CAN FD车载网络需求。所以它既是一颗物理层收发器更是系统级低功耗设计的一个枢纽件。1.3 与普通收发器的能力对比拿普通高性能收发器和TJA1145放在一起对比能力差异会更直观能力维度普通高速收发器TJA1145 / TJA1145A/FD唤醒方式标准WUP任意总线显性活动标准WUP CAN ID过滤匹配待机功耗低但MCU需保持监听更低MCU可完全断电外部电源控制部分型号有INH有INH可关断后级电源CAN FD部分型号支持TJA1145A/FD支持最高5Mbps配置接口引脚配置占多数SPI寄存器深度配置适合用TJA1145的场景很明确T-Box远程控制唤醒、BCM车身控制、电池管理系统的常电监听节点以及AUTOSAR架构中需要支持CanTrcv层的低功耗节点。它解决的核心问题不是把电流降低一两个毫安而是从系统电源树层面把整个节点从常电网络上摘掉。2. 工作模式与功耗状态机TJA1145怎么睡得更聪明2.1 工作模式概览TJA1145数据手册定义了几种工作模式理解这些模式是配置低功耗的前提Normal模式普通模式完全收发状态TXD/RXD通道开放CAN总线处于正常通信状态。这个模式功耗最大电流通常几十毫安发送时更高。Silent模式静默模式只接收不发送TXD被禁止。一般用于诊断或总线监听功耗低于Normal。Standby模式待机模式收发器不发送数据RXD输出反映总线状态同时内部的唤醒监测电路保持活跃。这是选择性唤醒工作时的默认低功耗模式静态电流典型值可以做到几十微安以内。Sleep模式睡眠模式更深度的休眠内部电路几乎全部关闭仅保留必要的唤醒监测。此时INH引脚通常输出低电平关断外部稳压器实现节点级掉电。具体模式名称可能随封装或子型号有差异但设计框架相同。2.2 INH引脚的工程含义很多工程师第一次看TJA1145时容易被INH引脚绕晕觉得它不过就是个中断输出。实际上INH设计的目的就是当电源门卫。在Normal模式下INH输出高电平让外部稳压器正常供电在Sleep模式下INH变低稳压器关断。这样一来MCU和外设可以在休眠时完全断电而不是进入自己的低功耗模式继续耗电。这个设计对整车的静态电流预算非常友好。很多MCU虽然标称低至几个微安但实际外围电路电阻分压、LDO、运放等加起来可能几十上百微安。TJA1145直接把电源断掉这部分静态电流就消失了。需要提醒的是如果需要支持本地唤醒比如KL15上电、按键唤醒通常需要将唤醒信号并联到INH的控制逻辑中或者用MCU的唤醒引脚与INH一起控制电源使能否则INH拉低后整个节点都没电唤醒信号也没办法传递到MCU。这里有个常用的电路做法把本地唤醒信号用二极管隔离后接到INH控制的上游电源使能逻辑上相当于给电源使能端做了个或逻辑。这样无论是总线远程唤醒还是本地按键唤醒都能把电源重新打开。2.3 模式切换的时序约束从Normal进入Sleep不能直接跳通常要先进入Standby然后通过SPI写入睡眠模式命令。这个过程要在总线空闲时进行否则会有未发送完的帧被截断。数据手册里会给出模式转换时间有的转换需要几百微秒尤其在SPI时钟有限的情况下需要留足时间。反过来从Sleep唤醒到Normal也要经过一个过程总线出现唤醒帧 → 收发器内部的唤醒逻辑动作 → INH输出拉高 → 稳压器输出建立 → MCU上电或唤醒 → MCU通过SPI把收发器切换到Normal模式。这里有一个容易被忽略的点MCU上电之后TJA1145可能还在Standby模式需要MCU软件主动通过SPI切换回Normal这个初始化代码必须放在启动流程的早期。从硬件实测角度来看唤醒帧到达到INH拉高之间的延迟通常在微秒级稳压器启动需要几十到几百微秒MCU复位或唤醒需要毫秒级。整个链路时间加起来一般在几毫秒内完成。如果项目对唤醒响应时间有硬性要求需要多轮实测尤其是在低温环境下稳压器启动时间和MCU时钟稳定时间都会变长。3. 选择性唤醒内部机制SPI寄存器与ID过滤的配置要点3.1 选择性唤醒到底怎么工作普通CAN收发器的远程唤醒靠的是检测总线上的唤醒模式WUP也就是一段显性-隐性-显性的电平序列。只要总线上出现符合要求的电平变化收发器就认为有远程唤醒请求然后拉高INH唤醒MCU。问题是只要这条CAN总线上有任何节点发送任何消息WUP序列都会出现。比如一个网络里既有动总CAN也有车身CAN网关转发消息时某个低功耗节点会被大量无关消息反复唤醒。每个数据帧只有几毫秒MCU几毫秒内也干不了什么只是从睡眠状态起来又睡回去功耗浪费非常大。TJA1145的选择性唤醒是在WUP检测之上叠加了硬件ID过滤。收发器在待机状态下接收路径保持工作收到CAN帧后硬件解析帧头ID与SPI寄存器中预置的唤醒ID和掩码进行比较。只有匹配的帧才会触发唤醒信号其余帧在芯片内部直接丢弃不上报MCU。这个过滤过程完全不需要MCU参与也不需要CAN控制器参与所以功耗才能压到那么低。3.2 唤醒ID与掩码配置通过SPI接口TJA1145可以配置以下内容标准ID11位唤醒适合常规报文。扩展ID29位唤醒适合多路网关或诊断报文。掩码配置可以配置某些ID位为不关心dont care实现一组ID的灵活过滤。比如唤醒ID0x1xx掩码高8位全匹配、低3位任意就能覆盖同一系列的所有报文。配置步骤通常是把收发器切换到配置允许的模式。通过SPI写入唤醒ID寄存器。写入掩码寄存器。启用唤醒功能确认相关中断或状态寄存器就绪。我习惯用类似下面的伪代码来表述配置逻辑// 配置TJA1145唤醒ID为0x123标准帧11位ID完全匹配 tja1145_write_reg(REG_WAKE_IDH, 0x12); // ID高字节 tja1145_write_reg(REG_WAKE_IDL, 0x30); // ID低字节加上标准帧标志位 tja1145_write_reg(REG_WAKE_MASKH, 0x07); // 高3位掩码 tja1145_write_reg(REG_WAKE_MASKL, 0xFF); // 低8位掩码 tja1145_write_reg(REG_WAKE_CTRL, 0x01); // 使能选择性唤醒具体寄存器地址请以手头版本的数据手册为准不同批次可能字段定义有差异。但配置思路是通用的先写入期望唤醒的ID再写入掩码决定哪些位必须精确匹配最后使能唤醒功能。为保险起见配置完成后回读一遍寄存器确认写入成功再进入低功耗状态。3.3 硬件过滤和软件过滤的取舍有人会问我MCU用中断唤醒然后在中断服务程序里判断CAN ID不也可以吗可以但代价很大。MCU要从深度睡眠中被唤醒等待时钟稳定跑中断服务再看CAN控制器收到的数据这个过程至少几十微秒而且MCU一醒外设、时钟、电源域都要起来系统功耗迅速上升。如果总线消息频繁MCU几乎没法进入深度睡眠。用TJA1145硬件过滤MCU可以保持深度睡眠甚至断电只有真正需要的帧才能唤醒它。这相当于把值班这个任务外包给了一颗功耗极低的芯片。另外还要注意过滤掉的消息并不进MCU。所以如果应用需要在唤醒后查到最近总线状态还需要设计历史消息缓冲或者让MCU唤醒后通过CAN控制器重新读取总线数据这块要在软件架构里提前规划。我在实际项目里的做法是在MCU的RAM中做一个小的环形缓冲存最近几条关键消息TJA1145唤醒MCU后先查缓冲再决定是否发起总线通信。这个缓冲在休眠前继续保持供电RAM在深度睡眠下不能断电。4. CAN FD支持TJA1145A/FD的物理层特性与选型注意4.1 标准版与FD版的区别TJA1145有两个常见区分基础版本和A/FD版本。TJA1145A/FD支持CAN FD仲裁段和数据段可以配置不同波特率数据段最高可以跑5Mbps。基础版本可能仅支持经典CAN。选型时最怕的就是硬件工程师按老设计选了不支持CAN FD的型号结果后面网络升级成CAN FD又得改板子。如果项目已经确定走CAN FD直接选TJA1145A/FD如果只是经典CAN但考虑留余量也建议一步到位。同一颗芯片在经典CAN网络里工作没有任何问题向下兼容。4.2 CAN FD对收发器的物理层要求CAN FD与经典CAN的区别不只是协议帧格式对物理层时序同样更敏感。因为在5Mbps或更高速率下位时间只有200ns甚至更短收发器的环回延迟、信号对称性、上升下降时间都必须满足更严格的窗口。TJA1145A/FD在设计上满足这些要求手册中会给出环路延迟loop delay等相关参数。做CAN FD设计时总线终端匹配电阻仍然建议按标准放置。很多问题反而出在连接器、线束分支和接插件电容上收发器本身通常不是瓶颈。特别是在CAN FD的2Mbps以上速率线束分支长度要尽可能短T型分支节点最好避免尽量做成菊花链拓扑。作为参考ISO 11898-2标准对高速CAN收发器的电气参数有明确规定CAN FD对收发器提出了更高的时序一致性要求。在400米总线的传统经典CAN设计中可以容忍的分支在CAN FD 4Mbps下可能根本跑不稳。实测数据往往和理论计算有偏差建议在样件阶段就把线束长度、连接器型号定下来后续再优化会很痛苦。4.3 故障保护与健壮性设计TJA1145还有一些有用的保护特性TXD显性超时如果软件异常导致TXD长时间拉低收发器会自动断开发送防止总线被某节点锁死。总线引脚ESD防护CANH/CANL引脚支持较高ESD等级适合汽车环境。温度保护过温时限制或关闭发送驱动器。在项目中可以通过SPI读取诊断寄存器来确认故障类型这个能力对下线测试以及售后排查都有用。比如某次现场反馈整个CAN网络瘫痪用诊断寄存器读到某节点提示TXD超时基本可以判断是该节点软件跑飞导致持续显性电平。这类故障在实车环境中比实验室里更难复现有诊断寄存器辅助会节省大量排查时间。5. MCU低功耗联动与AUTOSAR BswM下电配置5.1 从硬件上把节点功耗压低使用TJA1145的系统典型连接方式如下MCU的SPI → TJA1145的SPI用于配置唤醒ID和模式。TJA1145的INH → 外部LDO/DCDC的EN控制整个节点电源。TJA1145的RXD → MCU的唤醒引脚比如EXTI用于通知MCU总线唤醒事件。下电流程一般是这样上层应用判断需要休眠例如KL15下电、网络长时间无活动。MCU通过SPI写TJA1145配置好待机或睡眠模式。等待收发器确认进入低功耗状态。MCU进入深度睡眠或通过TJA1145的INH直接切断MCU电源。总线上有匹配唤醒帧时TJA1145自动拉高INH电源恢复MCU上电运行。这套流程的关键在于哪个动作先、哪个动作后必须严格设计。特别是如果采用INH断MCU电源的方案MCU在下电前必须确保TJA1145已经进入休眠并且配置了正确的唤醒ID否则等于断自己的电后就再也醒不来了。5.2 AUTOSAR BswM下电模式的配置思路在AUTOSAR软件架构中与TJA1145相关的模块包括CanTrcvCAN收发器驱动、CanSMCAN状态管理器、ComM通信管理器、BswM模式管理器和EcuMECU状态管理器。以Vector AUTOSAR为例下电配置的核心链路通常是EcuM负责ECU电源状态机当满足休眠条件时请求系统进入SLEEP或SHUTDOWN。ComM管理通信许可No Communication状态下通知CanSM关闭通信。CanSM调用CanTrcv_SetOpMode设置收发器模式把TJA1145从Normal切到Standby或Sleep。BswM执行模式仲裁和动作列表确保各模块按顺序切状态最后通知EcuM可以断电。CanTrcv驱动里TJA1145的SPI寄存器配置由CanTrcv层完成包括唤醒ID、唤醒源是否使能等。实际工程中配置BswM最常踩的坑是动作列表执行顺序和模式条件不满足导致挂起。比如CanSM还在等待CanTrcv状态确认而CanTrcv的SPI配置或轮询超时设置得不合理整个下电链路会被卡住MCU永远无法进入休眠。我的建议是先在非AUTOSAR的MCal环境下用裸机代码把TJA1145的收发器状态切换和唤醒验证调通然后再去AUTOSAR工程里配置CanTrcv、CanSM和BswM。裸机都跑不通的状态AUTOSAR里只会更折腾。以Vector的工具链为例在DaVinci Configurator中配置CanTrcv模块时需要设置收发器的唤醒源类型、模式切换所用的命令以及SPI通信的片选、时钟等底层参数。BswM中要新建一个Mode Request Port关联EcuM的Sleep状态再配置Action List调用CanSM的请求关闭通道、调用CanTrcv的切换到睡眠模式等功能。这里的Action List执行顺序完全由BswM的模式状态机决定配置顺序错了就会导致还没断通信就已经把收发器切到睡眠。5.3 唤醒验证与静态电流实测完成下电配置后一定要用示波器电流探头或者高精度万用表实测节点静态电流。测量位置选择在常电输入处。观测要点节点进入休眠后电流是否稳定到数据手册标称范围。发一帧匹配ID的CAN消息节点能否正常唤醒并快速恢复通信。发一帧不匹配ID的消息节点电流不应有明显波动MCU不应被唤醒。这里我习惯用CANoe配VN系列设备发周期性报文同时用电流探头记录波形。基本能一次性验证清醒和误唤醒两个维度。电流探头接在电源回路上示波器触发设置为上升沿然后通过CANoe发送一帧匹配ID的报文观察电流波形从静态值跳到正常运行值的完整过程。如果波形中电流先跳起来又掉下去说明存在假唤醒很可能MCU起来后又因为超时或条件不满足自己睡回去了这种问题在软件联调中最难查往往会误导你去查CAN通信。6. 实际项目排查记录几个容易踩的坑6.1 坑一唤醒帧被侦察成标准帧与扩展帧不匹配TJA1145配置ID过滤时标准帧和扩展帧必须分开设置。如果唤醒源是29位扩展ID帧而配置时只设置了11位标准ID过滤那就算ID数值一样也永远不会唤醒。这个坑在网关项目里很容易出现因为某些报文是扩展ID某些又是标准ID。排查时先用CANoe抓包确认帧类型再检查配置。6.2 坑二SPI时钟与MCU低功耗模式冲突TJA1145的SPI接口在芯片进入Sleep后可能不再响应读写。有些工程师在MCU休眠前想再读一遍寄存器确认状态结果SPI无响应导致MCU卡死或总线忙等。正确做法是先在MCU侧确保TJA1145配置完成再让收发器进入Sleep。不要在Sleep状态下去读TJA1145的寄存器除非你的代码明确知道芯片会在特定条件下恢复响应。另外SPI片选和时钟极性也要确认。有的MCU在低功耗模式下SPI外设时钟被关闭而复用的GPIO还处于高阻状态这时TJA1145的SPI片选如果没有外部上拉可能会引入毛刺影响芯片状态。硬件上建议给SPI片选加上拉电阻在MCU休眠时保证片选处于非选中的稳定电平。6.3 坑三INH控制的电源域包含了不该断电的电路INH可以关掉外部稳压器但如果同一个电源域里还有需要随时供电的存储芯片、时钟芯片、或者另一个通信模块就直接把别人也断了。做电源树设计的时候必须仔细划分哪些电路属于可断电域哪些属于常电域。TJA1145的INH只是提供了一个控制信号具体断谁不断谁由系统电源树决定。有个项目当时为了省一路LDO把环境光传感器和MCU放在同一个可断电源域里结果进入休眠后环境光传感器也被断电导致车辆在休眠状态下无法通过光线变化触发迎宾灯功能。最后只能临时改版把传感器挪到常电域。电源树设计这种事画原理图的时候多花半小时想清楚比后期改板子省太多成本。6.4 坑四终端电阻和短分支如果同一路CAN总线上有多个节点各自带终端电阻或者分支线过长信号反射会非常严重。对于CAN FD高速数据段更容易受反射影响。设计时根据总线上节点分布决定终端电阻的位置尽量让两个末端节点各带一个120Ω电阻不要在每个开发板上都焊上。TJA1145内部没有集成终端电阻外部电阻的精度和放置位置都要注意。在评估板上调试时常见做法是焊死一个120Ω再用跳线帽控制第二个终端是否接入这样在总线不同拓扑下都能灵活切换。6.5 坑五低频下唤醒报文周期与MCU启动时间的配合如果总线上匹配ID的唤醒报文周期很短比如10ms一帧TJA1145唤醒MCU后MCU还没跑起来第二帧已经过去了。这会导致某些软件设计者误以为收发器唤醒信号丢了实际上是电源建立和MCU启动的总耗时超过了报文周期。如果碰到这种情况要么在网关端降低唤醒后第一帧的发送频率要么在MCU启动后在初始化阶段主动发送一帧请求重发的报文从机制上绕开这个窗口。最后分享一点个人体会。用TJA1145做低功耗节点最大的变化是思维方式的转变——以前做低功耗是把MCU调到最低档位还要精细分配唤醒源现在有了硬件级选择性唤醒核心逻辑变成怎么断整个节点电源、怎么定义唤醒ID集、怎么验证不会误唤醒。这几个环节想清楚静态电流指标往往比想象中轻松很多。数据手册里每个参数都值得对照实际板子重新量一遍毕竟整车环境下的线束、温度、电源波动带来的差异远比仿真模型复杂。希望这篇文章能帮正在调试TJA1145的同行少走几步弯路。
返回列表