• 401查看
  • 0回复

[网络开发] CAN通讯系列22- 基于AutoSAR的CAN通讯实现

[复制链接]


该用户从未签到

发表于 7-1-2024 16:24:42 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


前面文章已介绍了CAN总线基础,从本文开始更进一步,了解在软件层面如何实现CAN通讯,因此下文将开始介绍AUTOSAR架构的CAN通讯软件实现。


1 基于AUTOSAR的CAN通讯概述  

1.1 什么是AutoSAR  

关于AUTOSAR概念的内容不在此展开,这方面的资料很好找,权威资料可以去AUTOSAR官网找:https://www.autosar.org/fileadmin/ABOUT/AUTOSAR_EXP_Introduction102020.pdf1.2 AUTOSAR软件分层架构  

AUTOSAR架构在三个软件层之间划分出最高的抽象层:应用层(Application Layer, ASW),运行时环境(Runtime Environment, RTE)和底层软件(Basic Software, BSW),三者均在微控制器上运行。本文主要关注的是底层软件,它进一步分层为:服务层,ECU抽象层,微控制器抽象层和复杂驱动,如下图所示:   
CAN通讯系列22- 基于AutoSAR的CAN通讯实现w1.jpg
Source:AUTOSAR架构,引自[1]每层按功能组继续划分,如下图所示。
CAN通讯系列22- 基于AutoSAR的CAN通讯实现w2.jpg
Source: 基于功能划分的AUTOSAR架构,引自[1]本文的CAN通讯属于通讯功能,对该功能再按模块细分,如下图所示。   
CAN通讯系列22- 基于AutoSAR的CAN通讯实现w3.jpg
Source: AUTOSAR通讯模块,引自[1]其中,CAN通讯的核心模块有4个:COM模块,PDU Router模块, CAN Interface模块和CAN Driver模块。2 CAN报文接收  

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

具体过程描述如下:
    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)形式实现数据传输,这些内容后面文章会进行详细介绍。

CAN通讯系列22- 基于AutoSAR的CAN通讯实现w5.jpg
Source: 协议层交互,引自ISO11898-13 CAN报文发送  

CAN发送功能需使用请求(Request)服务和确认(Confirmation)服务,AUTOSAR架构的CAN发送功能如下图所示。   
CAN通讯系列22- 基于AutoSAR的CAN通讯实现w6.jpg
Source: CAN发送的流程图上图描述了数据发送的具体过程,即:
    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函数将访问仲裁,数据长度和数据寄存器,将数据写入。
接着下图描述了数据发送后的确认过程,即:
    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函数,确认发送状态。

CAN通讯系列22- 基于AutoSAR的CAN通讯实现w7.jpg
Source: CAN发送确认的流程图4 小结  

关于CAN报文接收和发送目前留下了非常多的概念和内容未做解释,本文主要目的在于让大家很迅速地了解AUTOSAR架构下的CAN接收与发送的软件实现过程,先有一个大致的理解就行。当然对于没有接触过AUTOSAR知识的人来说很陌生,上述内容很抽象,很难懂。因为这些内容都来源于下图所示的AUTOSAR文档,所以想要掌握AUTOSAR架构的CAN通讯,则不得不去认真研读这些文档,当然最好能结合实际的项目代码或者能使用AUTOSAR配置工具。   
CAN通讯系列22- 基于AutoSAR的CAN通讯实现w8.jpg
为了让大家明白上述内容,了解这些AUTOSAR文档,接下来的文章将会借助这些文档尽可能详细地介绍AUTOSAR的CAN通讯软件实现。Reference:[1] AUTOSAR Layered Software Architecture[2] Specification of CAN Driver[3] Specification of CAN Interface[4] Specification of PDU Router    [5] Specification of Communication


该用户从未签到

发表于 16-3-2025 00:22:06 | 显示全部楼层
基于AutoSAR的CAN通讯实现概述:

AutoSAR(汽车开放系统架构)是一种标准化的软件架构,旨在提高汽车ECU(电子控制单元)的软件可重用性和可升级性。在CAN通讯中,AutoSAR提供了一个基于软件的框架来实现高效的通讯机制。其核心特点在于清晰的软件分层架构,保证了系统稳定性与安全性。本文将介绍AUTOSAR架构的CAN通讯软件实现。关于AutoSAR的详细概念,可访问其官网获取权威资料。接下来,我们将深入探讨AUTOSAR软件分层架构及其在CAN通讯中的应用。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 12:31 , Processed in 0.483267 second(s), 35 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.