0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CanTrcv_SetOpMode被哪个模块调用?在什么场景下调用?

832065824 来源:汽车电子嵌入式 作者:Tomas Li 2022-10-31 10:58 次阅读

前言

汽车工程师CAN收发器应该都比较熟悉,但是最近在复盘AUTOSAR架构下的CanTrcv模块的时发现对CAN收发器及CanTrcv模块还有几个疑问:

(1)CanTrcv_SetOpMode被哪个模块调用,在什么场景下调用?

(2)CanTrcv和EcuM的关系,在什么场景下CanTrcv会调用?

(3)不同类型的Can收发器主要使用场景是?

本文我们来一起探索并回答这些问题。

正文

1.CanTrcv_SetOpMode被哪个模块调用,在什么场景下调用?

1.1 CanSM模块切换CanTrcv模块状态

CanTrcv模块在上电后的初始状态配置,一般配置初始状态为SLEEP状态。而后,CanTrcv模块的状态通过其他模块调用CanTrcv_SetOpMode来切换。如果没有BswM的参与(Action中切换CanTrcv状态),一般都是CanSM模块调用CanIf_SetTrcvMode --> CanTrcv_SetOpMode来切换CanTrcv模块的状态。

8e5ec5b0-5788-11ed-a3b6-dac502259ad0.png

CanSM的CANSM_BSM_S_PRE_NOCOM和CANSM_BSM_S_PRE_FULLCOM两个状态会调用

CanIf_SetTrcvMode切换CanTrcv模块的状态。

8eaf3aea-5788-11ed-a3b6-dac502259ad0.png

CANSM_BSM_S_PRE_NOCOM的子状态CANSM_BSM_DeInitPnNotSupported会调用CanIf_SetTrcvMode将CanTrcv切换到Normal状态后又立马切换到StandBy状态(Note: 不知道为啥有这个操作?)。

8ecc29d4-5788-11ed-a3b6-dac502259ad0.png

8eeea630-5788-11ed-a3b6-dac502259ad0.png

在CANSM_BSM_S_NOCOM状态下如果检查到有来自COM模块的通信请求(T_FULL_COM_MODE_REQUEST)后会切换到CANSM_BSM_PRE_FULLCOM状态,然后调用CanIf_SetTrcvMode将CanTrcv模块状态切换到NORMAL状态。

8f12fcd8-5788-11ed-a3b6-dac502259ad0.png

1.2 BswM的Action切换CanTrcv模块的状态

如果CanSM对CanTrcv的模式状态管理不能满足项目实际的需求,我们可以通过BswM设计在满足特定条件下调用CanTrcv_SetOpMode来快速切换CanTcv模式状态。

8f311cd6-5788-11ed-a3b6-dac502259ad0.png

1.3 EcuM的Callout函数中切换CanTrcv模块的状态

EcuM通过中断或轮询检测到来自CAN收发器或控制器的唤醒事件后,就可以对该唤醒事件进行验证。EcuM通过打开相应的CAN收发器和控制器来实现唤醒事件验证。EcuM模块调用集成代码EcuM_StartWakeupSource来打开相应的CAN收发器和控制器。

注意:虽然控制器和收发器已打开,但CAN接口模块(CanIf)不会将CAN消息转发到任何上层模块。只有当CanIf对应的PDU通道模式设置为“在线”时,才会转发CAN消息。

ECU状态管理器模块将通过通信管理器模块ComM继续正常启动CAN网络。否则,它将调用EcuM_StopWakeupSources关闭CAN控制器和收发器。

8f4d892a-5788-11ed-a3b6-dac502259ad0.png

2.CanTrcv和EcuM的关系,在什么场景下CanTrcv会调用EcuM_SetWakeupEvent?

在回答这个问题前,先介绍一下ECU系统设计相关的一些知识。

ECU在设计时根据具体需求可以在硬件上添加SBC或无SBC。如果ECU有SBC,ECU就是一个断电系统。那么ECU在系统下电(Shutdown)流程的最后一步会调用SBC的服务接口断掉MCU的电,整个MCU在休眠中是处于断电状态的。在外部信号(Can Transceiver/Lin Transceiver的INH引脚,Dio唤醒引脚 )唤醒MCU时,SBC重新给MCU供电,MCU重新冷启动。

如果ECU无SBC,ECU就是一个深度休眠系统。那么ECU在系统下电(Shutdown)流程的最后一步会调用MCU的服务进入到Deep Sleep深度休眠状态(MCU陷入深度休眠状态,程序不在运行,但是MCU还有电存在)。在外部信号(Can Transceiver/Lin Transceiver的INH引脚,Dio唤醒引脚 )通过中断唤醒MCU,MCU被唤醒后,程序可以选择软件复位,整个软件重新运行,也可以选择从上次停止的地方接着运行。

8f897fc0-5788-11ed-a3b6-dac502259ad0.png

如果是深度休眠系统且ECU被唤醒后接着跑的话,我们可以通过配置(EcuM中enable sleep support,EcuM实现EcuM_EnbaleWakeupSource集成代码,中断函数中调用EcuM_CheckWakeup)最后在CanTrcv_CheckWakeup函数中调用EcuM_SetWakeupEvent来实现唤醒源检测。

8fb5646e-5788-11ed-a3b6-dac502259ad0.png

如果是断电系统或者深度休眠系统被唤醒后软件复位,那么上图的整个交互过程就不存在了。程序重启后需要在其他设计的模块(CDD_WKSM)开启唤醒源检测,如果检测到唤醒源就需要调用EcuM_SetWakeupEvent来设置唤醒源事件。

问题:CanTrcv和EcuM的关系,在什么场景下CanTrcv会调用EcuM_SetWakeupEvent?

答:如果是休眠系统且ECU被唤醒后继续跑,则CanTrcv需要进行唤醒源检测并调用EcuM_SetWakeupEvent设置唤醒源事件。如果是断电系统,或者休眠系统且ECU被唤醒后软件复位,则CanTrcv不用做唤醒源检测,也不会调用EcuM_SetWakeupEvent设置唤醒源事件,需要自定义起码模块是西安唤醒源检测。

3.不同类型的Can收发器主要使用场景是?

生产CAN收发器的厂商比较有名是NXP,Infineon,TI等,类型很多,收发器支持的功能也不近一样。这里介绍NXP的三种比较有代表性的收发器,TJA1044,TJA1043,TJA1145。

是否有STB引脚 是否有EN引脚 是否有INH引脚 是否有SPI引脚 是否支持PN局部网络管理 使用场景
TJA1044 Y N N N N 休眠系统,任意CAN报文在CAN_RX引脚上产生中断唤醒
TJA1043 Y Y Y N N 断电系统,任意报文唤醒收发器,INH接到SBC
JTA1145 N N N Y Y 局部网络管管理,特定报文唤醒收发器,INH引脚接到SBC

TJA1044收发器相比基础版本增加了standby的低功耗模式,此模式的功耗在10uA左右。同时CAN收发器处在standby模式时会开启CAN总线唤醒功能,当CAN总线上有数据时,RXD会产生从高到低的跳变沿,此跳变沿可以被MCU用来做唤醒源。此种收发器一般用在KL30(长电)和KL15同时供电的产品上,如仪表,中控,导航等产品。

Standby模式下的功耗已经很低了,如果车厂要求功耗做的更低,或者要求支持本地唤醒,此时就需要使用带sleep模式,INH引脚和wake引脚的收发器了。以TJA1043为例,当MCU配置TJA1043进入sleep模式之后,INH引脚拉低,LDO关闭输出,MCU关闭不消耗电流。当CAN总线有唤醒信号,或者wake引脚有跳变沿,INH引脚被拉高,LDO打开输出,MCU启动并配置TJA1043进入Normal模式接收CAN报文。传统的VCU,BMS等产品就使用了此收发器。

像T-BOX这类应用,一般对低功耗的要求更严格,如果使用TJA1043这类收发器,一旦被和自己不相关的CAN报文唤醒之后,需要软件进行判断处理,尽快的再次进入休眠模式。此时就对CAN收发器提出了新的功能需求,既局部网络唤醒功能,相关标准为11898-6:2013。NXP支持该功能的收发器为TJA1145,可以通过SPI接口配置唤醒报文的速率,ID和数据,不满足条件的CAN报文无法唤醒TJA1145。

需要提醒的是,TJA1145不支持CAN FD的局部网络唤醒功能,如果TJA1145被用于CAN FD总线中,需要选用TJA1145T/FD and TJA1145TK/FD,其他型号接收到CAN FD的唤醒信号会识别为错误信号。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171189
  • PDU
    PDU
    +关注

    关注

    0

    文章

    90

    浏览量

    16822
  • CAN收发器
    +关注

    关注

    2

    文章

    149

    浏览量

    25332

原文标题:关于CanTrcv模块的几点思考

文章出处:【微信号:汽车电子嵌入式,微信公众号:汽车电子嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    labview wince下调用DLL 如何编译

    labview wince下调用DLL 如何编译。
    发表于 11-08 13:33

    很赞的labview下调用地图

    ://url.elecfans.com/u/78643b3008labview下调用地图源代码,有地图,有三微,可以看到你家里哦,赶紧试试 不要错过了 觉得好就支持我@@@!!!!labview下调用地图源代码:[hide] [/hide]
    发表于 11-21 11:24

    求Labview 下调用Fortran dll的详细教程

    各位好,我现在用到LabVIEW下调用Fortran dll的问题,调用老是出问题,请问有用过的吗?能不能给个详细的教程
    发表于 09-28 16:52

    哪个朋友知道调用USB摄像机需要哪些模块???

    哪个朋友知道调用USB摄像机需要哪些模块???我的一些控件看不到
    发表于 01-13 19:35

    Zigbee场景调用设备没响应?

    Zigbee 写了个开关的程序,采用的协议为HA 1.2.2,当程序设为router的时候,场景建立和调用均正常,当程序设为enddevice的时候,场景创建没有问题,但是调用场景的时
    发表于 04-26 10:46

    通过调用HID.dll编写USB HID的数据读写,请大神们帮忙提示一下调用哪些HID的原型函数及函数调用顺序!

    通过调用HID.dll编写USB HID的数据读写,请大神们帮忙提示一下调用哪些HID的原型函数及函数调用顺序!
    发表于 07-01 16:30

    通过调用HID.dll编写USB HID的数据读写,请大神们帮忙提示一下调用哪些HID的原型函数及函数调用顺序!

    通过调用HID.dll编写USB HID的数据读写,请大神们帮忙提示一下调用哪些HID的原型函数及函数调用顺序!
    发表于 07-06 10:02

    顶层调用模块的VHDL例程

    本站提供的顶层调用模块的VHDL例程,希望对你的学习有所帮助!
    发表于 05-27 15:38 0次下载

    通过模块之间的调用实现自顶向下的设计

    通过模块之间的调用实现自顶向下的设计目的:学习状态机的嵌套使用实现层次化、结构化设计。
    发表于 02-11 05:53 2335次阅读
    通过<b class='flag-5'>模块</b>之间的<b class='flag-5'>调用</b>实现自顶向下的设计

    什么是系统调用?为什么要用系统调用?

    实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。进一步,若想成为一名Linux下编程高手,也就是我们常说的Hacker,其标志之一也是能对各种系统
    的头像 发表于 06-01 08:44 1.5w次阅读
    什么是系统<b class='flag-5'>调用</b>?为什么要用系统<b class='flag-5'>调用</b>?

    探讨VHDL和Verilog模块互相调用的问题

    1、 关于如何在VHDL模块调用一个Verilog模块 在VHDL模块声明一个要与调用的Verilog
    的头像 发表于 04-30 14:06 8949次阅读
    探讨VHDL和Verilog<b class='flag-5'>模块</b>互相<b class='flag-5'>调用</b>的问题

    多重复性功能模块情况下如何下调用已有模块

    在层次原理图中,怎么去调用已经创建好的模块呢?
    的头像 发表于 01-04 15:24 1361次阅读

    仿真测试2:全加器(模块调用

    做任何模块前,要确定输入输出端口有哪些,有一个整体的概念;方便以后模块调用
    的头像 发表于 10-10 14:10 379次阅读
    仿真测试2:全加器(<b class='flag-5'>模块</b><b class='flag-5'>调用</b>)

    malloc在Linux上执行的是哪个系统调用

    malloc底层为什么是内存池 malloc大家都用过,其是库函数。我们都知道库函数在不同的操作系统中其实执行的是系统调用,那么malloc在Linux上执行的是哪个系统调用呢? brk
    的头像 发表于 11-13 10:36 492次阅读
    malloc在Linux上执行的是<b class='flag-5'>哪个</b>系统<b class='flag-5'>调用</b>

    verilog如何调用其他module

    。 1.2 为什么要调用其他模块? 在复杂的设计中,我们通常需要实现各种不同的功能,并且这些功能往往可以通过不同的模块来实现。通过调用其他模块
    的头像 发表于 02-22 15:56 1150次阅读