• 304查看
  • 0回复

[Autosar] Can协议栈配置之CanIf

[复制链接]


该用户从未签到

发表于 8-5-2024 19:27:46 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


CanIf的下层是Can,上层可以是CanTp、PduR或者CCP、CanSM。在CanIf以上就没有CanId的概念了,各层之间的传输都是以PduId进行的。同时,上层也不关心Can信号分配在哪个Can物理节点上,这些都是需要CanIf和Can进行绑定。在<<一文搞懂Autosar BswM模块的原理和配置>>一文中分析,CanSM可以通过内定的接口上报给它一些物理节点的状态变化,同时CanSM还要监控BusOff的故障,而它不关注物理节点的实际外设地址等信息,因此也需要CanIf告诉它。​下面我们分析一下最常见的接收和发送调用时序。发送分析

Can协议栈配置之CanIfw1.jpg

在发送时序图中,上层调用CanIf_Transmit发送数据,CanIf调用Can_Write将数据写到Can的寄存器中。
Can协议栈配置之CanIfw2.jpg

在发送成功后,Can模块调用CanIf_TxConfirmation通知CanIf模块,CanIf再调用User_TxConfirmation通知刚刚调用发送接口的上层模块。接收分析
Can协议栈配置之CanIfw3.jpg

Can模块收到数据后通过CanIf_RxIndication通知CanIf模块,CanIf模块通过一些滤波(如数据长度是否符合要求、CAN类型是否符合要求等)确认是自己想要的数据后,再调用User_RxIndication通知上层模块。
因此,从上边分析可以看出,CanIf必须包含以下模块:关联Can物理节点的模块(CanIfCtrlDrvCfg)、与CanSM的交互(CanIfDispatchCfg)、发送/接收报文的分配(CanIfInitCfg)和一些基础配置选项(CanIfPublicCfg)。
配置

CanIfCtrlDrvCfg

Can协议栈配置之CanIfw4.jpg

CanIfCtrlId:CanIf中的Can节点的Id;

CanIfCtrlWakeupSupport:是否支持唤醒

CanIfCtrkCanCtrlRef:引用的Can模块里配置的实际物理节点;

CanIfCtrlTrcvRef:引用的Can收发器模块配置的收发器节点。

CanIfDispatchCfg

Can协议栈配置之CanIfw5.jpg

CanIfDispatchUserCtrlBusOffUL:发生BusOff后上报给谁。CanSM:上报给CanSM模块;CDD:上报给CDD;

CanIfDispatchUserCtrlModeIndicationUL:CanIf中配置的物理节点的工作模式发生变化通知给哪个上层。

CanIfDispatchUserTrcvModeIndicationUL: CanIf中配置的收发器的工作模式发生变化通知给哪个上层。

CanIfInitCfg

CanIfBufferCfg

Can协议栈配置之CanIfw6.jpg

CanIfBufferSize:定义了CanIf缓存上层发送的消息的buffer的长度。如果为0,表示不缓存;如果需要缓存(在Can配置<<TC397 CAN接口(MCMCAN)介绍>>说过了,Can的发送缓存长度有限,可能有多帧报文需要共用一个fifo,那么此时很有可能就需要在canif缓存一下优先级较低的报文),那么Can配置的CanHandleType必须时BASIC且CanIf基础配置项的CanIfPublicTxBuffering必须为TRUE;

CanIfBufferHthRef:引用的CanIf中配置的buffer.

CanIfInitHohCfg

CanIfHrhCfg

Can协议栈配置之CanIfw7.jpg

CanIfHrhCanCtrlIdRef:引用的上边CanIfCtrlDrvCfg配置的CanIf的节点

CanIfHrhIdSymRef:引用Can模块配置的hardwareobjects

其他配置项引用这个CanIfHrhCfg的选项就可以对应到Can物理的发送节点和mailbox了。

CanIfHthCfg和CanIfHrhCfg类似,就不再赘述。

CanIfRxPduCfg

Can协议栈配置之CanIfw8.jpg

CanIfRxPduCanId:接收的CanId;

CanIfRxPduCanIdType:Can报文的类型,可选项为:EXTENDED_CAN(扩展帧)、EXTENDED_FD_CAN(CanFd的扩展帧)、STANDARAD_CAN(标准CAN)、STANDARAD_FD_CAN(CanFd的标准帧)

CanIfRxPduDlc:接收数据的长度;

CanIfRxPduReadData:CanIf是否需要为上层模块缓存数据;

CanIfRxPduReadNotifyStatus:是否使能下层接收到报文后调用CanIf_Rxindication(CanIfPublicReadRxPduNotifyStatusApi必须同时使能);

CanIfRxPduUserRxIndicationName:接收报文后调用哪个上层函数通知上层,假如CanIfRxPduUserRxIndicationUL 等于CAN_TP,CAN_NM, PDUR, XCP, CAN_TSYN, J1939NM or J1939TP,那么这个函数就是固定的,对于PduR来说就是PduR_CanIfRxIndication;

CanIfRxPduUserRxIndicationUL:CanIf的上层模块;

CanIfRxPduHrhIdRef:引用上边CanIfHrhCfg配置的选项;

CanIfRxPduRef:引用EcuC中配置的Pdu。

在这个选项中完成了PduId和CanId的映射。

CanIfTxPduCfg配置选项和CanIfRxPduCfg一样,只是配置选项的接收换成发送。

CanIfPublicCfg

Can协议栈配置之CanIfw9.jpg

CanIfPublicTxBuffering:是否使能CanIf缓存Tx的报文。

CanIfPublicPnSupport:CanIf是否支持PNC功能;

CanIfPublicReadRxPduNotifyStatusApi:使能下层接收到报文时调用CanIf_Rxindication;

CanIfPublicReadTxPduNotifyStatusApi:使能下层发送成功后调用CanIf_TxConfirmation函数;

CanIfWakeupSupport:CanIf是否支持唤醒功能;

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 27-12-2024 10:54 , Processed in 0.202011 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.