电子说
前言
汽车工程师对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模块的状态。
CanSM的CANSM_BSM_S_PRE_NOCOM和CANSM_BSM_S_PRE_FULLCOM两个状态会调用
CanIf_SetTrcvMode切换CanTrcv模块的状态。
CANSM_BSM_S_PRE_NOCOM的子状态CANSM_BSM_DeInitPnNotSupported会调用CanIf_SetTrcvMode将CanTrcv切换到Normal状态后又立马切换到StandBy状态(Note: 不知道为啥有这个操作?)。
在CANSM_BSM_S_NOCOM状态下如果检查到有来自COM模块的通信请求(T_FULL_COM_MODE_REQUEST)后会切换到CANSM_BSM_PRE_FULLCOM状态,然后调用CanIf_SetTrcvMode将CanTrcv模块状态切换到NORMAL状态。
1.2 BswM的Action切换CanTrcv模块的状态
如果CanSM对CanTrcv的模式状态管理不能满足项目实际的需求,我们可以通过BswM设计在满足特定条件下调用CanTrcv_SetOpMode来快速切换CanTcv模式状态。
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控制器和收发器。
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被唤醒后,程序可以选择软件复位,整个软件重新运行,也可以选择从上次停止的地方接着运行。
如果是深度休眠系统且ECU被唤醒后接着跑的话,我们可以通过配置(EcuM中enable sleep support,EcuM实现EcuM_EnbaleWakeupSource集成代码,中断函数中调用EcuM_CheckWakeup)最后在CanTrcv_CheckWakeup函数中调用EcuM_SetWakeupEvent来实现唤醒源检测。
如果是断电系统或者深度休眠系统被唤醒后软件复位,那么上图的整个交互过程就不存在了。程序重启后需要在其他设计的模块(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的唤醒信号会识别为错误信号。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !