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

电子说

1.2w人已加入

描述

前言

汽车工程师对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模块的状态。

 

PDU

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

CanIf_SetTrcvMode切换CanTrcv模块的状态。

PDU

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

PDU

 

PDU

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

PDU

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

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

PDU

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控制器和收发器。

PDU

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被唤醒后,程序可以选择软件复位,整个软件重新运行,也可以选择从上次停止的地方接着运行。

PDU

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

PDU

如果是断电系统或者深度休眠系统被唤醒后软件复位,那么上图的整个交互过程就不存在了。程序重启后需要在其他设计的模块(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的唤醒信号会识别为错误信号。






审核编辑:刘清

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分