ARTICLE DETAIL

资讯详情

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

TJA1145A低功耗CAN收发器:解决BCM静态电流超标与休眠唤醒设计实战

TJA1145A低功耗CAN收发器:解决BCM静态电流超标与休眠唤醒设计实战 前两年做车身控制器的时候静态电流这个问题卡了我们整整一个版本。KL15断开之后整车要求静态电流小于100µA可光TJA1042的待机功耗加上MCU的stop模式电流轻轻松松就到两三百微安。后来把收发器换成TJA1145A这个问题才算真正从根上解决。它不是让MCU进入低功耗模式而是直接把MCU的电源切断。这篇就把我在这个方案里踩过的坑、验证过的流程整理一下希望对做车身电子、域控制器、BMS这类需要休眠唤醒的兄弟们有帮助。1. 为什么休眠唤醒会成为CAN节点的硬指标1.1 从静态电流超标说起先讲一个具体的项目背景。我们当时做的是车身控制器BCMBCM在整车上属于“永不掉电”的节点KL30常电直接供给。传统设计里BCM一般由一颗SBC系统基础芯片或者LDO供电MCU在IG OFF后进入stop模式CAN收发器用STB引脚拉入待机。这套方案看着没问题但一到整车静置电流测试就开始头疼。整车的静态电流预算通常是几十毫安到百毫安分给一个BCM节点可能只有1~2mA的份额。而传统方案里MCU的stop模式虽然能做到几十微安但外部的LDO静态功耗、收发器的待机电流、以及板上的上拉电阻漏电加起来很容易超标。最要命的其实是MCU“掉电不彻底”带来的暗电流比如某个GPIO没有配置成输入、某个传感器供电没切断几毫安就没了示波器上还不好查。TJA1145A解决问题的思路不一样它自己直接从KL30取电并且带一个INH引脚。进入休眠后INH输出低电平把后面整组DCDC或者LDO的使能断掉MCU彻底断电。这时候板子上的静态电流只剩下TJA1145A本身的微安级电流加上一些不可避免的漏电流能控制在十几微安以内。这才是真正的“休眠”不是“浅睡”。1.2 传统收发器和低功耗MCU方案的极限为什么要单独用一颗带休眠功能的CAN收发器而不是靠MCU的低功耗模式原因很简单MCU的低功耗模式再低只要电源还在供着就有漏电流。而且随着MCU主频提高、外围器件增加stop模式下的电流很难做到理想值。TJA1042、TJA1051这类经典收发器本身只有Standby模式收发器还在供电总线侦听电路也在工作整体电流通常在几十微安量级。单看似乎不高但BCM上往往不止一颗收发器还有LIN收发器、HSD高边驱动、传感器电源每一项都在往静态电流里加。整车里几十个节点每个多几十微安加起来就是毫安级的消耗对铅酸电瓶来说就是停放天数从60天掉到40天的差别。而且传统收发器的唤醒是纯电平唤醒只要总线上出现显性电平节点就被唤醒。在KL15 OFF之后的整车休眠阶段网络上有任何杂散信号都可能导致误唤醒MCU被唤醒之后又要跑一段初始化然后再次休眠反复几次之后静态电流就更难看了。TJA1145A引入了选择性唤醒机制可以从原理上规避这类误唤醒。1.3 TJA1145A的解决思路TJA1145A是NXP的第三代CAN收发器专门为“局部网络”需求设计的核心价值有几点直接由VBAT供电正常的收发功能和工作模式切换全部由SPI控制带有INH电源控制输出休眠时切断后端MCU电源带有INO中断输出可以在唤醒时通知MCU支持本地唤醒WAKE引脚、远程唤醒总线活动、选择性唤醒报文ID过滤三种方式静态电流做到微安级别。实际项目中它既可以用在BCM这种需要极低静态电流的节点也可以用在车门、座椅、T-Box等模块上。尤其是那些“不需要随时响应所有总线报文”的节点选择性唤醒的价值非常大。整车休眠后主节点仍然在工作向总线上发送周期报文如果每个从节点都被这些周期报文唤醒那和没休眠没区别。TJA1145A通过ID过滤只对和自己相关的报文响应无关报文一概无视这个逻辑比纯粹靠电平唤醒合理得多。2. 先搞清楚TJA1145A是怎么睡、怎么醒的2.1 三种模式与状态迁移TJA1145A有Normal、Standby、Sleep三种主模式模式切换统一由SPI写入控制寄存器完成。这里先列一个概览表模式收发器状态INH输出总线侦听MCU电源适用场景Normal正常收发高正常供电通信期间Standby停止收发高唤醒侦听供电短时待机Sleep停止收发低唤醒侦听断电长时间休眠上电后TJA1145A默认进入Standby模式这时候INH是高电平后端电源是打开的MCU可以工作。MCU通过SPI把它切到Normal模式进行正常通信。需要休眠时MCU先处理好总线上未发完的报文然后通过SPI写入Sleep命令确认INH被拉低之后板子上的电源被切断整个系统进入休眠状态。需要特别注意从Sleep模式唤醒后TJA1145A回到的是Standby而不是Normal。MCU必须在唤醒后的初始化流程里显式地把它切回Normal很多新手在这里翻车表现为唤醒后收发器不工作总线发不出去报文。2.2 三类唤醒源TJA1145A的唤醒源分三类理解清楚对排查问题很有帮助。第一类是本地唤醒通过WAKE引脚实现。WAKE引脚可以配置为上升沿、下降沿或者双边沿触发。典型用法是接KL15点火信号、门把手开关、或者是某个硬线信号。车身控制器里常用这个来做“点火唤醒”钥匙拧到ACC档的时候KL15拉高WAKE脚检测到上升沿收发器从Sleep恢复INH拉高MCU上电。第二类是远程唤醒也就是CAN总线唤醒。只要总线上出现符合要求的显性电平或唤醒帧收发器就会被唤醒。这是最常用的方式。整车休眠后如果主节点需要叫醒某个从节点直接往总线上发一帧报文即可。第三类是选择性唤醒这是TJA1145A区别于普通收发器的关键功能。它内部有ID过滤器可以配置多组ID匹配规则和屏蔽规则。总线上的报文进来之后先经过ID过滤只有匹配的报文才能触发唤醒不匹配的直接忽略。这个功能用来解决一个很实际的问题CAN总线上永远有周期报文在跑如果节点对每一帧都响应根本睡不下去。配置好过滤规则之后节点只对自己关心的报文敏感其余报文一概不理。2.3 INH和INO一个切电源一个报信INH引脚是TJA1145A电源控制的核心。在Normal和Standby模式下INH输出高电平用于使能后端的DCDC或者LDO在Sleep模式下INH输出低电平后端电源被关闭。整个系统休眠后只有TJA1145A还挂在KL30上MCU、传感器、其他器件全部断电。这里有个容易忽略的点INH是控制信号不是电源输出。它的驱动能力有限不能直接给MCU供电只能接到DCDC的EN引脚或者PMOS的栅极。连接时还要注意EN引脚的电平要求有些DCDC的EN高电平阈值是1.5V有些是2.5V要确保INH的输出高电平能满足要求否则会出现休眠后关不断电源、唤醒后打不开电源的问题。INO引脚是中断输出用来向MCU报告唤醒事件。MCU被断电后重新上电的第一件事就是读SPI查唤醒标志。INO在这里起到一个硬件信号的作用MCU可以被它触发外部中断或者用来做电源管理的握手信号。2.4 选择性唤醒和局部网络选择性唤醒实际上对应的是CAN局部网络Partial Networking的概念。传统CAN网络中总线上每一帧报文每个节点都会收到。对于不需要处理这些报文的节点来说接收本身就是在消耗能量。局部网络的目标是让节点只处理与自己相关的报文不相关的报文连接收都不接收。TJA1145A在Sleep模式下总线上的报文进入内部的ID过滤逻辑和配置的筛选规则比对。匹配则唤醒不匹配则忽略。这套逻辑是用硬件实现的不消耗MCU资源真正做到“休眠还保持警觉”。实际配置时ID过滤寄存器组里需要明确标准帧还是扩展帧、ID值、掩码等参数。掩码的作用是定义需要精确匹配哪些位。比如某节点关心ID 0x123掩码设成全匹配那么只有0x123能唤醒它如果掩码忽略低3位那么0x120到0x127都会唤醒它。这个灵活性在实际调试中非常有用可以根据项目需求动态调整唤醒范围。3. 硬件上最容易翻车的几个点3.1 电源架构VBAT直连与INH使能用TJA1145A做电源架构时首先要明确一点TJA1145A的VBAT必须直接接常电不经过任何开关。它自己就是整个休眠系统的“哨兵”如果它的供电都被切断那一切都白搭。VBAT脚上要加防反接二极管、TVS管和滤波电容汽车环境下这是基本操作。INH接到后端DCDC的EN引脚时建议在EN引脚上加一个下拉电阻。原因很简单INH在Sleep模式下是低电平但如果TJA1145A进入一种半配置状态或者INH驱动电路异常EN引脚悬空可能导致DCDC输出不稳定。下拉电阻保证EN在无驱动时保持在明确低电平避免电源意外开启。下拉电阻的经验阻值是100kΩ既不会给INH增加明显负载又能提供确定的默认电平。还要注意一点INH控制的是“后端电源”不是“总线电源”。CAN总线的偏置和终端与节点电源无关不要想着把总线侧也一起断了否则其他醒着的节点就找不到你了。3.2 VIO电平匹配和SPI串联电阻TJA1145A的SPI接口电平由VIO引脚决定。VIO必须和MCU的IO电平匹配3.3V的MCU就接3.3V5V的MCU就接5V。如果VIO接错SPI通信会出现间歇性失败表现为有时能读寄存器、有时读不出来。SPI信号线上建议串联22Ω到33Ω的电阻。一方面可以抑制信号振铃另一方面可以限制电流。尤其在整车上电时序不确定的情况下如果MCU先上电而TJA1145A的VIO还没有建立SPI引脚之间的电位差可能导致闩锁电流串联电阻能把这个电流限制在安全范围。我在项目里吃过这个亏第一版板子SPI信号直连没有串联电阻。常温下测试一切正常高低温箱里-20℃的时候就出现偶发的寄存器读写失败。后来发现是信号振铃导致片选信号误触发SPI时序在低温下边沿变差加上串联电阻后问题消失。硬件上多几个电阻的成本换来的是可靠性的巨大提升。3.3 WAKE引脚和总线偏置WAKE引脚的信号类型决定了唤醒极性设置。KL15点火信号一般是12V的有源高选择上升沿唤醒如果是低电平有效的硬线信号就选择下降沿唤醒如果是门锁电机这种瞬时脉冲则需要配置双边沿。这些都要在SPI的配置寄存器中设置。WAKE引脚要加滤波电容防止电磁干扰引发误唤醒。经验值是100nF到1µF具体取值取决于信号源的噪声特性和最低有效脉冲宽度。滤波器的时间常数不能超过最短有效唤醒脉冲宽度否则真正的唤醒信号会被滤掉。比如某个唤醒脉冲只有500µs宽RC时间常数就不能超过百微秒量级。再说总线偏置。TJA1145A在休眠状态下总线接口呈高阻态对总线的偏置贡献几乎为零。如果一个CAN网络中大部分节点都休眠了剩下一两个还在工作的节点必须确保偏置电阻仍然起作用否则总线无法维持隐性电平显性电平判定会出错。设计时至少要保证网络上有一个节点提供标准的偏置通常由主节点或者SBC承担否则会出现“所有节点都睡了再也没人能把总线拉回隐性”的尴尬情况。3.4 PCB布线注意事项TJA1145A的CANH和CANL走线要尽量对称、短、靠近连接器。收发器放在板边TVS管放在连接器和收发器之间共模电感如果有放在TVS后面。走线要避免大面积铺铜造成的寄生电容差分阻抗控制在120Ω左右。SPI接口部分要远离CANH/CANL等高压区域的走线防止高速总线信号耦合到SPI上造成寄存器误写。如果说有一条经验是经过血泪教训换来的那就是SPI的CSN线最容易受干扰。只要CSN被拉低收发器就处于选中状态这时候SI上的一个毛刺就会被当成数据写入。CSN线加一个100pF左右的电容到地能有效降低干扰概率。4. SPI配置与休眠唤醒流程实测4.1 SPI帧格式与往返验证TJA1145A的SPI是16位帧格式最高SCLK频率5MHz。一次完整的读写操作包括CSN拉低、发送16位帧、CSN拉高。读操作和写操作的帧结构不同读操作在发送地址之后SO上会返回对应寄存器的数据。动手写代码之前强烈建议先用逻辑分析仪和SPI命令逐一验证帧格式。我常用的验证方法是上电后读一次设备ID或者模式寄存器如果读回的值和手册一致说明SPI通信基本没问题如果读回0xFF或者0x00先查VIO电平再查CSN时序最后查SCLK极性。SPI模式必须按照数据手册设定这个不能猜不同的NXP收发器SPI模式可能还不一样。示例的SPI初始化伪代码// SPI hardware init, e.g., STM32 HAL SPI_HandleTypeDef hspi; hspi.Init.Mode SPI_MODE_MASTER; hspi.Init.Direction SPI_DIRECTION_2LINES; hspi.Init.DataSize SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity SPI_POLARITY_LOW; hspi.Init.CLKPhase SPI_PHASE_2EDGE; hspi.Init.FirstBit SPI_FIRSTBIT_MSB; hspi.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_4; // Read a register: // frame: (read_bit 15) | (addr 8) | 0x00 uint16_t read_reg(uint8_t addr) { uint16_t tx_frame (0x8000) | ((uint16_t)addr 8); uint16_t rx_data 0; HAL_GPIO_WritePin(CSN_GPIO_Port, CSN_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(hspi, (uint8_t*)tx_frame, (uint8_t*)rx_data, 2, 100); HAL_GPIO_WritePin(CSN_GPIO_Port, CSN_Pin, GPIO_PIN_SET); return rx_data 0xFF; }要注意片选信号在两次帧传输之间必须拉高至少一小段时间让收发器完成内部状态更新。连续快速操作时如果CSN没有释放会有偶发的寄存器写失败。4.2 初始化和进入正常工作模式系统上电后TJA1145A默认处于Standby模式INH输出高电平这时候MCU已经供电可以正常执行代码。MCU初始化程序按照这样的顺序操作初始化MCU的SPI外设和GPIO延时等待TJA1145A完成上电复位一般手册会给出tPOR时间实际操作中等待至少1ms比较稳妥通过SPI读取设备状态寄存器确认设备处于Standby模式配置唤醒相关寄存器WAKE引脚极性、ID过滤规则如果需要选择性唤醒配置收发器进入Normal模式确认模式寄存器值正确开始正常CAN通信。进入Normal模式之后TXD和RXD正常接入MCU的CAN控制器。这里要注意TJA1145A的RXD输出和MCU RX引脚之间不需要额外的电平转换VIO已经确定了逻辑电平直接相连即可。4.3 让节点睡下去的正确姿势休眠流程比很多人想象的要讲究。直接写Sleep命令当然能睡但睡不干净、睡后误唤醒都是因为流程不完整。我总结的休眠流程如下MCU先把当前需要发送的CAN报文全部发完清除发送缓冲区CAN控制器进入初始化模式停止总线活动通过SPI写入Sleep命令读取模式寄存器确认设备已经处于Sleep模式等待INH引脚拉低确认后端电源已被切断。第5步很容易被忽略。有些设计中INH和DCDC EN之间有大电容INH拉低之后EN还会保持一段时间的有效电平如果MCU立刻认为已断电可能还没来得及完成最后的Flash写操作就掉电了。所以在软件里要做成写Sleep命令成功后延时几十毫秒再完成最后的关键数据保存。Sleep命令本身还有一个细节TJA1145A进入Sleep的时机。如果总线上仍然有持续的显性电平收发器可能不会立即进入Sleep或者会直接进入唤醒状态。所以在写Sleep命令之前必须确保CAN控制器已经停止驱动TXD否则总线上一直是显性电平收发器无法判断是否该睡。4.4 被唤醒后MCU的恢复流程当远程帧或者WAKE引脚触发唤醒后TJA1145A自动退出SleepINH拉高后端电源恢复MCU开始重新上电启动。MCU的启动代码里需要区分“冷启动”和“唤醒启动”。冷启动时整个系统从头初始化唤醒启动时RAM内容可能已经被清零因为掉电了但可以通过一个备份寄存器或者外部电平状态来判断。我习惯的做法是MCU上电后读TJA1145A的唤醒标志寄存器如果能读到有效的唤醒标志就认为是唤醒启动否则就是冷启动。唤醒启动的初始化流程初始化SPI延时等待TJA1145A稳定读取唤醒标志寄存器保存唤醒原因本地唤醒还是远程唤醒、唤醒帧ID是多少读取模式寄存器确认设备在Standby模式重新配置ID过滤规则有些器件掉电后再初始化配置会丢失写入Normal模式让CAN控制器重新加入总线。这里要特别提醒唤醒后不要急着向总线上发报文。TJA1145A从Sleep恢复到Standby再到Cut掉内部唤醒状态需要一点时间。如果MCU第一时间就往总线上发报文可能会因为收发器还没完全切入Normal模式而导致发送失败。5. 现场误唤醒问题排查的完整链路5.1 诡异场景车停一晚电瓶掉电5%有一次客户反馈新下线的车辆在P档停车一晚后电瓶电量掉了5%这明显不是正常范围。正常整车休眠后静态电流应该在几十毫安以内5%的电量意味着平均静态电流可能到了几百毫安甚至安培级。车上测静态电流是很麻烦的事情需要把万用表串进电瓶负极还要处理防盗系统、远程控制模块这些常电设备。先把嫌疑锁定在CAN网络等待整车进入休眠状态后用示波器抓CAN总线的波形发现每隔几十秒总线上出现一次唤醒活动节点被叫醒之后执行一轮初始化然后又睡过去。反复几次之后有一个模块在初始化过程中把高边驱动打开了带着一个几百毫安的负载然后就再也没关回去。问题找到了方向但为什么会有唤醒活动继续抓总线发现是一帧周期报文把部分节点唤醒了。这就奇怪了因为正常情况下周期报文在休眠阶段是不会发的。后来查出来是网关的发送逻辑有问题它认为自己还在active状态持续往总线上发报文。这帧报文虽然和大多数节点无关但休眠中的节点只要配置了“任意远程唤醒”而没有配置ID过滤就会把这帧报文当成唤醒源。5.2 排查链路从总线波形到ID过滤配置整个排查过程走了一个完整的链路也暴露了TJA1145A使用中的典型问题只用了远程唤醒没有启用选择性唤醒。具体排查步骤示波器抓CAN总线波形抓到了周期性的唤醒脉冲用CAN工具比如PCAN、CANoe侦听总线确认唤醒脉冲对应的是0x275这帧报文逐个检查休眠节点的SPI配置发现所有节点的ID过滤寄存器都是默认值等于说没有任何过滤条件任何报文都能唤醒修改配置让节点只匹配自己关心的报文ID重新做静态电流测试误唤醒消失。这里暴露出的设计问题是我在项目初期为了省事把选择性唤醒功能关了只用了最基本的远程唤醒。结果就是整个网络节点对总线上任何活动都敏感。这个教训说明只要节点不是全网段必须响应的那种就应该启用ID过滤把唤醒范围收到最小。另外也要注意有多个节点共享同一帧报文的情况ID过滤要配置相同的过滤条件否则会出现同一个报文只唤醒部分节点的情况。5.3 另一次误入SleepSPI毛刺引发的事故还有一次问题出在SPI通信本身。节点的MCU在正常工作中突然掉电看起来像是误进入了休眠模式。用示波器看INH引脚果然被拉低了。排查过程是这样的先把TJA1145A的SPI通信关掉INH恢复高电平确认硬件电路没问题。然后重新打开SPI复现问题。逻辑分析仪抓取SPI信号发现CSN线上偶尔出现一个很窄的低脉冲刚好和附近的强干扰信号对上。CSN被拉低之后SI线上正好有一个杂散信号TJA1145A把这两个信号组合解释成了“写Sleep寄存器”。这个问题的根因是PCB布局不合理SPI的CSN走线经过了继电器驱动区域继电器动作时的电磁干扰耦合到了CSN线上。解决办法是双管齐下硬件上把CSN走线移开加滤波电容软件上把SPI片选操作改成原子操作CSN拉低之后立即发送数据减少暴露窗口。这个案例也解释了为什么上一节强调SPI走线要远离干扰源。很多问题是硬件布局不合理和软件时序不规范共同作用的结果只修一个治标不治本。5.4 用SPI手动操作三个模式验证排查问题的时候有一个方法非常有效手动通过SPI命令依次切换三种模式观察INH和总线的状态确认硬件基础功能正常。操作步骤是上电后读寄存器确认设备在Standby模式INH为高发送Normal模式命令测量CANH和CANL之间的差分电压确认输出正常退回到Standby模式确认总线上没有活动发送Sleep命令用万用表或者示波器测量INH电压确认拉低在总线上发送唤醒帧确认INH重新拉高设备回到Standby。这个过程能快速把问题定位到硬件还是软件如果在模式手动切换中都出现状态异常怀疑硬件和SPI通信如果手动切换正常但整机运行时异常问题多半在MCU的软件状态机或者外部干扰。我至今保留着这套手动测试流程每次新板子回来第一件事不是急着跑应用代码而是用SPI命令把三种模式来回切几遍确认最底层的收发器功能没问题。这套“先硬件后软件”的测试逻辑能省掉后面大量的联调时间。6. 时序细节、边界条件与小技巧6.1 上电时序与VIO先后的影响TJA1145A的上电时序值得花点心思。理想情况是VBAT和VIO同时上电或者VIO先上电但如果系统设计导致VIO晚于VBAT很久才建立SPI引脚可能会处于不确定状态。最典型的场景KL30一直给TJA1145A供电而MCU这一侧由另一个使能信号控制DCDC。当INH还没拉高、MCU还没上电的时候TJA1145A的SPI引脚悬空或者被外部电路拉到某个电位可能会产生内部漏电。解决思路有两个。第一在SPI信号线上串联电阻限制电流第二如果MCU始终由INH控制供电那么SPI引脚的电平关系其实是确定的MCU掉电时TJA1145A也处于Sleep状态引脚不会主动驱动。但如果设计成了MCU电源和TJA1145A电源分离就要特别看数据手册上的ESD和闩锁说明。实际项目中我是这样处理的SPI的CSN、SCLK、SI线都串联22Ω电阻并且在靠近TJA1145A一侧各加一个10kΩ下拉到GND防止引脚悬空导致内部逻辑误动作。TXD引脚也一样MCU没上电时TXD会被下拉到GNDTJA1145A不会因此认为总线是显性。6.2 模式切换时间与总线仲裁的配合TJA1145A从Normal切到Standby再到Sleep每一级切换都有内部延时。写代码时如果刚写完模式切换命令立刻去读模式寄存器可能读到的是旧值。一般的做法是加一个小的轮询等待比如循环读模式寄存器直到值正确超时则报错。更关键的是总线仲裁和休眠的联动。在多个节点共存的CAN网络中如果有个节点正在发送长帧而另一个节点进入了Sleep这本来不冲突因为Sleep节点不参与总线。但如果是主节点要进入Sleep而总线上还有从节点在主动发报文主节点睡过去之后从节点还在等ACK这就会导致从节点发送错误。所以休眠流程要放在“网络级”考虑所有的相关节点约好进入休眠的时间窗口。最简单的方式是定义一帧特定的“休眠广播帧”主节点发送后所有节点延时相同时间进入休眠流程。延时时间要大于CAN帧的最大报文传输时间确保广播帧被所有节点收到后总线上不再有新的发送。6.3 唤醒标志复位与多次唤醒处理TJA1145A的唤醒标志寄存器记录唤醒事件。MCU处理完唤醒原因之后要记得清除标志。如果不清理下一次冷启动时读到的还是老标志会把冷启动误判成唤醒启动。多次唤醒的处理也要注意。如果总线上有多帧唤醒报文连续到达TJA1145A可能在这段时间内反复触发唤醒事件但最后只会保留一个唤醒标志。MCU应该在初始化完成后读取标志然后立刻清除避免中断服务程序里重复处理。还有一种情况是“唤醒后又快速进入休眠”。比如总线上的报文只有零星几帧节点被唤醒后M CU开始初始化初始化还没完成总线已经安静了有的设计会立刻再次进入Sleep。这里要小心如果MCU的启动时间太长会错过报文。解决方法是唤醒后保持至少几百毫秒的“活跃时间窗口”在这个窗口内不论总线是否空闲都不进入休眠确保MCU完成初始化和信息上报。6.4 一些零碎但值得记住的经验最后整理几条边边角角的经验都是实际调试中碰到的。第一读模式寄存器做状态确认时不要用单次读的结果做判断。我习惯连读三次两次结果一致才认为状态正确。原因是SPI通信在强干扰环境下单次传输的误码率虽然低但车载环境总有意外用冗余读取能过滤掉绝大部分偶发错误。第二VBAT的电源滤波电容要有足够的容量推荐至少10µF陶瓷电容并联一个0.1µF高频电容。TJA1145A唤醒的瞬间要驱动INH拉高如果VBAT电源阻抗太高电压跌落可能导致内部逻辑异常。第三如果项目里同时用了TJA1145A和MCU内置的CAN控制器要确认CAN控制器的唤醒中断和TJA1145A的唤醒事件是同步的。实际测试时有时MCU先检测到CAN总线上有活动但TJA1145A还没完成唤醒这时候如果MCU的CAN控制器立刻尝试同步会报错。最好的做法是以TJA1145A的INO/唤醒标志作为唤醒主信号MCU的CAN控制器再做二次确认两个信号都满足才认为系统真正唤醒。第四测试休眠唤醒的稳定性时最有效的手段是压测把节点配置成反复“工作1秒休眠10秒”的循环跑一整晚第二天早上看是否有节点卡死在错误状态。这个方法能暴露大多数状态机边界问题。第五不要在一张板子上混用TJA1145A和普通收发器做对等通信测试两者的唤醒行为和总线偏置特性不同测出来的结果不能代表整车环境。要模拟整车至少需要三个以上的节点其中一个作为主节点保持常工作状态。TJA1145A这个器件的表面看起来不复杂手册也不厚但它把“休眠唤醒”这个看似简单的功能做得很深。真正用好的关键不在寄存器配置本身而在于对整个电源架构的理解以及对总线级休眠唤醒时序的把握。我个人的体会是第一次做这类设计一定要从网络全局的角度来规划休眠策略而不是只盯着一个节点。先把每个节点什么时候睡、被谁唤醒、唤醒后干什么理清楚再动手画板子写驱动后面能少走很多弯路。
返回列表