[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函数,确认发送状态。
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
HLS学习1:使用FPGA点灯