资讯动态

TJA1145低功耗CAN网络设计:SPI配置与休眠唤醒全流程避坑指南

发布时间:2026/9/24 12:41:38 来源:尧图企业网站定制
车载网络里的低功耗设计真正让人头疼的从来不是休眠这个动作本身而是怎么让整个CAN网络里的所有节点都干净利落地睡下去再整整齐齐地醒过来。我做过好几个带TJA1145的项目从最初被SPI配置坑到怀疑人生到后来能把整条总线的静态电流压到几百微安中间踩的坑足够写一本小册子。TJA1145这颗收发器在业内用得极广它支持部分网络Partial Networking功能能根据特定CAN帧选择性唤醒理论上非常适合做低功耗CAN网络。但理论归理论实际配置起来SPI通信时序、寄存器位定义、唤醒帧的ID匹配逻辑每一个环节都可能让你卡上两三天。这篇内容我打算把TJA1145从硬件连接到SPI寄存器配置、再到休眠唤醒流程的完整链路拆开讲清楚重点放在那些数据手册里写得含糊、但实际调试中一定会遇到的问题上。不管你是刚接触车载低功耗设计的新手还是已经在调TJA1145但被某个诡异现象卡住的老手应该都能从里面找到有用的东西。1. 先搞清楚TJA1145到底在低功耗CAN网络里扮演什么角色1.1 普通CAN收发器和TJA1145的本质区别很多人第一次接触TJA1145的时候会把它当成一颗带休眠功能的CAN收发器这个理解不算错但远远不够。普通的CAN收发器比如TJA1042、TJA1051它们的工作模式无非就是正常模式和待机模式待机模式下收发器不驱动总线但也不会去听总线上的动静——它没法自己判断该不该醒过来。而TJA1145的核心价值在于它内置了一套完整的唤醒帧识别逻辑可以在MCU完全断电的情况下自己监听CAN总线上的报文判断这帧报文是不是叫自己起床的那一帧。这个区别带来的设计差异是巨大的。用普通收发器做低功耗你通常需要MCU定期醒来轮询总线或者依赖KL15硬线信号来唤醒前者做不到真正的低功耗后者增加了线束成本。而TJA1145让你可以做到MCU彻底断电收发器靠极低的待机电流维持监听只有当总线上出现符合预设条件的CAN帧时才通过INH引脚或RXD引脚把MCU唤醒。这就是部分网络Partial Networking的核心思想。从系统架构上看TJA1145在低功耗CAN网络里的角色可以这样理解它是整个ECU的门卫MCU是主人。主人睡觉的时候门卫在门口守着只有拿着正确通行证的人来了门卫才去敲门叫醒主人。通行证就是那帧特定的CAN报文而通行证的验证规则就写在TJA1145的寄存器里。1.2 部分网络功能对整车功耗的实际影响我拿一个实际项目的数据来说明。某车型有12个ECU挂在同一条CAN总线上原来用的是普通收发器方案整车休眠后静态电流大约在8mA左右因为每个ECU的MCU都需要定期唤醒轮询。换成TJA1145方案后每个ECU的MCU可以完全断电只有TJA1145保持在待机监听模式单颗TJA1145的待机电流典型值在50微安左右12个节点加起来也就0.6mA加上其他常电负载整车静态电流降到了2mA以下。这个数据差异在新能源车上尤其关键因为新能源车的蓄电池容量相对有限静态电流直接影响到车辆停放多久后会出现亏电无法启动的问题。很多主机厂对静态电流的要求是整车不超过某个阈值常见的是3mA到5mA如果每个ECU都用传统方案很容易超标。但要注意TJA1145的低功耗优势只有在正确配置的前提下才能发挥出来。我见过不少项目用了TJA1145但因为配置不当待机电流反而比普通收发器还高原因后面会详细说。1.3 什么场景下必须用TJA1145而不是普通收发器不是所有项目都需要TJA1145。如果你的ECU不需要在整车休眠时被特定CAN帧唤醒或者你的ECU本身就有KL15硬线唤醒信号那用普通收发器就够了没必要增加成本和复杂度。但以下几种场景TJA1145几乎是必选项整车静态电流要求严格比如新能源车、高端燃油车主机厂明确要求整车静态电流低于某个值每个ECU都必须贡献自己的力量。需要选择性唤醒同一条总线上有多个节点但某个特定功能只需要唤醒其中一部分节点其他节点继续休眠。比如充电枪插入时只需要唤醒充电相关ECU不需要唤醒车窗、座椅等舒适性ECU。没有独立唤醒硬线ECU的安装位置导致无法布置KL15或其他硬线唤醒信号只能通过CAN总线唤醒。需要快速响应总线活动TJA1145可以在总线出现有效唤醒帧后极短时间内唤醒MCU比MCU自己轮询的响应速度快得多。理解了这个前提后面的SPI配置和休眠唤醒流程才有意义。如果你连为什么要用TJA1145都没想清楚配置寄存器的时候很容易迷失在那一堆位定义里。2. 硬件设计阶段就要避开的几个坑2.1 电源引脚和INH引脚的接法决定了你能不能正常休眠TJA1145的电源引脚设计是硬件阶段最容易出问题的地方。先看它的引脚定义VBAT是电池供电引脚VCC是5V或3.3V供电引脚VIO是I/O电平参考引脚。这三个引脚的供电时序和去耦电容配置直接影响到收发器能否正常进入和退出休眠。VBAT必须直接连接到常电Kl30不能经过任何可控开关因为收发器在休眠时仍然需要VBAT供电来维持总线监听。VCC通常由MCU侧的电源管理芯片提供但要注意当MCU断电时VCC也会掉电此时TJA1145必须能够仅靠VBAT维持待机模式。如果你的硬件设计让VCC掉电后TJA1145也完全断电了那它就没法监听总线了。INH引脚是TJA1145的唤醒输出引脚它是一个高边开关驱动输出通常用来控制MCU侧的电源管理芯片或者直接控制稳压器的使能引脚。当TJA1145检测到有效唤醒事件时INH引脚拉高打开MCU的电源MCU启动后再通过SPI去读取TJA1145的状态寄存器确认唤醒源。这里有个关键点INH引脚的默认状态和上电行为必须和你的电源管理芯片匹配。我遇到过一种情况TJA1145上电瞬间INH会有一个短暂的脉冲导致MCU被误唤醒后来在电源管理芯片的使能引脚上加了一个RC延时才解决。2.2 晶振和唤醒帧检测精度的关系TJA1145内部有一个振荡器用于唤醒帧检测但它也可以使用外部晶振来提高检测精度。数据手册里会提到如果使用内部振荡器唤醒帧的位时间容差会比较大在CAN波特率较高比如500kbps或者总线负载较重的情况下可能会出现漏唤醒或误唤醒。我的建议是如果你的CAN波特率在125kbps以上或者对唤醒可靠性要求高一定要接外部晶振。外部晶振通常选16MHz通过XTAL1和XTAL2引脚连接。晶振的负载电容要按晶振厂商的规格来配一般是十几皮法不要随便拿两个22pF就往上焊负载电容不匹配会导致起振困难或者频率偏移。另外晶振的布局也很讲究。XTAL1和XTAL2的走线要尽量短远离CAN总线和电源走线晶振下方不要走任何信号线最好在晶振下方铺地并打过孔。这些是射频电路的基本功但在车载ECU里同样适用因为晶振频率偏移会直接影响唤醒帧的位时间检测。2.3 CAN总线端接电阻和共模电感的选型细节TJA1145的CANH和CANL引脚外部需要接什么分两种情况如果这个ECU是总线的一个终端节点需要接120欧姆的端接电阻如果是中间节点不需要接端接电阻。但实际项目中很多ECU的安装位置决定了它可能是终端也可能不是这时候可以用两个60欧姆电阻串联中间接地的方式或者预留端接电阻的位置根据实际装车情况选择是否焊接。共模电感的选择也需要注意。TJA1145支持CAN FD吗标准版本的TJA1145支持CAN FD的通信速率但在休眠唤醒的帧检测上它检测的是标准CAN帧格式。共模电感的选型要保证在目标波特率下不会引入过大的信号衰减。我一般推荐使用100微亨左右的共模电感直流电阻要小额定电流要满足总线短路保护的要求。还有一个容易被忽略的点CAN总线的分裂端接电容。在TJA1145的CANH和CANL到地之间通常各接一个几十皮法到一百皮法的电容用于滤除高频共模干扰。这个电容的值不能太大否则会影响CAN信号的上升沿和下降沿导致通信误码。我一般用47pF实测在500kbps下波形很干净。3. SPI配置数据手册不会告诉你的那些事3.1 SPI通信的基本参数设置和时序要求TJA1145的SPI接口是一个标准的4线SPI从机接口支持模式0CPOL0CPHA0和模式3CPOL1CPHA1。我一般用模式0因为大部分MCU的SPI默认就是模式0配置起来最省事。SPI时钟频率不能超过数据手册规定的最大值TJA1145的SPI时钟最高支持到几MHz但实际使用中我建议不要超过2MHz因为SPI走线如果比较长高速下容易出现数据错误。SPI的片选信号CSB要注意TJA1145要求CSB在每帧数据传输前后都要有明确的拉低和拉高动作不能一直拉低。每帧数据是16位1位读写标志位7位寄存器地址8位数据。读写标志位为0表示写为1表示读。这个格式和数据手册里写的一致但实际调试时最容易出错的是地址的位序。有些MCU的SPI外设发送数据时MSB先出有些是LSB先出你必须确保发送的地址位序和TJA1145期望的一致。我建议先用一个已知的寄存器比如设备ID寄存器做读测试确认SPI通信正常后再去配置其他寄存器。3.2 关键寄存器逐个拆解从模式控制到唤醒帧配置TJA1145的寄存器数量不少但真正影响休眠唤醒的核心寄存器就那么几个。我按配置顺序逐个说。模式控制寄存器Mode Control Register这个寄存器决定TJA1145当前处于什么模式。主要模式有Normal、Standby、Sleep。上电后默认是Standby模式你需要通过SPI把它切到Normal模式才能正常收发CAN报文。从Normal切到Sleep模式时要注意必须先确保没有待发送的报文否则可能丢失数据。唤醒帧控制寄存器Wake Frame Control Register这是部分网络功能的核心。你需要在这里配置唤醒帧的ID和掩码。TJA1145支持标准帧和扩展帧标准帧的ID是11位扩展帧是29位。掩码的作用是决定ID的哪些位需要匹配哪些位可以忽略。比如你只想匹配ID的高8位低3位任意就把掩码对应位设为0。这个掩码机制非常灵活但也容易配错。我见过有人把掩码全设成1结果要求ID每一位都完全匹配总线上稍微有一点ID偏差就唤不醒。数据掩码寄存器Data Mask Register除了ID匹配TJA1145还支持对数据场的前几个字节进行匹配。这个功能用得比较少但在某些需要根据数据内容选择性唤醒的场景下很有用。配置逻辑和ID掩码类似也是掩码位为1表示需要匹配为0表示忽略。事件状态寄存器Event Status Register这个寄存器记录了唤醒事件的具体来源比如是总线唤醒、本地唤醒还是其他事件。MCU被唤醒后第一件事就是读这个寄存器确认唤醒原因然后决定后续动作。这个寄存器是只读的读完后会自动清除标志位所以如果你需要记录唤醒源要在读之前先保存。3.3 SPI配置中最容易翻车的三个地方第一个翻车点寄存器写入后没有回读验证。SPI通信是单向的你发出去的数据不一定被正确写入了。我养成的习惯是每写一个关键寄存器立刻回读一次确认写入的值和预期一致。这个习惯帮我省了无数调试时间。特别是在配置唤醒帧ID的时候如果ID写错了现象就是怎么都唤不醒你会以为是硬件问题其实是SPI数据没写对。第二个翻车点模式切换的时序。从Normal模式切到Sleep模式TJA1145需要一定的时间来完成内部状态转换。如果你在发出模式切换命令后立刻让MCU断电TJA1145可能还没完全进入Sleep模式导致功耗偏高。正确的做法是发出Sleep命令后等待至少几十毫秒然后通过SPI回读模式寄存器确认已经进入Sleep模式再让MCU断电。第三个翻车点唤醒帧ID的字节序。CAN帧的ID在寄存器里是怎么存放的标准帧的11位ID在寄存器里是怎么对齐的这些细节数据手册里通常有一张表但表格的排版有时候让人看晕。我的经验是拿一个已知的CAN帧用CAN分析仪发出来然后看TJA1145能不能唤醒如果不能就把ID的字节序翻转一下再试。虽然笨但有效。4. 休眠唤醒全流程的实操步骤4.1 从正常运行到进入休眠的完整操作序列让整个ECU干净地进入休眠不是简单地发一条Sleep命令就完事。我总结的标准操作序列是这样的确认总线空闲在准备休眠前先确认CAN总线上没有正在进行的通信。如果总线上还有报文在传TJA1145不会进入Sleep模式。可以通过读取TJA1145的状态寄存器或者监听总线活动来判断。停止MCU侧的CAN发送确保MCU没有待发送的报文否则这些报文会在进入休眠前被发送出去可能干扰其他节点。配置唤醒帧在进入休眠之前把唤醒帧的ID和掩码配置好。这个配置只需要做一次但如果你的应用需要动态改变唤醒条件就要在每次休眠前重新配置。发送Sleep模式命令通过SPI向模式控制寄存器写入Sleep命令。等待并确认等待一段时间我一般等50ms然后回读模式寄存器确认TJA1145已经进入Sleep模式。如果没进去检查是否有未处理的中断或者总线活动。关闭MCU电源通过电源管理芯片切断MCU的供电。此时TJA1145由VBAT供电继续监听总线。这个序列里第5步的确认动作非常关键。我见过太多项目为了省事发完Sleep命令就直接断电结果TJA1145没进Sleep模式静态电流居高不下查了半天以为是硬件漏电。4.2 唤醒事件发生后的处理流程当TJA1145检测到有效唤醒帧后它会拉高INH引脚打开MCU的电源。MCU启动后需要做以下事情初始化SPI接口MCU启动后第一件事是初始化SPI准备和TJA1145通信。读取事件状态寄存器确认唤醒源。这一步很重要因为可能有多种唤醒源总线唤醒、本地唤醒引脚等你需要知道是哪种。切换TJA1145到Normal模式通过SPI发送Normal模式命令让TJA1145从Sleep模式切换到Normal模式准备正常收发CAN报文。清除唤醒标志读取事件状态寄存器会自动清除标志位但有些实现需要显式清除。确认标志清除后才能保证下一次休眠唤醒流程正常。处理唤醒后的业务逻辑根据唤醒源执行相应的功能比如如果是充电相关报文唤醒的就进入充电处理流程。这里有个细节MCU启动时间要和TJA1145的唤醒响应时间匹配。TJA1145从检测到唤醒帧到拉高INH的时间很短但MCU从断电到启动完成可能需要几十毫秒甚至上百毫秒。在这段时间内如果总线上有后续报文TJA1145会缓存吗不会。TJA1145只负责唤醒不负责缓存报文。所以如果唤醒帧后面紧跟着重要的数据报文MCU可能来不及接收。解决方案是唤醒帧本身可以携带一些关键信息或者发送方在唤醒帧之后等待一段时间再发数据报文。4.3 如何验证休眠唤醒流程是否真正可靠验证不是简单地看能不能唤醒而是要覆盖各种边界情况。我通常做以下几类测试正常唤醒测试发送配置好的唤醒帧确认MCU被唤醒并且能正确读取唤醒源。误唤醒测试发送不符合唤醒条件的CAN帧确认MCU不会被唤醒。这个测试很重要因为如果掩码配置不当总线上任何报文都可能触发唤醒那就失去了低功耗的意义。重复唤醒测试连续多次执行休眠-唤醒循环确认每次都能正常工作。我一般跑至少100次循环观察是否有偶发失败。边界条件测试发送ID和唤醒帧ID只有一位差异的报文确认不会误唤醒发送ID完全匹配但数据场不同的报文确认能正常唤醒如果数据掩码没有限制的话。功耗测试在休眠状态下测量TJA1145的VBAT电流确认在数据手册标称的范围内。如果偏高检查是否有引脚漏电或者模式没有正确进入。这些测试做完你才能说这个休眠唤醒流程是可靠的。很多项目在实验室里测几次没问题就放行了到了整车上出现偶发无法唤醒排查起来非常痛苦。5. 那些年我踩过的TJA1145典型故障5.1 休眠后静态电流偏高的排查思路静态电流偏高是TJA1145项目里最常见的故障。现象是MCU已经断电但整车静态电流比预期高很多。排查思路如下首先确认TJA1145是否真的进入了Sleep模式。通过SPI回读模式寄存器如果发现还在Standby模式说明Sleep命令没有生效。可能的原因包括SPI通信本身有问题、模式切换时序不对、或者有未清除的中断标志阻止了模式切换。其次如果确认在Sleep模式但电流仍然偏高检查INH引脚的状态。INH引脚在Sleep模式下应该是低电平如果它还是高电平说明TJA1145认为有唤醒事件可能是有持续的总线活动或者唤醒帧配置有误导致误触发。再次检查VCC引脚的供电。有些硬件设计在MCU断电后VCC引脚上还有残压这会导致TJA1145无法进入最低功耗状态。确保VCC在MCU断电后能迅速降到0V。最后如果以上都正常用万用表逐一测量TJA1145各引脚的电压和电流看是否有引脚存在异常漏电。特别是CANH和CANL引脚如果外部端接电阻或者共模电感有问题可能导致漏电。5.2 唤醒失败但SPI读回数据正常的诡异现象这个故障我遇到过两次现象非常迷惑MCU被唤醒后通过SPI读取TJA1145的所有寄存器都正常事件状态寄存器也显示有唤醒事件但问题是——MCU根本不应该被唤醒因为总线上没有发送唤醒帧。排查了很久才发现问题出在唤醒帧的掩码配置上。原来配置的掩码过于宽松总线上其他节点的正常通信报文恰好满足了唤醒条件。比如唤醒帧ID配置为0x100掩码只匹配高4位那么ID为0x1XX的任何报文都会触发唤醒。总线上如果有其他节点发送ID在0x100到0x1FF之间的报文就会导致误唤醒。解决方法是收紧掩码让唤醒帧的ID匹配尽可能精确。如果确实需要匹配多个IDTJA1145支持配置多个唤醒帧吗标准版本的TJA1145只支持一组唤醒帧配置但可以通过合理设置掩码来覆盖一个ID范围。如果需要的ID范围不连续那就只能选择最重要的那个ID作为唤醒帧。5.3 温度变化导致唤醒不稳定的根因分析有个项目在实验室常温下测试一切正常到了冬天户外测试就出现偶发唤醒失败。这种温度相关的故障根因通常有两个一是晶振的频率温度漂移。如果用的是内部振荡器温度变化会导致振荡频率偏移进而影响唤醒帧的位时间检测。换成外部晶振后问题解决。即使用外部晶振也要选温度稳定性好的型号普通晶振的温度频差可能在几十ppm而车载级晶振可以做到更小。二是CAN收发器的阈值电压温度漂移。TJA1145的CAN差分输入阈值会随温度变化如果总线上的信号质量本身就在临界点附近温度变化就可能导致检测失败。解决方法是优化总线信号质量确保差分信号的幅度和边沿都满足要求。这个故障给我的教训是TJA1145的休眠唤醒测试不能只在常温下做必须覆盖高低温。如果项目时间紧张至少要做-20度和70度的测试这两个温度点能暴露大部分温度相关问题。6. 和AUTOSAR及整车网络管理的配合6.1 TJA1145在AUTOSAR架构下的驱动集成要点在AUTOSAR架构下TJA1145通常由CanIf模块下的CanTrcv驱动来管理。CanTrcv驱动负责初始化TJA1145、切换工作模式、读取唤醒原因等。集成时需要注意几个点唤醒原因的上报CanTrcv驱动读取TJA1145的事件状态寄存器后需要把唤醒原因通过标准接口上报给EcuM或ComM模块。不同的AUTOSAR版本接口可能略有差异要仔细对照你使用的AUTOSAR版本规范。模式切换的同步AUTOSAR的网络管理状态机和TJA1145的模式切换需要同步。比如当网络管理状态机决定进入BusSleep模式时CanTrcv驱动需要把TJA1145切到Sleep模式。这个同步逻辑如果没做好可能出现网络管理认为已经休眠了但TJA1145还在Standby模式的情况。SPI通信的互斥如果TJA1145和其他SPI从设备共享SPI总线需要确保SPI访问的互斥。AUTOSAR的Spi模块通常提供了SPI序列Sequence机制来管理多个从设备的访问要正确配置。6.2 网络管理报文和唤醒帧的关系处理这里有一个容易混淆的概念网络管理报文NM报文和唤醒帧是两回事。NM报文是AUTOSAR网络管理用来维持网络状态的而唤醒帧是TJA1145用来触发硬件唤醒的。在实际项目中通常会把NM报文的ID配置为TJA1145的唤醒帧ID这样当网络上有NM报文时TJA1145会唤醒MCUMCU启动后再通过NM状态机决定是否维持网络。但要注意NM报文的ID通常是固定的而TJA1145的唤醒帧ID需要和NM报文ID匹配。如果总线上有多个网络每个网络的NM报文ID不同你需要确保TJA1145配置的唤醒帧ID覆盖了你关心的那个网络。另外如果使用了部分网络功能TJA1145可以被配置为只响应特定ID范围的NM报文这样就能实现只唤醒部分节点的效果。这个配置需要在整车网络设计阶段就规划好后期修改成本很高。6.3 整车下电流程中TJA1145的配合逻辑整车下电时TJA1145的配合逻辑大致如下整车控制器发出下电指令各ECU收到后开始执行下电流程。ECU的AUTOSAR网络管理状态机从Network Mode进入Prepare Bus Sleep Mode等待所有节点都准备好休眠后进入Bus Sleep Mode。此时CanTrcv驱动把TJA1145切到Sleep模式然后MCU断电。这个流程里TJA1145的Sleep模式切换是最后一步必须在MCU断电之前完成。如果顺序反了MCU先断电TJA1145就没法通过SPI接收Sleep命令了只能靠总线活动超时来自动进入Sleep模式但这个过程可能比较慢而且不可控。还有一个细节下电流程中如果有诊断报文或者其他通信需求要确保这些通信在TJA1145进入Sleep模式之前完成。一旦TJA1145进入Sleep模式它就不再正常收发报文了只监听唤醒帧。7. 几个能直接抄的配置示例和调试技巧7.1 标准帧唤醒配置的寄存器写入序列以下是一个标准帧唤醒配置的SPI写入序列示例假设唤醒帧ID为0x123掩码为0x7FF全匹配使用模式0SPI时钟1MHz// 假设SPI发送函数为 SPI_Transfer16(uint16_t data) // 写寄存器函数地址左移1位读写位为0 // 读寄存器函数地址左移1位读写位为1 // 1. 切换到Normal模式假设模式控制寄存器地址为0x01Normal模式值为0x01 SPI_Transfer16((0x01 1) | 0x00); // 写模式控制寄存器 SPI_Transfer16(0x01); // 写入Normal模式 // 2. 配置唤醒帧ID假设ID寄存器地址为0x20和0x21 // 标准帧ID 0x123 二进制 001 0010 0011 // 高8位0x12低3位0x3 SPI_Transfer16((0x20 1) | 0x00); // 写ID高字节寄存器 SPI_Transfer16(0x12); // ID高8位 SPI_Transfer16((0x21 1) | 0x00); // 写ID低字节寄存器 SPI_Transfer16(0x03); // ID低3位左对齐或右对齐需确认 // 3. 配置ID掩码假设掩码寄存器地址为0x22和0x23 SPI_Transfer16((0x22 1) | 0x00); SPI_Transfer16(0x7F); // 掩码高8位全匹配 SPI_Transfer16((0x23 1) | 0x00); SPI_Transfer16(0x07); // 掩码低3位全匹配 // 4. 回读验证 uint16_t readCmd (0x20 1) | 0x01; SPI_Transfer16(readCmd); uint16_t idHigh SPI_Transfer16(0x00); // 读取ID高字节注意以上寄存器地址和位定义是示例实际使用时必须对照你所用TJA1145版本的数据手册。不同版本的寄存器地址可能不同。7.2 用CAN分析仪快速验证唤醒帧配置是否正确配置完唤醒帧后怎么快速验证我的做法是用CAN分析仪比如常见的USB-CAN工具连接到总线上先让ECU进入休眠模式然后用分析仪发送配置好的唤醒帧观察ECU是否被唤醒。如果没被唤醒逐步排查先确认分析仪发送的帧格式标准帧/扩展帧和配置一致再确认ID是否完全匹配包括掩码允许的位然后确认波特率是否匹配最后用示波器看CANH和CANL的差分波形确认信号质量如果以上都正常但还是唤不醒那大概率是SPI配置没写进去。回读寄存器确认。7.3 休眠电流测试的实操方法和注意事项休眠电流测试看起来简单但实际操作中有很多细节会影响测量结果。首先测量点要选对应该在VBAT引脚和电源之间串联一个精密电阻比如1欧姆或10欧姆测量电阻两端的电压差来计算电流。不要用万用表的电流档直接串联因为万用表电流档的内阻会影响电路工作。其次测量前要确保所有可能影响功耗的因素都排除了MCU确实断电了、CAN总线上没有活动、所有唤醒源都处于非激活状态。我一般会先让系统进入休眠等待几分钟让电流稳定后再读数。最后要注意测量仪器的精度。休眠电流可能在几十微安级别普通万用表的精度不够需要用高精度电流表或者专门的功耗分析仪。如果手头没有高精度仪器可以用一个已知阻值的精密电阻配合高精度电压表来测量。7.4 常见故障速查表故障现象可能原因排查方法休眠后静态电流偏高TJA1145未进入Sleep模式回读模式寄存器确认休眠后静态电流偏高INH引脚异常拉高测量INH引脚电压休眠后静态电流偏高VCC引脚有残压测量VCC引脚电压无法唤醒唤醒帧ID配置错误回读ID寄存器用分析仪验证无法唤醒掩码配置过严或过松检查掩码寄存器无法唤醒SPI通信异常回读设备ID寄存器误唤醒掩码配置过松收紧掩码增加匹配位数误唤醒总线上有干扰检查总线信号质量唤醒后通信异常TJA1145未切到Normal模式回读模式寄存器唤醒后通信异常波特率不匹配检查CAN控制器配置温度变化导致唤醒不稳定晶振频偏更换高精度晶振温度变化导致唤醒不稳定总线信号质量临界优化端接和滤波这张表是我在实际项目中总结的大部分TJA1145的常见问题都能在里面找到对应。遇到问题时先按表排查能省不少时间。8. 写在最后的一些个人体会TJA1145这颗芯片用好了是低功耗利器用不好就是项目噩梦。我最大的体会是不要相信配置一遍就能过。SPI寄存器的配置、唤醒帧的匹配逻辑、休眠唤醒的时序每一个环节都需要反复验证。我在第一个TJA1145项目上花了整整两周才把休眠唤醒流程调通其中大部分时间都花在了SPI通信的调试和唤醒帧掩码的调整上。另一个体会是硬件设计和软件配置是分不开的。很多软件工程师觉得硬件是硬件的事自己只管写代码。但TJA1145的很多问题恰恰出在硬件和软件的配合上比如INH引脚的默认状态、VCC的掉电时序、晶振的起振情况。如果你只盯着寄存器看可能永远找不到问题。最后说一个实用技巧在项目初期就建立一个TJA1145的配置检查清单把每个需要配置的寄存器、每个需要验证的引脚状态、每个需要测试的场景都列出来。每次修改配置后按清单逐项检查。这个习惯能帮你避免很多低级错误也能让调试过程更有条理。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价