写在前面:
入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!!
CanIf模块是 AUTOSAR 基础软件(BSW)的一部分,位于 CAN 驱动程序(CanDrv)、CAN 收发器(CanTrcv)和上层通信服务层(如 CanSm、CanNm、CanTp、PduR)之间。它提供了一个标准化的接口,用于管理不同类型的 CAN 硬件设备,如 CAN 控制器和 CAN 收发器,并确保硬件独立性。
1.一条Rx报文都在CanIf模块中经历了什么?
回答这个问题前,先来看几个参数表。对于一条报文,它存在若干属性,比如ID,比如CANFD/CAN报文类型,比如Full/BasicCAN。当我在接收一条报文时,我需要去验证这条报文是不是我要接收的,它的属性是不是和我期望是一致的。那么我就需要几个参数表,表中会存储报文信息。
1.1CanIf_MailBoxConfig
从上到下依次表示为:
- 该报文属于哪个通道
- First PduId
- Last PduId
- Tx报文配置参数
- Buffer配置参数
- Buffer Id
- MailBox类型,即FullCAN or Basic CAN
1.2CanIf_RxPduConfig
从上到下依次表示为:
- PduID
- MASK
- 下游模块Pdu名称
- 是否为NM报文
- 下游回调函数
- Dlc
- Message Type:CAN or CANFD
1.3Rx报文进入CANIF模块
当控制器收到一条Rx报文,且CAN层会调用CanIf_RxIndication将PDU传入CANIF模块
会传入接收这条报文的Mailbox等。
1.4Rx报文属性校验
在CanIf_RxIndication中,首先会基于CanId来判断MsgType是否为CANFD报文
Remove FD-flag from CAN identifier
通过MailBox索引号找到CanIf_MailBoxConfig中记录的PDUID,比较报文属性与本地属性表中记录的信息是否一致,若不一致则丢掉该报文。
这里对于FullCAN和BasicCAN会调用不同的函数来判断,主要原因是BasicCAN的MaiBox能够接收一定范围ID的报文,对于RxID,需要进行计算来判断是否能够接收。
1.5报文传递给下游模块
上述属性校验通过后,调用CanIf_HlIndication向下传递,在这里还有校验DLC长度。最终将pduinfo传递给下游的回调函数,有可能是PduR_CanIfRxIndication,也有可能是CanTp_RxIndication,或者CanNm_RxIndication。需要调用哪个,查找表CanIf_RxPduConfig。
2.一条Tx报文都在CanIf模块中经历了什么?
如果CANNM模块或者PDUR模块想发送一条CAN报文,首先会调用CanIf_Transmit函数将PduInfo传入CANIF模块中,基于传入的PduId,查找CanIf_TxPduConfig,获取报文属性。包括通道,MailBoxConfigIdx,TxPduLength等。
和Rx报文类型,会依次检查报文长度是否正确,该通道是否正常工作等。
之后将报文加入到对应队列等待发送。发送成功后查找表格CanIf_TxConfirmationFctList判断应该调用哪个函数上报发送成功的消息。常用的有:CanNm_TxConfirmation,CanTSyn_TxConfirmation,PduR_CanIfTxConfirmation等。