Autosar CAN开发12(基于CAN收发器的休眠唤醒、CAN收发器模式讲解。详细讲解TJA1059(TJA1049)、TJA1043、TJA1145。)

news/2024/12/22 20:45:51/

         入职新公司短短几个月让我搞遍了整整3种CAN收发器。真的是又爱又恨。。。


目录

关于我对CAN收发器理解的历程。

什么是CAN收发器

基础版CAN收发器:TJA1059(TJA1049)收发器

TJA1049 引脚图:

TJA1049 收发器模式及各个模式切换方法:

        Normal模式:

        Standby模式:

TJA1049 CAN通讯功能

TJA1049 休眠唤醒功能:

升级版CAN收发器:TJA1043收发器

TJA1043 引脚图:

         TJA1043 收发器模式及各个模式切换方法:

        Normal模式:

        Standby模式:

        Listen-Only模式:

        Go-To-Sleep模式和Sleep模式:

关于Wakeflag:​

TJA1043 CAN通讯功能:

TJA1043 休眠唤醒功能:

        MCU通过判断收发器的INH脚进入休眠:

        唤醒检测情况1:MCU处于断电状态(MCU电源被切断的状态)时进行唤醒源检测。

        唤醒检测情况2:MCU处于有电状态(MCU此时一般处于预休眠状态)时进行唤醒源检测。

加强版CAN收发器:TJA1145收发器

结束语


关于我对CAN收发器理解的历程。

        想起2年前刚毕业在公司搞CAN通讯开发。

        由于公司项目的平台都是做的非常的完善,所以我都是在CAN的上层搞来搞去,很少有机会从最底层的CAN收发器往上一步步开发。

        因为我直接看CAN收发器手册,里面一大堆东西。什么ERR_N脚用来检测什么错误啦、什么温度过高过低啦、什么WakeUpFlag啦、各种乱七八糟的什么的

        这么多功能,到底这么用啊?所以搞了一年半载都没明白收发器到底是干啥的。

        后来真正弄过CAN收发器才明白,其实很简单,一般哪有用到手册里面写的那么多功能。平时用到的就两个功能

                第一:CAN通讯(即CAN报文收发)

                第二:MCU的休眠唤醒(即通过报文唤醒MCU,无报文时MCU进入休眠)

        首先是MCU的CAN通讯。MCU要CAN通讯了,就把收发器切换至正常通讯模式(Normal),MCU不要CAN通讯了,就把收发器切换至其它模式。而所谓的各种收发器模式有什么用,其实简单理解就是正常通讯模式(Normal)收发器能收能发,其它模式收发器不能收不能发(当然,有能收不能发,即Listen-only,但这种模式一般也用不上)。

        然后是MCU的休眠唤醒(即报文唤醒)为什么休眠唤醒需要用到CAN收发器呢?一般来说,我们的MCU进入休眠后,MCU唤醒有两种情况:主动唤醒和被动唤醒。关于主动唤醒和被动唤醒不理解的话可以看我前面的一篇文章:Autosar BSW层CAN通讯开发------05(Autosar的CanNM----网管报文在汽车上的作用、“同起同睡”)_嵌软小白呗的博客-CSDN博客Autosar的CanNM----网管报文在汽车上的作用https://blog.csdn.net/qq_41848098/article/details/125343580        MCU的被动唤醒就需要用到CAN收发器,MCU休眠时,CAN收发器检测到CAN总线出现CAN报文,此时MCU可通过检测CAN收发器(可能是直接读收发器的引脚电平读取是否被CAN报文唤醒、也可能是通过SPI去读取是否被CAN报文唤醒情况),得知是否自己需要被动唤醒。

        由于用收发器实现MCU的休眠唤醒比较复杂,本文简单讲一下,详细MCU休眠唤醒可看下一篇文章。

        接下来我从MCU工作时需要用到CAN收发器什么功能,进而去讲CAN收发器的功能和使用方法。我觉得从这个角度会更容易理解CAN收发器(即知道了需求,自然就知道我们的产品是什么了)。


什么是CAN收发器

        所谓“CAN收发器”,通俗来讲,就是把CAN高和CAN低两根线的(电压)差分数据转换成如0、1、0、1这样的逻辑数据。更专业一点的大家自行百度一下就好了,本文主要讲一下CAN收发器怎么使用。

        仅从CAN数据收发来看,接线是这样的:     

接下来讲一下具体收发器模式如何切换、休眠唤醒如何通过收发器实现

基础版CAN收发器:TJA1059(TJA1049)收发器

TJA1049 引脚图:

        先看一下TJA1059的引脚图

        再看下TJA1049的引脚图

        明显可见,TJA1059其实就是两个TJA1049合在了一块。TJA1059的数据手册也有说:

TJA1049 收发器模式及各个模式切换方法:

        Normal模式:

        功能:只有该模式CAN报文能收能发。要正常收发报文就需要切到这个模式。

        模式切换方法:把收发器的STB脚拉低就切换到Normal模式

        Standby模式:

        功能:①该模式下CAN报文不能收不能发。②该模式下可通过检测RXD引脚得知是否CAN总线出现CAN报文,进而用于实现MCU的报文唤醒检测。

        模式切换方法:把收发器的STB脚拉高就切换到Standby模式

TJA1049 CAN通讯功能

        开启通信时就把收发器切到Normal模式。关闭通信时就把收发器切到Standby模式。

TJA1049 休眠唤醒功能:

        据我目前所知,TJA1049只能用来做唤醒检测,无法用于作为MCU进入休眠低功耗检测的条件。因为TJA1049只有Normal、Standby两种模式。

        唤醒检测:

        TJA1049处于Standby模式。此时TJA1049若检测到总线有CAN报文(任意报文)后,TJA1049的RXD引脚会从高电平拉低至低电平,MCU可通过检测TJA1049的RXD引脚低电平作为报文唤醒信号。

        但由于TJA1049处于Standby模式检测到总线有CAN报文后,RXD引脚拉低不会一直保持为低电平(如总线只发了一帧报文,RXD引脚拉低后会立即又变回高),因此MCU不能采用轮询检测的方式读取低电平作为唤醒信号,必须使用中断捕获RXD引脚下降沿才能确保MCU能立即捕获到唤醒信号。

升级版CAN收发器:TJA1043收发器

TJA1043 引脚图:

TJA1043 收发器模式及各个模式切换方法:

TJA1043收发器有5个模式:StandbyNormal、Listen-Only、Go-To-Sleep、Sleep

收发器模式切换状态机:      

收发器模式切换方法手册说明:

        Normal模式:

        功能:只有该模式CAN报文能收能发。要正常收发报文就需要切到这个模式。

        模式切换方法:STB拉高、EN拉高

        Standby模式:

        功能:①该模式下CAN报文不能收不能发。②该模式下可通过检测ERR或RXD引脚得知是否CAN总线出现CAN报文,进而用于实现MCU的报文唤醒检测,手册说明如下图所示:

        模式切换方法:STB拉低、EN拉低

        Listen-Only模式:

        不管,一般不使用该模式。

        Go-To-Sleep模式和Sleep模式:

        功能:①该模式下CAN报文不能收不能发。②该模式下可通过判断INH引脚进行下电休眠条件检测。③该模式下可通过检测ERR或RXD引脚得知是否CAN总线出现CAN报文,进而用于实现MCU的报文唤醒检测,手册说明如下图所示:

        模式切换方法:把Go-To-Sleep模式和Sleep模式写一块的原因,是因为Sleep模式是没法直接通过控制STB和EN电平的方法进入的,而是通过控制STB和EN电平使收发器进入Go-To-Sleep模式后,等待20us-50us后收发器自行进入Sleep模式,手册说明如下图所示:

关于Wakeflag:

        在最初我不理解基于1043收发器的休眠唤醒机制时,由于1043可以检测报文唤醒,然后我看数据手册,看到有个WAKE引脚,以为它是通过WAKE引脚实现的,然后手册也确实有说WAKE引脚能实现唤醒功能,然后我就总想着把WAKE引脚和报文唤醒扯一起。最后才发现这报文唤醒和WAKE引脚是分开的两个功能,两者没关系。

        如下图所示:

        也就是说Wake引脚可以接一根唤醒信号线实现唤醒功能,当收发器在Standby或Sleep时,Wake脚检测到电平变化时,然后RXD和ERR会拉低。但是一般情况下我们用不上这个功能,我们用的是CANH和CANL检测到CAN报文时RXD和ERR会拉低这个功能。

        而所谓的Wakeflag,它的意思是RXD和ERR拉低表示置起了Wakeflag。然后进入Normal状态后,会把RXD和ERR拉回高,即清掉了Wakeflag。

TJA1043 CAN通讯功能:

        开启通信时就把收发器切到Normal模式。关闭通信时就把收发器切到Standby模式。

TJA1043 休眠唤醒功能:

        MCU通过判断收发器的INH脚进入休眠:

        由于TJA1043的INH脚只有在Sleep模式时为浮空,其它模式都为高电平,因此若硬件给INH脚设为下拉模式,则只有当收发器为Sleep模式时,INH才为低电平,如下图所示。

        因此硬件或SBC可通过检测INH脚为高电平时才给MCU供电,为低电平时则切断MCU的供电,即可实现MCU的休眠。即:MCU控制收发器的模式切换为Sleep模式进而使得MCU进入休眠模式。

        需要注意的是:

        ①收发器要进入Sleep模式,是通过控制收发器STB为低电平,EN为高电平使收发器进入Go-to-Sleep模式,然后等待20-50us后收发器会自行进入Sleep模式。

        ②收发器在Standby模式或Sleep模式,若检测到CAN总线有报文,ERR会拉低,且INH会保持高电平无法拉低。(因此这种情况MCU读取到ERR拉低后,需要进行唤醒操作并把收发器切为Normal。否则,收发器处于Sleep模式,但INH拉高。然后MCU又不做任何操作,会导致无法休眠,又无法唤醒,这就出问题了。)

        休眠流程如下图所示:

        唤醒检测情况1:MCU处于断电状态(MCU电源被切断的状态)时进行唤醒源检测。

        此时TJA1043处于Sleep模式(注意,此时MCU断电,但CAN收发器是有电的,因为收发器要一直检测CAN总线)。此时TJA1043检测到总线有CAN报文(任意报文)后,TJA1043的ERR及RXD引脚会从高电平拉低至低电平,并且保持为低电平(直到收发器模式切换为Normal模式),MCU可通过检测TJA1043的ERR或RXD引脚低电平作为报文唤醒信号。

        值得说明的是,与上面说的TJA1049收发器不同,TJA1043在Standby模式或Sleep模式检测到总线有CAN报文后,ERR和RXD会一直保持为低电平,直到收发器模式切换为Normal模式。因此MCU通过检测TJA1043的ERR或RXD引脚读取是否被CAN报文唤醒时不能通过中断读取引脚电平边沿变化,而是必须通过轮询的方式读取引脚电平为低时判断为有CAN报文唤醒。原因如下:

        基于TJA1143的唤醒流程为:当MCU休眠时总线出现CAN报文,此时CAN收发器会检测到CAN报文并把ERR和RXD拉低,同时把CAN收发器的INH引脚拉低,硬件检测到INH引脚为低后将会给MCU供电,MCU上电后此时CAN收发器的ERR和RXD早已拉低,已经不会出现边沿跳变,因此无法通过中断捕获编译跳变信号,所以MCU必须通过轮询检测的方式读取CAN收发器的ERR引脚或RXD引脚为低电平进行唤醒源检测

        唤醒流程如下: 

        唤醒检测情况2:MCU处于有电状态(MCU此时一般处于预休眠状态)时进行唤醒源检测。

        这种情况与上面的“唤醒检测情况1”不同的地方为:

                MCU有电且正在运行、TJA1043处于Standby模式。

        其它地方与上面的“唤醒检测情况1”是一样的。

        唤醒流程如下图所示: 

加强版CAN收发器:TJA1145收发器

        TJA1145其实就是TJA1043的升级版。相同的功能就不再赘诉了,大家看上面的TJA1043就好了。下面只说差异的地方。

        TJA1145只不过是在TJA1043的基础上增加了所谓的Partial Networking功能,这个功能是用来做唤醒检测的。

        简单来说就是TJA1145收发器在Standby或Sleep模式的时候不但能监控是否CAN总线出现CAN报文,还能监控CAN报文的ID和DLC,如果CAN报文ID或DLC与配置的不匹配,那就认为没检测到唤醒报文

        我们先看下TJA1145的引脚图:

        可见,与TJA1043不同,TJA1145提供了SPI接口

        也就是说,TJA1145的模式切换不再是像TJA1143那样通过改变EN和STB两个引脚电平取控制,而是直接通过SPI发一串数据到收发器,收发器就把模式切换了。

        唤醒检测也不像TJA1043那样通过读取ERR或RXD引脚的电平去检测唤醒信号了,而也是直接通过SPI发一串数据到收发器,收发器也通过SPI告诉你是否检测到唤醒报文

        因此,TJA1145要使用好的关键,其实就是MCU和SPI的通路要打通。关于SPI和TJA1145的SPI开发,我后续会专门另外再写文章仔细讲。


结束语

        朋友们,我觉得我用会了这几个CAN收发器,以后其它CAN收发器应该也是大差不差的用法。

        对于休眠唤醒这一块,对于刚接触的人来说,我觉得还是有点复杂的,因为我刚接触的时候也很头疼,因为涉及到的模块还是很多的。本文只是讲休眠唤醒与收发器关联的部分,后面文章我会专门整体、系统讲一下MCU的休眠唤醒方案的。

        我会尽力用最简洁的语言给大家讲这些开发知识的,让没搞过这些东西的小白朋友们都能听到我在讲什么,让自己下次忘记之后回来看也一下能回忆起来。朋友们,加油!!!

       

        


http://www.ppmy.cn/news/1149052.html

相关文章

python关联分析实践学习笔记

曾经有个沃尔玛超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加。 我们关注的是在这样的场景下,如何找出物品之间的关联规则。接下来就来介绍下如何使用Apriori算法&…

JVM面试题:(三)GC和垃圾回收算法

GC: 垃圾回收算法: GC最基础的算法有三种: 标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般 都采用分代收集算法。 标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的…

Matlab提取colormap

文章目录 简介Matlab代码 简介 使用Maltab依据截取的图片信息,提取colormap,供保存使用 Matlab代码 提取函数 function colormap_outExtract_Colormap(inputfig, colormapsize)% Creat a colormap array from the input figure. % The figure is a c…

Redis-集群

Redis-集群 主从复制和哨兵只能在主节点进行写数据,从节点读取数据,因此本质上,是进行了读写的分离,每个节点都保存了所有的数据,并不能实现一个很好的分布式效果。 1.哈希求余算法 假设有N台主机,对每台…

计算mask的体素数量

import numpy as np import nibabel as nib # 用于处理神经影像数据的库 # 从文件中加载mask图像 mask_image nib.load(rE:\mask.nii.gz) # 获取图像数据 mask_data mask_image.get_fdata() # 计算非零像素的数量,即白质骨架的体素总数 voxel_count np.count_no…

【vue3+ts】项目初始化

1、winr呼出cmd,输入构建命令 //用vite构建 npm init vitelatest//用cli脚手架构建 npm init vurlatest2、设置vscode插件 搜索volar,安装前面两个 如果安装了vue2的插件vetur,要禁用掉,否则插件会冲突

02 stm32-hal库 timer 基本定时器设定

1.配置始终时钟参数 >2. 初始化 MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3);> 3.增加回调函数 4 中断服务函数 void TIM3_IRQHandler(void) {/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&…

一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide

中文名:脱硫生物素-碘乙酰胺 英文名:Desthiobiotin-Iodoacetamide 化学式:C14H25IN4O3 分子量:424.28 外观:固体/粉末 规格:10mg、25mg、50mg等(接受各种规格的定制服务,具体可…