ARTICLE DETAIL

资讯详情

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

TJA1145A实战:低功耗CAN收发器与局部网络唤醒设计

TJA1145A实战:低功耗CAN收发器与局部网络唤醒设计 搞车身电子的人基本都绕不开一个经典问题整车静态电流怎么压下去。尤其现在新平台动不动要求休眠电流低于100µA而传统的CAN收发器只要挂在总线上总会有漏电流MCU还得一直保持巡检。我这两年经手的好几个项目中TJA1145A这颗CAN收发器确实帮了大忙——它把“休眠监听”和“按需唤醒”这两个看似矛盾的需求用一种很优雅的方式解开了系统可以几乎完全断电但总线上出现特定唤醒帧时它又能把整个系统从零拉起来。如果你正在做BCM、网关、PEPS或者车载传感器的低功耗设计又被“收发器怎么睡得更沉”和“睡太死叫不醒”这两件事来回折磨那这篇文章应该能帮你省不少折腾时间。我会从TJA1145A的低功耗模式状态机、唤醒源配置、典型硬件电路到SPI寄存器的实际配置和调试中的坑全部用实战视角过一遍。1. TJA1145A为什么值得单独拿出来讲局部网络唤醒的工程价值1.1 传统CAN收发器在低功耗场景的痛点先说一个常见场景。早期方案里很多工程师会直接用TJA1043这类支持待机模式的收发器再加一个MCU的低功耗定时唤醒配合外部看门狗。这套方案能跑但问题也不少总线上一旦有其他节点在通信收发器就会把整条总线的活动都当成唤醒条件MCU无缘无故被拉起来。想象一下你正在家睡觉楼道里任何一个人走过门铃都会响你还得起床开门确认一下外面是谁。这种情况在整车上非常普遍车门模块、车灯模块、座椅模块互相之间有大量周期性报文任何一个报文都可能把休眠中的节点带醒。于是大家开始想能不能让收发器只对“跟自己有关的报文”做出反应这就引出了局部网络Partial Networking的概念。简单说每个节点可以配置一个唤醒过滤条件总线上跑的数据帧如果匹配这个条件收发器才通知MCU不匹配的话MCU继续睡收发器也继续维持极低功耗的监听状态。TJA1145A就是这个思路的典型产物。1.2 TJA1145A的核心能力拆解TJA1145A是NXP面向汽车局部网络推出的一颗高速CAN收发器。它最大的卖点不是普通收发器那种“能收发就行”而是把低功耗监听和选择性唤醒做进了硬件里。它的几个关键能力我简单列一下支持ISO 11898-2:2016定义的唤醒帧和唤醒模式不光能识别传统的唤醒脉冲序列还能识别真正的CAN帧甚至是CAN FD帧。具备完整的低功耗状态机可以在Normal、Standby、Sleep三个模式之间切换其中Sleep模式下INH引脚会拉低把外部稳压器关掉实现系统级断电。内置局部网络唤醒逻辑通过配置唤醒帧ID和掩码可以做到“只认自己关心的报文”。VIO引脚独立供电可以方便地和3.3V或者5V的MCU直连不用额外加电平转换电路。符合AEC-Q100车规认证工作温度范围够宽适合前装量产。其中“支持CAN FD唤醒帧校验”这一点我特别提一下。现在很多新平台的网关和域控制器都在用CAN FD老款TJA1145只能校验经典CAN帧升级到TJA1145A之后才能对CAN FD报文里的ID和帧内容做过滤判断。如果你选型时只注意到了“TJA1145”这个名字没注意后缀A很可能在CAN FD项目上踩坑。1.3 和其他收发器方案放在一起比我经常被问到“TJA1145A和TJA1043、TJA1145T到底有什么区别”。这三颗芯片定位不同简单对比一下型号待机电流典型值局部网络唤醒SPI配置INH引脚适用场景TJA1043较低不支持总线活动即唤醒无有简单的低功耗节点成本敏感TJA1145T低支持经典CAN帧过滤有有需要按ID选择性唤醒的经典CAN项目TJA1145A低支持含CAN FD帧过滤有有新平台CAN FD总线局部网络唤醒节点TJA1145A和TJA1145T最核心的差别就在能不能校验CAN FD唤醒帧。另外一个容易被忽略的点是TJA1145A对VIO和VCC的上电时序要求更宽松实际布局时更省心。选型时如果你的总线已经上了CAN FD别犹豫直接选TJA1145A。2. 引脚功能、模式状态机与唤醒源2.1 关键引脚功能速查搞懂TJA1145A的引脚是后面调电路和写代码的基础。我列几个核心引脚具体封装引脚号建议以你手头物料的数据手册为准引脚名称功能设计注意事项TXD数据发送输入连接MCU的CAN TX在Standby/Sleep下被禁用不能驱动总线RXD数据接收输出连接MCU的CAN RX在唤醒事件发生时会被拉低可作为唤醒中断输入STBN待机控制引脚低电平进入待机低电平有效正常工作时拉高INH电池电压输出用于控制外部稳压器使能Sleep模式下输出低关断外部电源WAKE本地唤醒输入可接按键、KL15、门开关等外部唤醒源VIOI/O电平参考电源接MCU的I/O电源支持3.3V或5VVCC收发器内部逻辑电源需要常供电务必选低静态电流的电源路径CANH/CANL总线差分信号走线注意ESD和共模电感布局SCLK/MOSI/MISO/NCSSPI接口用于配置唤醒帧过滤参数和读取状态具体看型号版本这里要特别强调VIO引脚。VIO决定了RXD、STBN这些引脚的逻辑电平。MCU如果跑3.3VVIO就接3.3VMCU跑5VVIO就接5V。如果VIO接错轻则逻辑电平不匹配重则灌电流损伤引脚。2.2 三个模式的真实区别TJA1145A的Normal、Standby、Sleep三个模式很多人看到数据手册里那几张状态图就晕我换个方式说。Normal模式就是正常干活的状态TXD和RXD通路打开收发器能正常收发报文INH输出高电平外部电源正常供电。Standby模式相当于“浅睡”。这时候TXD被禁用收发器不再往总线上发东西但还在监听总线上的活动RXD可以反映唤醒事件INH继续保持高电平。这个模式适合MCU自己还想保持一部分功能的场景比如MCU进了低功耗模式但外部传感器还需要供电。Sleep模式才是真正的“深睡”。收发器内部大部分电路都关掉了INH输出低电平把外部稳压器一起关掉MCU直接断电。这个模式下只有总线上的唤醒帧或者WAKE引脚上的本地唤醒事件能把系统拉起来。为什么非要区分Standby和Sleep因为有些场景下MCU只是短期打盹不希望外部传感器断电那用Standby就够了有些场景是长时间停车要求整车静态电流压到极低那就必须进Sleep把能断电的全断了。2.3 唤醒源到底有哪几类TJA1145A的唤醒源分两类总线唤醒和本地唤醒。总线唤醒又分成两种一种是传统的唤醒模式WUP就是总线上出现一定时长的连续显性电平脉冲符合ISO 11898-2:2016规定的时间窗口收发器就认为总线上有人要叫醒它不管具体报文内容。另一种是唤醒帧WUF收发器会真正解析总线上的帧把帧ID和配置好的唤醒ID做比对匹配才唤醒。前者简单粗暴后者精细可控。本地唤醒就是靠WAKE引脚的电平变化。比如车门模块接了一个门开关开门的时候开关闭合WAKE引脚电平跳变收发器唤醒系统。这个引脚上一般要加RC滤波防止抖动导致误唤醒。实际项目中总线唤醒和本地唤醒经常同时用。比如说BCM在休眠时既要能通过CAN总线被网关远程唤醒又要能通过硬线信号被车门开关本地唤醒。TJA1145A会把这些唤醒事件记录在状态寄存器里MCU起来之后读一下就能知道是谁叫醒的从而决定接下来执行哪套逻辑。3. 典型硬件电路设计与参数计算3.1 电源拓扑让INH真正管住整块系统TJA1145A低功耗设计中最重要的一条电路是INH引脚控制外部电源。INH引脚内部相当于一个受状态机控制的电子开关它输出的电压直接来自电池或常电在Normal和Standby模式下是高电平在Sleep模式下是低电平。实际电路里INH一般接到主电源路径上DCDC或者LDO的使能引脚。比如系统的主电源是一颗3.3V的LDO给MCU和传感器供电那TJA1145A的INH就接到这颗LDO的EN脚上。芯片一进SleepINH拉低LDO关断MCU掉电整条电源路径上除了TJA1145A的VCC常供电之外几乎没有电流。这里有个关键点TJA1145A的VCC必须单独一路常电而且这路常电的静态功耗要足够低。我一般选静态功耗在微安级的超低功耗LDO来给VCC供电比如TPS7A16系列这种不然收发器是睡着了前面那颗LDO自己还在耗电得不偿失。电阻分压也要注意。有些LDO的EN引脚是电压阈值型不是标准逻辑电平型EN引脚的输入漏电流会导致INH电压被拉低。如果发现系统休眠后INH电压不是彻底的低电平而是悬在一个中间电压那很可能就是EN脚漏电和分压电阻的问题。3.2 总线侧电路设计要点CAN总线侧的电路基本套路大家都清楚CANH和CANL之间接终端电阻进线处加TVS管防浪涌靠近芯片端加共模电感抑制EMI。但有一个针对低功耗场景的细节容易被忽略休眠时节点内部的终端电阻是否还挂在总线上。部分网络唤醒场景下总线上可能有多个节点如果一个节点休眠了它内部的60欧姆终端电阻还接在CANH和CANL之间会额外消耗总线电流还会改变整个网络的阻抗匹配。所以设计时最好选择可以断开终端电阻的方案或者在布局上把终端电阻放在由INH控制的那路电源后面这样休眠时电阻自动断开。如果TJA1145A这颗物料带SPLIT引脚那还要在SPLIT引脚和地之间加一颗5nF左右的电容。这颗电容的作用是把总线共模电平稳定在0.5VCC附近对CAN FD的高频通信尤其重要。电容选X7R材质耐压不低于50V别用Z5U那种温漂大的。3.3 WAKE引脚硬件设计与滤波计算WAKE引脚的本地唤醒功能很多新手会以为接个开关就完事了其实要做的事情不少。首先根据唤醒极性配置确定WAKE引脚是默认高还是默认低。比如门开关闭合接地MCU希望“接地”是唤醒事件那Wake极性就配置为下降沿有效平时要靠上拉电阻把WAKE引脚拉到高电平。上拉电阻的阻值选择要兼顾两个东西一个是静态电流这个电阻是从常电VCC拉的阻值太小时休眠电流会增大另一个是抗干扰能力阻值太大时走线附近有干扰容易误触发。我常用的是47kΩ到100kΩ具体看线束长度和EMC测试结果来调。RC滤波时间常数也不是越大越好。滤波时间太长真实的唤醒事件可能会被滤掉太短抖动和干扰又会透传进来。对车门开关这种机械触点我用10kΩ和100nF时间常数1ms左右实测够用。如果你在搞更高频的唤醒源比如KL15那种车身控制信号可以适当缩小时间常数。3.4 一个可直接参考的最小系统电路清单我把一套实际量产过的TJA1145A外围电路清单整理出来供参考VCC常电输入电池经过一个超低功耗LDO输出5V给TJA1145A VCCLDO选型时注意静态电流低于5µA。VIO输入接MCU的I/O电源3.3V。INH输出接主LDO的EN引脚主LDO给MCU和外设供电。CANH/CANL接TVS管、共模电感终端电阻和电容根据网络拓扑选择。WAKE输入47kΩ上拉电阻接VIO串10kΩ电阻并联100nF电容到地。SPI接口SCLK、MOSI、MISO、NCS四根线连接MCU走线不超过10cmSPI时钟建议不超过2MHz线束环境差可以降到1MHz。这个电路的核心思路就是TJA1145A自己有独立常电但整个系统的主电源全部挂在INH后面。休眠时除了VCC那一路微安级的电源其他全部断电。4. 模式切换与唤醒流程的代码级实现4.1 进入Sleep模式的软件流程很多人拿到TJA1145A第一个问的问题就是怎么让它睡过去这里有一个容易出错的地方就是进Sleep之前必须要保证总线上没有正在进行的通信否则收发器可能误判总线状态导致进Sleep失败或者异常唤醒。我习惯的流程是void tja1145a_enter_sleep(void) { // 1. 关闭MCU端CAN控制器停止发送 can_controller_stop(); // 2. 确保总线空闲至少等一个完整帧间隔 while (!can_bus_idle()) { } delay_ms(10); // 3. STBN拉低先进入Standby模式 gpio_write(STBN_PIN, GPIO_LOW); delay_ms(5); // 4. 通过SPI写入Sleep模式命令 // 具体寄存器地址和值以芯片手册为准 tja1145a_spi_write(REG_MODE_CONTROL, 0x02); // 5. 等待INH拉低确认进入Sleep // 实际产品中INH会经过电阻分压反馈到MCU的ADC或GPIO for (int i 0; i 100; i) { if (gpio_read(INH_FB_PIN) GPIO_LOW) { break; } delay_ms(1); } }注意第3步STBN拉低只是让收发器进入Standby真正进入Sleep需要后面对寄存器做写入。如果只拉低STBN不写寄存器收发器会一直待在StandbyINH不会拉低整个系统电都断不掉静态电流自然降不下来。如果用的是不带SPI的简化版本物料那模式切换完全靠STBN引脚的电平序列来实现具体时序要去翻数据手册的时序图。量产项目里我推荐带SPI的版本软件可控性高很多。4.2 唤醒帧过滤的SPI寄存器配置局部网络唤醒的精华全在唤醒帧的过滤配置上。TJA1145A内部有几组寄存器专门保存唤醒帧ID、掩码和有效性信息。所谓掩码就是决定ID的哪些位必须匹配哪些位可以忽略。举个例子如果我要只响应0x123这个标准帧ID配置大致是这样void tja1145a_config_wakeup_frame(void) { // 唤醒帧ID低字节 tja1145a_spi_write(REG_WUP_ID_LOW, 0x23); // 唤醒帧ID高字节标准帧ID是11位存放在高3位 tja1145a_spi_write(REG_WUP_ID_HIGH, 0x01); // 掩码寄存器全部置1表示所有位都必须匹配 tja1145a_spi_write(REG_WUP_MASK_LOW, 0xFF); tja1145a_spi_write(REG_WUP_MASK_HIGH, 0x07); // 配置为标准帧唤醒数据长度不校验 tja1145a_spi_write(REG_WUP_CONFIG, 0x00); }不同的ID过滤要求掩码写法不一样。如果我想同时响应0x123和0x124那掩码的低两位就可以置0只匹配高9位。灵活度很高但配置错一个bit唤醒帧怎么发都叫不醒。调试时可以先开一个比较宽松的掩码验证整个唤醒链路通了再逐步收紧。另外要注意TJA1145A的唤醒帧过滤能做完整的CAN FD帧校验但前提是总线上跑的确实是CAN FD帧。如果总线是经典CAN那还是按经典帧格式去配唤醒ID别把CAN FD的配置逻辑混进去。4.3 唤醒事件响应和唤醒源判断唤醒后MCU要做的第一件事不是立刻发报文而是先搞清楚“我是被谁叫醒的”。TJA1145A会把最近的唤醒事件记录在状态寄存器里MCU上电初始化的时候先读这个寄存器判断唤醒源。uint8_t tja1145a_get_wakeup_source(void) { uint8_t status tja1145a_spi_read(REG_STATUS); // bit0: 总线唤醒, bit1: WAKE引脚唤醒, bit2: 本地SPI唤醒 return status 0x07; }拿到唤醒源之后软件再做对应的处理。比如说总线唤醒说明是网关或者其他域控制器发来了远程唤醒帧MCU应该进入正常的通信状态先发一个应答报文再执行后续业务逻辑。如果是WAKE引脚唤醒那可能是驾驶员按了钥匙按钮MCU可能要先去做安全校验而不是直接上总线。这里再提醒一个细节唤醒之后收发器往往还停留在Standby模式RXD虽然会在唤醒时拉低一个脉冲但要真正通信还得把STBN拉高让收发器回到Normal模式。软件上别漏了这一步不然等半天总线没有响应很懵。4.4 唤醒后快速稳定通信的经验收发器从Sleep唤醒到Normal内部电路需要一点稳定时间。这个时间通常在几十到几百微秒不等具体看数据手册。唤醒后如果MCU立刻往总线上发报文可能因为收发器内部还有残余状态导致第一帧发不出去或者发错。我的做法是唤醒后先延时2ms到5ms再初始化CAN控制器再发第一帧。虽然是笨办法但可靠。后面如果对唤醒时间有严格要求再根据逻辑分析仪的实测数据把这个延时压到最小。CAN FD场景下唤醒后还要确认收发器是不是真的支持CAN FD模式。如果配置不对收发器可能会用经典CAN的物理层时序去处理CAN FD帧直接导致总线错误帧满天飞。检查方法是在唤醒后读一下收发器的模式寄存器确认通信速率设置。这个检查多一点后面排查问题会省很多事。5. 实测中的常见问题与排查记录5.1 休眠电流偏高的排查顺序休眠电流降不下来是我被问得最多的问题。绝大多数情况下不是芯片出了问题而是外围还有“偷电”的路径。排查的时候按这个顺序来先确认TJA1145A是不是真的进了Sleep。看INH引脚是否拉低如果INH还是高电平说明模式切换没成功。再看VCC那路LDO的静态电流。有些LDO标称低功耗实际在轻载下静态电流很大用万用表串进去实测。然后逐一断开MCU、传感器等负载看电流变化。这时候如果发现断开某个负载电流就下来了那就是外部断电不彻底可能主LDO还在输出或者MCU的GPIO在漏电。最后检查电阻网络。之前做过的某个项目中板子上有大阻值下拉电阻接在常电上几百kOhm的电阻休眠时也有几微安电流虽然不多但多路叠加就超标了。用表格总结一下现象可能原因排查方法静态电流高出标称值100uA以上INH没有拉低芯片未进Sleep示波器抓INH电平逐句检查SPI配置电流接近10mA级别主LDO还在工作看INH到EN的通路是否被其他上拉抢到高电平电流偶发跳变MCU部分GPIO悬空导致漏电检查所有GPIO上下拉配置电流随时间慢慢下降大电容放电过程静置几分钟再读取电流值5.2 总线唤醒没有响应唤醒帧发出去示波器上总线波形明明有了但系统一点反应没有。这时重点查三块第一唤醒帧本身是否符合协议要求。你不能直接发一个完整CAN帧就当唤醒帧TJA1145A的总线唤醒其实有好几级条件。以ISO 11898-2:2016的WUP为例总线上必须检测到连续多个显性位且显性持续时间落在窗口范围内。如果唤醒帧格式不对比如显性脉冲太短或者太长收发器会认为不是有效唤醒。第二检查唤醒ID配置。用SPI读回配置寄存器确认写入的ID和掩码真的写进去了。有的芯片上电后寄存器会有默认值可能会覆盖掉你的配置需要在上电初始化时重新写一遍。第三检查是否被误判为本地复位或别的异常。如果状态寄存器里显示的不是总线唤醒源那说明收发器根本没识别到总线唤醒帧问题多半在前面两级。实际调这种问题时示波器双通道同时抓CANH和RXD触发方式设为CANH出现显性电平就能看到从总线唤醒脉冲到RXD拉低之间的具体延迟判断收发器内部是否真的响应了。5.3 INH掉电后反复抖动这个现象很隐蔽关断之后用示波器看INH引脚发现它不是干净地掉到低电平而是掉到一半又弹回去反复抖动几次才稳定。这个问题的根源往往在负载侧。主LDO关断后后级大电容还在放电MCU还没来得及完全掉电它的GPIO可能还在维持某些内部上拉导致INH节点被拉到一个模棱两可的电平。TJA1145A检测到电压没真正掉到逻辑低又尝试恢复正常输出形成反复。解决方法有几个一是把INH到LDO EN脚之间串一个100kOhm电阻缩小负载电流对INH的冲击二是在INH引脚上并联一个100nF电容滤掉瞬态抖动三是确保MCU掉电前先把所有GPIO配置成高阻或下拉别让MCU的引脚在掉电过程中持续供能。如果是带SPI的版本还有一种可能是SPI通信异常收发器在Sleep边缘不断收到错误命令跳出Sleep又回去。可以在SPI总线上加个上拉电阻防止休眠期间总线噪声被当成通信。5.4 唤醒后CAN通信异常系统确实被唤醒了MCU也起来了但总线上开始报错。这种情况我从两个角度排查。角度一收发器是否在唤醒后成功切回了Normal模式。如果STBN引脚没拉高收发器还在Standby它不能正常发送报文TXD虽然能把数据送进去但总线不会有任何反应对端节点等不到应答自然报错。角度二总线波特率匹配。唤醒后MCU从低功耗状态恢复如果晶振还没稳定就初始化CAN控制器波特率可能会有偏差导致错误帧。我遇到过某颗MCU唤醒后晶振起振时间特别长程序却早就执行到CAN初始化等到对端节点发来同步报文两边频率对不上整个网络直接瘫痪。这个阶段最有效的调试工具不是万用表而是带CAN解码的逻辑分析仪。把唤醒帧、RXD、TXD、STBN四路信号拉进同一窗口一眼就能看出时序问题出在哪里。6. 最后分享一点个人经验这个项目做下来最大的感受是TJA1145A本身芯片逻辑并不复杂复杂的是它和电源、MCU、总线体系联动的时序。很多问题从单点看都是对的合在一起就出鬼原因就是唤醒、掉电、恢复这几个状态切换的边界条件没有处理好。调试时把示波器的时间轴拉长看完整的事件序列比盯着某个瞬间的波形有意义得多。另外无论你的代码逻辑多顺手SPI寄存器配置多熟练动手之前一定要把TJA1145A的数据手册翻一遍特别是你手头物料具体后缀的勘误表。不同批次、不同封装后缀的芯片个别寄存器默认值可能会不一样。小技巧是调试阶段先写一个SPI回读函数读所有寄存器内容并通过串口打印出来和手册上的默认值做比对能筛掉一大批配置问题。做低功耗项目没有捷径但有一条经验很管用把“状态机”三个字刻在脑子里。软件的状态机要跟着芯片的状态机走硬件的电源切换也要跟着状态机走。先把整套唤醒流程用一段时间轴图画出来再写代码成功率会高很多。
返回列表