本系列文章的主题是CAN通讯,即属于通讯功能,对该功能再按模块细分,如下图3所示。其中CAN通讯的核心模块有4个:COM模块,PDU Router模块, CAN Interface模块和CAN Driver模块
从整个Com通信结构上看我们可以发现:
对于CAN Driver来说,与上层模块通讯的唯一接口就是CAN接口模块,通过这个模块可实现我们熟知的3个ECU通讯功能:
CAN通讯,通过接口层到PDU Router模块;(路径:CanDrv–CanIf–PduR–Com)
UDS服务,通过接口层到CANTp模块;(路径:CanDrv–CanIf–CanTp–PduR–Dcm)
XCP服务,通过接口层到XCP模块。(路径:CanDrv–CanIf–XCP)
1.Can的接收
回顾之前文章 menghuyouyou:根据ISO 11898-1标准可知, CAN接收功能需要使用通知(Indication)服务,那么怎么基于AUTOSAR架构实现呢?总的来说,AUTOSAR架构的CAN接收的软件实现流程图如下图4所示:
BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;
CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器,如前面文章所述的仲裁寄存器,数据寄存器和数据长度寄存器,并读取这些寄存器的数据
数据读取结束后,这时继续调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块;
CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;
PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存,供应用层软件读取使用。
另外再根据ISO 11898-1标准说明本文及之后内容,如下图5的红线之上部分。上述的4个核心模块,除了CAN Driver能够访问或配置硬件,其他模块均不能。它们之间将通过数据协议单元(PDU)形式实现数据传输,这些内容后面文章会进行详细介绍。
2.Can的发送
CAN发送功能需使用请求(Request)服务和确认(Comfirmation)服务,AUTOSAR架构的CAN发送功能如下图6、7所示。
BSW调度器周期性调用Com模块的Com_MainFunction_Tx函数,Com模块将从其缓存器中读取需发送的数据;
Com模块的Com_MainFunction_Tx函数将调用PduR模块的PduR_ComTransmit函数,将数据传给PduR模块;
PduR模块路由到CAN Interface模块,调用CanIf_Transmit函数,这样数据从PduR模块传给了下层的CAN Interface模块;
CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器;
与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。
图7描述了数据发送后的确认过程,即:
BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Write函数;
CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认;
数据读取结束后,这时继续调用CAN Interface模块的CanIf_TxComfirmation函数,这样数据从CAN Driver模块传给了上层的CAN Interface模块;
CAN Interface模块再调用PduR模块的PduR_TxConfirmation函数,将数据传到PduR模块;
PduR模块路由到Com模块,调用Com_TxConfirmation函数,确认发送状态。