登录| 注册 退出
驭捷智能

AUTOSAR架构的CAN通讯

2021-05-14       浏览:  
分享到:

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所示。

AUTOSAR架构的CAN通讯(图1)

图1 AUTOSAR架构,引自[1]

每层按功能组继续划分,如图2所示。

AUTOSAR架构的CAN通讯(图2)

图2 基于功能划分的AUTOSAR架构,引自[1]

本系列文章的主题是CAN通讯,即属于通讯功能,对该功能再按模块细分,如下图3所示。其中CAN通讯的核心模块有4个:COM模块,PDU Router模块, CAN Interface模块和CAN Driver模块。

AUTOSAR架构的CAN通讯(图3)

图3 AUTOSAR通讯模块,引自[1]

3. CAN接收

回顾之前文章 menghuyouyou:CAN通讯系列--CAN总线基础3 ,根据ISO 11898-1标准可知,CAN接收功能需要使用通知(Indication)服务,那么怎么基于AUTOSAR架构实现呢?总的来说,AUTOSAR架构的CAN接收的软件实现流程图如下图4所示:

AUTOSAR架构的CAN通讯(图4)

图4 CAN接收的流程图

具体过程描述如下:

  1. BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;

  2. CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器,如前面文章所述的仲裁寄存器,数据寄存器和数据长度寄存器,并读取这些寄存器的数据;

  3. 数据读取结束后,这时继续调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块;

  4. CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;

  5. PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存,供应用层软件读取使用。

上述第2步为什么需要读取仲裁寄存器,数据寄存器和数据长度寄存器?这是因为ISO 11898-1标准规定了LLC数据帧的格式(id,数据长度和数据3段),当然还需要根据对应的芯片手册定义来访问其他的寄存器,最终保证读取数据的有效性。

另外再根据ISO 11898-1标准说明本文及之后内容,如下图5的红线之上部分。上述的4个核心模块,除了CAN Driver能够访问或配置硬件,其他模块均不能。它们之间将通过数据协议单元(PDU)形式实现数据传输,这些内容后面文章会进行详细介绍。

AUTOSAR架构的CAN通讯(图5)

图5 协议层交互,引自ISO11898-1

4. CAN发送

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

AUTOSAR架构的CAN通讯(图6)

图6 CAN发送的流程图

图6描述了数据发送的具体过程,即:

  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函数将访问仲裁,数据长度和数据寄存器,将数据写入。

图7描述了数据发送后的确认过程,即:

  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函数,确认发送状态。

AUTOSAR架构的CAN通讯(图7)

图7 CAN发送确认的流程图

5. 小结

CAN发送和接收暂时留下了非常多的概念和内容未做解释,本文主要目的在于让大家很迅速地了解AUTOSAR架构下的CAN接收与发送的软件实现过程,先有一个大致的理解就行。

当然对于没有接触过AUTOSAR知识的人来说很陌生,上述内容很抽象,很难懂。因为这些内容都来源于下图8所示的AUTOSAR文档,所以想要掌握AUTOSAR架构的CAN通讯,则不得不去认真研读这些文档,当然最好能结合实际的项目代码或者能使用AUTOSAR配置工具。

AUTOSAR架构的CAN通讯(图8)图8 CAN通讯有关的AUTOSAR文档

为了让大家明白上述内容,了解这些AUTOSAR文档,接下来的文章将会借助这些文档尽可能详细地介绍AUTOSAR的CAN通讯软件实现。

文章来源  公众号汽车电子与软件  作者 糊涂zhen

在线
客服

在线客服 - 驭捷智能周一至周日 10:00-24:00(欢迎呼叫)

选择下列服务马上在线沟通:

客服
热线

18917451722
6*12小时客服服务热线