[4.6]-AutoSAR零基础学习-CAN通信协议

通信架构介绍一文中已经对autoSAR里通信模块进行详细分析,特别是信号的接收发送,这一节,将通过CAN通信实例详细介绍,来对autoSAR的通信模块进一步加深印象!

1 概述

CAN通讯的核心模块有4个:COM模块,PDU Router模块, CAN Interface模块和CAN Driver模块。

can通信相关的文档

2 流程

2.1 接收流程

根据ISO 11898-1标准可知,CAN接收功能需要使用通知(Indication)服务,那么怎么基于AUTOSAR架构实现呢?AUTOSAR架构的CAN接收的软件实现流程图如下图所示:

1 BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数; 2 CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器,如前面文章所述的仲裁寄存器,数据寄存器和数据长度寄存器,并读取这些寄存器的数据(ISO 11898-1标准规定了LLC数据帧的格式(id,数据长度和数据3段),当然还需要根据对应的芯片手册定义来访问其他的寄存器,最终保证读取数据的有效性。); 3 数据读取结束后,这时继续调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块; 4 CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块; 5 PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存,供应用层软件读取使用。

2.2 发送流程

CAN发送功能需使用请求(Request)服务和确认(Comfirmation)服务,AUTOSAR架构的CAN发送功能如下两图所示。

1 BSW调度器周期性调用Com模块的Com_MainFunction_Tx函数,Com模块将从其缓存器中读取需发送的数据; 2 Com模块的Com_MainFunction_Tx函数将调用PduR模块的PduR_ComTransmit函数,将数据传给PduR模块; 3 PduR模块路由到CAN Interface模块,调用CanIf_Transmit函数,这样数据从PduR模块传给了下层的CAN Interface模块; 4 CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器; 5 与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。

2.3 确认服务

1 BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Write函数; 2 CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认; 3 数据读取结束后,这时继续调用CAN Interface模块的CanIf_TxComfirmation函数,这样数据从CAN Driver模块传给了上层的CAN Interface模块; 4 CAN Interface模块再调用PduR模块的PduR_TxConfirmation函数,将数据传到PduR模块; 5 PduR模块路由到Com模块,调用Com_TxConfirmation函数,确认发送状态。
经验分享 程序员 微信小程序 职场和发展