AUTOSAR中CAN通信协议栈配置详解
bigegpt 2025-03-06 12:18 8 浏览
AUTOSAR的通信协议栈是由BSW通信服务,通信硬件抽象和通信驱动程序组成。
图1 AUTOSAR 通信协议栈的组件
COM模块
AUTOSAR COM是位于RTE和PduR之间的服务层模块,主要用于与RTE之间的信号交互,对信号进行打包和解包。另外在该模块中还可以配置IPDU的通信周期、通信周期偏移量、IPDU Group等。
PduR模块
PduR的作用是为通信协议栈中的不同总线的IPDU提供路由路径。例如它将接收的IPDU路由至COM、Dcm等模块,或者将COM模块需要发送的IPDU路由至CanIf模块,最后传送至芯片的CAN Driver,将信号发送至总线。
CanTp模块
Tp表示传输协议。该模块是特定于总线,其配置取决于基础总线协议,可以是CAN、LIN、CANFD等总线。该模块主要用于长报文的分段发送,以及对分段报文进行重组。
Bus SM 模块
总线状态管理模块负责相应总线状态机的管理和总线故障的处理。它可以基于CAN总线的CanSM,或者是基于LIN总线的LinSM等。
Bus Trcv Driver模块
它是ECU抽象层的一部分。它可以是用于CAN收发器的CanTrcv,用于以太网收发器的EthTrcv,用于Flexray收发器的FrTrcv等。此模块用于对收发器进行初始化配置,它提供独立于控制器硬件的用于启动传输的服务和用于通知接收事件的回调函数。
Bus Driver
该模块是AUTOSAR MCAL层的一部分(例如:CanDrv,LinDrv,FrDrv),它实际上与ECU的底层硬件进行交互,并为其上层提供独立于硬件的接口。此模块取决于硬件,并且驱动程序代码可能会根据基础硬件而有所不同。BusIf是唯一可以访问此总线驱动程序的模块。
CAN总线的COM配置实施
下面我们来看看CAN通信协议栈,如下图2所示,包括Com、PduR、CanTp、CanSm、CanIf、CAN Driver等模块,其中COM与PduR模块是通用的,其功能与总线铜线协议无关。
图2 AUTOSAR CAN通信协议栈
下面来详细聊聊各个模块的配置选项。
COM模块
配置的COM模块基本目的是在上层RTE层和下层PDU路由器之间建立系统通信,而不考虑通信协议。这可以通过定义和配置四个不同的对象来完成。
- I-PDUI-PDU包含从通信栈中某一模块接收到的消息或需要发送给某一模块的消息。
- I-PDU组如果我们有大量的I-PDU,则可以将它们分为不同的组,通常至少分为两个组,一个为TxGroup,一个为RxGroup。
- 信号I-DPU可以包含一个或多个信号,可以理解为一个I-PDU为一帧CAN消息,信号就是dbc中定义的。
- 信号组如果需要将多个信号发送到同一I-PDU,则信号可以进一步形成信号组。COM模块包含两个主要的部分,分别为ComGeneral和ComConfig。
- ComGeneral(多重性:1)
- ComConfigurationUseDet:如果此布尔参数设置为ON,则任何当COM模块出现错误时,会调用Det_ReportError函数,记录在DET模块中(多重性:0.1)。
- ComCancellationSupport:这是一个布尔参数,用于启用/禁用用于取消PDU传输请求的取消功能。(多重性:0.1)。
- ComEnableSignalGroupArrayApi:这是一个布尔参数,用于激活/禁用信号组阵列访问API。(多重性:1)。
- ComSupportedIPduGroups:它是一个整数参数,用于说明所支持的IPDU组的最大数量。(多重性:1)。
- ComVersionInfoApi:布尔参数,用于激活/禁用版本信息API Com_GetVersionInfo。(多重性:1)。
- ComRetryFailedTransmitRequests:如果此参数设置为true,则启用重试失败的传输请求。(多重性:0.1)。
- ComEnableMDTForCyclicTransmission:如果启用此选项,则它将在I-PDU的循环传输和重复传输之间提供最小延迟时间监视。(多重性:0.1)。
ComConfig(多重性:0.1)它包含四个容器,分别为ComSignals、ComIPdus、ComIPduGroups、ComSignalGroups。它还具有用于传输模式配置,信号网关配置,时基配置和过滤器参数配置的配置参数。
ComIpdu(多重性:1)该容器用于为不同的IPDU参数提供定义,如果没有该参数,则无法通过COM模块进行通信。ComIPdu也通过ComPduIdRef链接到PDU。I-PDU包含一个或多个信号和/或信号组。以下是ComIpdu的一些基本属性。
- ComIPduHandleId:这是分配为该IPDU的ID的数字值。此ID用于在各种发送和接收API调用以及相应的回调API中引用此IPDU。(多重性:0.1)。
- ComPduIdRef:它提供对COM栈的全局PDU结构的引用。(多重性:1)。
- ComIPduGroupRef:它是指IPDU所属的IPDU组。(多重性:0 ... *)。
- ComIPduSignalRef:提供对该IPDU中包含的所有信号的引用。一个IPDU可以包含一个或多个单独的信号。(多重性:0 ... *)。
- ComIPduSignalGroupRef:提供对此IPDU中包含的所有信号组的引用(多重性:0 ... *)
- ComIPduCallout:此参数可定义相应I-PDU的callout函数的名称,该函数在接收IPDU时或在发送PDU之前调用。(多重性:0 ... 1)。
- ComIPduDirection:定义I-PDU是为发送(SEND)PDU还是为接收(RECEIVE)PDU。(多重性:1)。
- ComIPduSignalProcessing: 用于配置信号是立即处理还是周期性处理,分别对应immediate或DEFERRED模式。(多重性:1)。如果将ComIPduDirection设置为SEND,则需要设置其他参数,例如传输是周期的还是混合型的等等。这是通过添加ComTxIPdu对象来添加的。
ComIpduGroup(多重性:1)它包含COM模块的IPDU组的配置参数。如果不包含ComIPduGroup容器,则未定义IPDU组。在这种情况下,无法通过COM模块进行通信。(多重性:1)
- ComIPduGroupHandleId:用作此IPDU组ID的数值。API调用需要它来启动和停止IPDU组。(多重性:1)
- ComIPduGroupGroupRef:它提供对包括该IPDU组的所有IPDU组的引用。(多重性:0 ... *)
ComSignal
IPDU可以由一个或多个信号组成。来自RTE不同应用程序的这些信号在被传输到PduR之前被打包到PDU中。该容器提供各种参数来配置PDU中的信号位位置,信号位大小和其他属性。
1、ComHandleId:这是分配给每个信号ID的数字值。与信号操作有关的不同API调用需要它。(多重性:0 ... 1)。
2、ComTimeoutFactor:它定义了监视的超时时间。(多重性:0..1)
3、ComTransferProperty:以下选项定义此信号是否可以触发相应IPDU的传输;(多重性:0 ... 1)我们可以设置以下五个选项之一:
TRIGGERED
PENDING
TRIGGERED_ON_CHANGE,
TRIGGERED_WITHOUT_REPETITION
TRIGGERED_ON_CHANGE_WITHOUT_REPETITION
4、ComBitPosition:指出信号在IPDU中的开始位置,(多重性:1)。
5、ComBitSize:它定义信号的大小(以位为单位)。(多重性:0 ... 1)
6、ComSignalEndianess:定义信号网络表示的字节排序。可以是BIG_ENDIAN,LITTLE_ENDIAN,OPAQUE。(多重性:0 ... 1)
7、ComSignalInitValue:用于设置信号的初始值。(多重性:0 ... 1)
8、ComSignalLength:它指定UINT8 [n]类型的n(以字节为单位:1 ... 8)。对于其他类型,它将被忽略。(多重性:0 ... 1)
9、ComSignalType:它指定符合BOOTEAN,SINT8,UINT8等。(多重性:1)
10、ComTimeoutNotification:定义发生超时时在发送方或接收方要调用的函数的名称(多重性:0 ... 1)
ComSignalGroup
然后,当我们需要向同一IPDu发送或接收多个信号时,可以将这些信号组合在一起以形成一个信号组。此容器包含名称与ComSignal容器相似的参数,并且对信号组具有完全相同的作用。因此,在本节中,我仅提及参数名称,要了解其行为,请参阅ComSignal部分。
- ComHandleId(多重性:0 ... 1)
- ComTimeoutFactor(多重性:0 ... 1)
- ComFirstTimeoutFactor(多重性:0 ... 1)
- ComTransferProperty(多重性:0 ... 1)
- ComNotification(多重性:0 ... 1)
- ComInvalidNotification(多重性:0 ... 1)
- ComErrorNotification(多重性:0 ... 1)
- ComTimeoutNotification(多重性:0 ... 1)
- PDU路由器(PduR)
PduR负责将PDU路由到特定的总线接口。在PduR之上的所有层中,所有PDU都是独立于协议的。在PduR之下的所有PDU都属于特定的协议接口模块,PduR模块为主要容器提供以下参数配置。
PduRBswModules(多重性:0 ... *)
每个容器都描述了PDU路由器必须连接的特定BSW模块。添加PduRBswModule时,容器的简称必须与Bsw模块的名称匹配,例如CanIf。
PdurGeneral(多重性:1)
这是PduR模块的子容器,它指定PDU路由器的常规配置参数。以下是一些基本配置参数。
- PduRDevErrorDetect:如果启用,它将默认错误跟踪器(Det)检测和通知打开。(多重性:1)
- PduRVersionInfoApi:如果设置为true,则PduR_GetVersionInfo API可用。(多重性:1)
PduRRoutingTables(多重性:1)
它表示路由路径表。此路由表允许使用多个配置,这些配置用于在同一配置中创建多个路由表。
1、PduRConfigurationId:它提供了使用PduR API读取的PduR配置的配置的标识。(多重性:1)
2、PduRMaxRoutingPathCnt:给出所有路由表中最大路由路径数。(多重性:1)
3、PduRMaxRoutingTableCnt:它给出了路由表的最大数量。(多重性:1)
PduRSrcPdu
这是PduRRoutingPath容器的子容器,它指定要路由的PDU的源。
- PduRSourcePduHandleId:这是PDU路由器分配的PDU标识符。(多重性:1)
- PduRSrcPduRef:此参数提供对唯一PDU标识符的引用,该标识符表示PDU的源地址。(多重性:1)
- PduRDestPdu这是PduRRoutingPath容器的子容器,并为要路由的PDU指定一个目的地。1、PduRDestPduHandleId:由PDU路由器分配的PDU标识符,通信接口和传输协议模块使用该PDU标识符进行确认。(多重性:0 ... 1)
- 2、PduRDestPduDataProvision:此参数指定如何以
PDU_DIRECT或PDUR_TRIGGERTRANSMIT提供数据。(多重性:0 ... 1) - 3、PduRDestPduRef:它提供参考唯一的PDU标识符,表示PDU路由的目的地(多重性:1)
- 4、PduRDestTxBufferRef:提供对用于单帧路由的通信接口网关和传输协议网关所需的缓冲区的引用。(多重性:0 ... 1)
CAN状态管理器(CanSM)
CAN状态管理器(CanSM)是通信服务层的成员,该层与通信硬件抽象层和系统服务层进行交互。CanSM模块负责CAN状态机的管理,包括CanTrcv、CanIf、CAN Driver的状态机切换。CanSM模块具有以下容器用于其配置。
CanSMGeneral(多重性:1)它包含CanSM模块的通用预配置参数。
- CanSMDevErrorDetect:用于打开或关闭开发错误检测API是否可以调用。(多重性:1)
- CanSMMainFunctionTimePeriod:它定义MainFunction的循环周期(单位为秒)(多重性:1)
3、CanSMVersionInfoApi:用于打开或关闭版本信息API CanSM_GetVersionInfo。(多重性:1)
CanSMManagerNetwork(多重性:1 ... *)
该容器包含用于确定底层CanController(即每个CAN网络)处理方式的CAN网络特定参数。
1、
CanSMModeRequestRepetitionTime:它确定CanSM模块将使用CanIf模块的API重复模式更改请求的持续时间。(多重性:1)
2、
CanSMModeRequestRepetitionMax:它确定模式请求重复的最大次数,如果超过次数CanSM模块向Det报告开发错误。(多重性:1)
每个CAN网络的CanSMConfiguration容器都有一个CanSMManagerNetwork。它包含每个CAN网络的CAN网络特定参数。
- CanSMBorCounterL1ToL2:它定义总线断开错误的计数,从快恢复切换到慢恢复的门槛值。(多重性:1)
- CanSMBorTimeL1:以秒为单位,定义快恢复的持续时间。(多重性:1)
- CanSMBorTimeL2:以秒为单位,定义慢恢复的持续时间。(多重性:1)CanSMController(多重性:1 ... *)
每个容器引用一个唯一的CAN控制器。
- CanSMControllerId:引用一个特定CAN控制器的唯一标识符。(多重性:1)
CanIf模块
CANIf模块位于通信栈中的通信服务层和通信驱动程序层之间。它负责控制CAN驱动程序模块的初始化,并在消息的接收(CanIf_RxIndication)或传输(CanIf_TxConfirmation)时为CAN驱动程序模块提供通知服务。CANIf模块独立于硬件。
CanIfPublicCfg(多重性:1)
该容器包含CanIf的公共配置参数。
1、CanIfDevErrorDetect:如果设置为true,它将打开开发错误检测和通知功能。如果设置为false,则关闭。(多重性:1)
2、CanIfPublicVersionInfoApi:启用或禁用用于读取版本信息的API。(多重性:1)
该容器包含CanIf的专用配置参数。
1、CanIfPrivateDlcCheck:选择是否支持DLC检查。如果启用,则如果该帧的DLC小于配置的DLC,则该帧将不会转发到上层。如果接收到的帧的DLC大于或等于配置的DLC,则将帧转发到上层。
CanIfCtrlDrvCfg(多重性:1 ... *)
- 它提供了基础CAN驱动程序模块的配置参数。一个CanIfDrvCfg引用一个Can Driver模块。
CanIfInitCfg(多重性:)它包含CanIf的所有初始化参数。此容器至少有一个实例。它定义了所有与PDU相关的配置。
CanIfBufferCfg(多重性:0 ... *)它是CanIfInitCfg的子容器。此容器包含传输缓冲区配置。必须为将用于传输帧的每个CanController添加此容器的一个实例。
CanIfTxPduCfg(多重性:0 ... *)它是CanIfInitCfg的子容器。它包含发送CAN L-PDU的配置参数。每次需要发送CAN L-PDU时都要对其进行配置。
- CanIfTxPduCanId:定义发送CAN标识符,11位标准帧或29位扩展帧。(多重性:1)
- CanIfTxPduCanIdType:定义发送CAN标识符的类型,是标准格式(11位)还是扩展格式(29位)。(多重性:1)
3、CanIfTxPduDlc:定义发送L-PDU的数据长度(以字节为单位)。范围是0到8个字节。(多重性:1)
CanIfRxPduCfg(多重性:0 ... *)
它是CanIfInitCfg的子容器。它包含每个接收到的CAN L PDU的配置参数。
- CanIfRxPduCanId:定义接收CAN标识符,11位标准帧或29位扩展帧。(多重性:1)
- CanIfRxPduCanIdType:定义接收CAN标识符的类型,是标准格式(11位)还是扩展格式(29位)。(多重性:1)
- CanIfRxPduDlc:定义接收L-PDU的数据长度(以字节为单位)。范围是0到8个字节。(多重性:1)
CAN驱动
该容器保存单个CAN驱动程序的配置参数。
CanGeneral(多重性:1)
提供模块范围的配置,其中包含常规的CanDevErrorDetection和CanVersionInfoApi。
1、CanDevErrorDetectio:启用/禁用开发错误检测和通知。(多重性:1)
2、CanVersionInfoApi:启用/禁用版本信息的API。(多重性:1)
CanConfigSet(多重性:1)
它包含CAN控制器和CAN硬件对象的配置。它是CAN驱动程序的多配置集容器。CanController(多重性:1)
- CanBusoffProcessing:设置busoff的处理方式,是中断还是轮询。=。(多重性:1)
- CanControllerActivation:定义CAN控制器是否处于激活状态以进行配置。(多重性:1)
- CanControllerId:它提供每个CAN驱动程序唯一的控制器ID。(多重性:1)
- CanRxProcessing:设置接收的处理方式,是中断还是轮询。(多重性:1)
- CanTxProcessing:设置发送的处理方式,是中断还是轮询。(多重性:1)
- CanWakeupProcessing:设置唤醒的处理方式,是中断还是轮询。(多重性:1)
- CanControllerDefaultBaudrate:提供对Can Controller的波特率配置容器的引用。
- CanControllerBaudrateConfig(多重性:1 ... *)该容器包含每个CAN控制器与位时序相关的配置参数。
- CanControllerBaudRate:设置控制器的波特率,以kbps为单位。(多重性:1)
- CanControllerPropSeg:它定义时间量中的传播延迟。(多重性:1)
- CanControllerSeg1:它定义时间段中的相位段1。(多重性:1)
- CanControllerSeg2:定义时间段中的相位段2。(多重性:1)
- CanControllerSyncJumpWidth:它定义控制器在时间量上的同步跳转宽度。(多重性:1)。
CanFilterMask(多重性:0 ... *)
此容器包含CANFilterMask的配置参数。为CAN控制器设置了ID掩码,以基于CAN id字段过滤出接收到的CAN消息。总线上的所有ECU都接收总线上传输的所有CAN数据包,但是它会根据其过滤器掩码过滤掉无关的数据包。
1、CanFilterMaskValue:它描述用于基于硬件的CAN标识符过滤的掩码值。如果EXTENDED或MIXED类型的CAN帧,则使用29位掩码,而对于STANDARD CAN帧类型,则使用11位掩码。
- 上一篇:AUTOSAR基础软件BSW简介
- 下一篇:AUTOSAR平台中的信息安全标准模块
相关推荐
- 程序员请收好:10个非常有用的 Visual Studio Code 插件
-
一个插件列表,可以让你的程序员生活变得轻松许多。作者|Daan译者|Elle出品|CSDN(ID:CSDNnews)以下为译文:无论你是经验丰富的开发人员还是刚刚开始第一份工作的初级开发人...
- PADS在WIN10系统中菜单显示不全的解决方法
-
决定由AD转PADS,打开发现菜单显示不正常,如下图所示:这个是由于系统的默认字体不合适导致,修改一下系统默认字体即可,修改方法如下:打开开始菜单-->所有程序-->Windows系统--...
- 一文讲解Web前端开发基础环境配置
-
先从基本的HTML语言开始学习。一个网页的所有内容都是基于HTML,为了学好HTML,不使用任何集成工具,而用一个文本编辑器,直接从最简单的HTML开始编写HTML。先在网上下载notepad++文...
- TCP/IP协议栈在Linux内核中的运行时序分析
-
本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看。1Linux概述 1.1Linux操作系统架构简介Linux操作系统总体上由Linux...
- 从 Angular Route 中提前获取数据
-
#头条创作挑战赛#介绍提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用resolver,在AngularApp中应用re...
- 边做游戏边划水: 基于浅水方程的水面交互、河道交互模拟方法
-
以下文章来源于腾讯游戏学堂,作者Byreave篇一:基于浅水方程的水面交互本文主要介绍一种基于浅水方程的水体交互算法,在基本保持水体交互效果的前提下,实现了一种极简的水面模拟和物体交互方法。真实感的...
- Nacos介绍及使用
-
一、Nacos介绍Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS...
- Spring 中@Autowired,@Resource,@Inject 注解实现原理
-
使用案例前置条件:现在有一个Vehicle接口,它有两个实现类Bus和Car,现在还有一个类VehicleService需要注入一个Vehicle类型的Bean:publicinte...
- 一文带你搞懂Vue3 底层源码
-
作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...
- 一线开发大牛带你深度解析探讨模板解释器,解释器的生成
-
解释器生成解释器的机器代码片段都是在TemplateInterpreterGenerator::generate_all()中生成的,下面将分小节详细展示该函数的具体细节,以及解释器某个组件的机器代码...
- Nacos源码—9.Nacos升级gRPC分析五
-
大纲10.gRPC客户端初始化分析11.gRPC客户端的心跳机制(健康检查)12.gRPC服务端如何处理客户端的建立连接请求13.gRPC服务端如何映射各种请求与对应的Handler处理类14.gRP...
- 聊聊Spring AI的Tool Calling
-
序本文主要研究一下SpringAI的ToolCallingToolCallbackorg/springframework/ai/tool/ToolCallback.javapublicinter...
- 「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作
-
一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...
- 在MySQL登录时出现Access denied for user ~~ (using password: YES)
-
Windows~~~在MySQL登录时出现Accessdeniedforuser‘root‘@‘localhost‘(usingpassword:YES),并修改MySQL密码目录适用...
- mysql 8.0多实例批量部署script
-
背景最近一个项目上,客户需要把阿里云的rdsformysql数据库同步至线下,用作数据的灾备,需要在线下的服务器上部署mysql8.0多实例,为了加快部署的速度,写了一个脚本。解决方案#!/bi...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- skip-name-resolve (63)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- dockernetworkconnect (63)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)