AUTOSAR架构的CAN通讯
Posted Eliot_shao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AUTOSAR架构的CAN通讯相关的知识,希望对你有一定的参考价值。
原文地址:AUTOSAR架构的CAN通讯 (qq.com)https://mp.weixin.qq.com/s/C_C9pX87CpdZFTFmhajoIA
1. AUTOSAR概念
关于AUTOSAR概念之类的内容不在此展开,权威资料请参见AUTOSAR官网。
引自:AUTOSAR
AUTOSAR (AUTomotive Open System ARchitecture) is a worldwide development partnership of vehicle manufacturers, suppliers, service providers and companies from the automotive electronics, semiconductor and software industry.
宏观地介绍可参见:autosar.org/fileadmin/A
2. AUTOSAR软件分层架构
AUTOSAR架构在三个软件层之间划分出最高的抽象层:应用层(Application Layer, ASW),运行时环境(Runtime Environment, RTE)和底层软件(Basic Software, BSW),三者均在微控制器上运行。这里我们主要关注的是底层软件,它进一步分层为:服务层,ECU抽象层,微控制器抽象层和复杂驱动,如图1所示。
图1 AUTOSAR架构,引自[1]
每层按功能组继续划分,如图2所示。
图2 基于功能划分的AUTOSAR架构,引自[1]
本系列文章的主题是CAN通讯,即属于通讯功能,对该功能再按模块细分,如下图3所示。其中CAN通讯的核心模块有4个:COM模块,PDU Router模块, CAN Interface模块和CAN Driver模块。
图3 AUTOSAR通讯模块,引自[1]
3. CAN接收
回顾之前文章 menghuyouyou:CAN通讯系列--CAN总线基础3 ,根据ISO 11898-1标准可知,CAN接收功能需要使用通知(Indication)服务,那么怎么基于AUTOSAR架构实现呢?总的来说,AUTOSAR架构的CAN接收的软件实现流程图如下图4所示:
图4 CAN接收的流程图
具体过程描述如下:
-
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模块将会把数据存入其缓存,供应用层软件读取使用。
上述第2步为什么需要读取仲裁寄存器,数据寄存器和数据长度寄存器?这是因为ISO 11898-1标准规定了LLC数据帧的格式(id,数据长度和数据3段),当然还需要根据对应的芯片手册定义来访问其他的寄存器,最终保证读取数据的有效性。
另外再根据ISO 11898-1标准说明本文及之后内容,如下图5的红线之上部分。上述的4个核心模块,除了CAN Driver能够访问或配置硬件,其他模块均不能。它们之间将通过数据协议单元(PDU)形式实现数据传输,这些内容后面文章会进行详细介绍。
图5 协议层交互,引自ISO11898-1
4. CAN发送
CAN发送功能需使用请求(Request)服务和确认(Comfirmation)服务,AUTOSAR架构的CAN发送功能如下图6、7所示。
图6 CAN发送的流程图
图6描述了数据发送的具体过程,即:
-
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函数,确认发送状态。
图7 CAN发送确认的流程图
5. 小结
CAN发送和接收暂时留下了非常多的概念和内容未做解释,本文主要目的在于让大家很迅速地了解AUTOSAR架构下的CAN接收与发送的软件实现过程,先有一个大致的理解就行。
当然对于没有接触过AUTOSAR知识的人来说很陌生,上述内容很抽象,很难懂。因为这些内容都来源于下图8所示的AUTOSAR文档,所以想要掌握AUTOSAR架构的CAN通讯,则不得不去认真研读这些文档,当然最好能结合实际的项目代码或者能使用AUTOSAR配置工具。
图8 CAN通讯有关的AUTOSAR文档
为了让大家明白上述内容,了解这些AUTOSAR文档,接下来的文章将会借助这些文档尽可能详细地介绍AUTOSAR的CAN通讯软件实现。
以上是关于AUTOSAR架构的CAN通讯的主要内容,如果未能解决你的问题,请参考以下文章