[AUTOSAR通信] - CANIF 模块详解

点击订阅专栏不迷路

>>>>>>>>>>返回专栏总目录《AUTOSAR从入门到精通专栏》 <<<<<<<<<<

关注文章末尾公众号或微信中搜索“AUTOSAR解忧杂货铺”,后台发送“资料”领取汽车电子入门资料,发送“加群”加入汽车电子交流群

一、概述

CanIf模块在AUTOSAR架构中位于底层CAN驱动(CanDrv)与上层通信服务模块(如PduR、CanNm、CanTp等)之间实际上就是在Can驱动的基础上再次封装了一层,供上层统一使用,如下图所示:

在这里插入图片描述

其主要功能包括:

  • 实现Pdu数据的收发,为上层模块与底层驱动间通信提供对应的收发接口;
  • 实现CAN控制器模式的控制,通过上层模块下发模式切换请求对应修改控制器模式;
  • 实现Pdu模式控制,通过上层模块下发通道模式切换请求对应修改Pdu模式。

关于Pdu详细概念,建议跳转<<<<AUTOSAR通信篇 - PDU和收发数据>>> 查看。

二、功能描述

在介绍CanIf相关功能前,我们首先来理解几个概念:Hardware Object Handles(HOH)、Hardware Transmit Handles(HTH)和Hardware Receive Handles(HRH)。

  • HOH:是CAN中邮箱的数据结构抽象,它包括CanId、DataLength(数据长度)和数据等CAN帧相关信息。
  • HRH:是HOH中的一种,用于引用一个CAN控制器邮箱的接收Handle(句柄)。一个HRH可以通过配置为FullCan类型用于接收一个特定的CanId或者配置为BasicCan类型用于接收范围内的一组CanId。
  • HTH:是HOH中的一种,用于引用一个CAN控制器邮箱的发送Handle(句柄)。
  • Full CAN:一个HOH只能接收或者发送一个CAN报文(或者说一个L-PDU),HOH可以配置成HTH或者HRH。
  • Basic CAN:一个HOH接收或者发送多个CAN 报文(或者说多个L-PDU),HOH可以配置成HTH或者HRH。

HOH实质就是存放收/发CAN报文信息的RAM区,该区域可以按需所取,也就是说:根据项目的情况(收/发的CAN报文数目),配置Message RAM使用的空间,实际工程,建议全部使用。Message RAM就好比一块蛋糕,总大小是一定的,你能吃多少,就切多少。

下图体现了CanIf与硬件对象句柄的映射路径:

在这里插入图片描述

2.1 数据接收功能

如果在CAN总线中接收到符合配置的CAN帧,CanDrv通过调用CanIf的CanIf_RxIndication ()接口,将接收到CAN报文数据组装成Pdu数据向上层模块传递并在上层模块中进行评估和处理,上层模块不能直接操作或访问CanDrv的缓冲区。

HRH标识CAN硬件接收句柄,接收CAN帧。在CanDrv中调用CanIf_RxIndication(),指示接收到CAN帧后,CanIf将依据接收CAN帧的HRH配置(FullCanBasicCan)匹配到对应的Pdu,根据配置进行不同处理。

  • FullCan:HRH接收到的为特定的CAN帧,CanDrv中调用CanIf_RxIndication()时得到标准的Pdu,该Pdu将在CanIf中依据配置的CanId进行判断是否为FullCan。为FullCan则进行数据长度检查,检查当前接收Pdu是否是一个完整的CAN数据帧。校验通过后CanIf通过CanIfRxPduUserRxIndicationULCanIfRxPduUserRxIndicationName两个配置参数识别是否配置了目标上层模块,若配置上层模块将该Pdu数据传递至指定模块中。在传递过程中CAN硬件接收句柄序号会被锁定,直到复制到上层模块缓冲区中结束后立即释放。
  • BasicCan:HRH依据配置的CanId范围(硬件过滤)接收到的CAN帧,CanDrv中调用CanIf_RxIndication()时得到标准的Pdu,该Pdu将在CanIf中依据配置的CanId范围进行判断是否为需要接收的Pdu(软件过滤)。若为需要接收Pdu则进行数据长度检查,检查当前接收Pdu是否是一个完整的CAN数据帧。校验通过后CanIf通过CanIfRxPduUserRxIndicationULCanIfRxPduUserRxIndicationName两个配置参数识别是否配置了目标上层模块,若配置上层模块将该Pdu数据传递至指定模块中。在传递过程中CAN硬件接收句柄序号会被锁定,直到复制到上层模块缓冲区中结束后立即释放。

CanIf的数据接收流程如下所示:
在这里插入图片描述
再来看一下Pdu接收的函数接口调用流程,这里还是以中断模式为例:

在这里插入图片描述
当CanController接收到数据触发接收中断后,先判断是否需用临时缓冲区进行数据规范化并做相应处理,接着CanIf模块通过CanIf_RxIndication函数接收数据,进行软件过滤、L - PDU分配等操作,再经User_RxIndication函数指示给用户层,期间依情况进行数据复制,最后CanController验证硬件对象并准备接收下次中断。

2.2. 数据传输功能

CanIf的发送请求函数CanIf_Transmit()是上层模块请求发送Pdu的通用接口。如果CanDrv能够将PDU数据写入CAN硬件传输对象中,则发起的传输请求成功完成。上层模块通过调用CanIf_Transmit ()来发起一个发送请求。

CanIf_Transmit()对PDU发送前执行以下操作:

  • 检查CanIf的发送状态(控制器模式、Pdu通信模式)
  • 当使用多个CanDrv时,匹配对应的CanDrv
  • 根据配置找到对应的CAN硬件传输对象HTH
  • 调用CanDrv的Can_Write()

在CanIf收到上层模块的发送请求后,函数CanIf_Transmit()通过PduId找到对应的HTH邮箱,并调用函数Can_Write()。

  • 若发送成功,CanDrv将调用CanIf_TxConfirmation()通知CanIf模块,当前发送数据成功发送可以发送下一个Pdu数据。CanIf将接收到的通知通过配置中的<User TxConfirmation>(User:上层模块)参数,通知到上层模块可继续请求发送下一个Pdu数据。
  • 若发送失败,且Pdu未配置发送缓冲,则CanIf_Transmit()将返回E_NOT_OK;若启用了发送缓冲,将本次发送的Pdu数据存储在缓冲区CanIfTxBuffer中,CanIf_Transmit()也会返回E_OK值,CanIf通过CanIf_TxConfirmation()回调处理未完成的发送,使上层无需重新提出传输请求,在CanIf_TxConfirmation()中再次处理发送后,若仍未成功,将依据CanIf中相关处理方式(如丢弃或插入缓冲中待HTH空闲时重新发送等)进行不同操作。

CanIf的数据发送流程如下所示:

在这里插入图片描述
传输过程的函数调用关系如下图:

在这里插入图片描述
发送完成后,底层驱动会调用上层通知函数通知上层发送完成,以便上层进一步处理,整個流程如下图所示:

在这里插入图片描述

2.2 设置控制器模式

在CanIf中无论是接收还是发送,都需要对控制器模式进行控制,控制器共有如下四种状态:

  • CANIF_CS_UNINIT:控制器未初始化,需将控制初始化后进行后续操作
  • CANIF_CS_STOPPED :控制器处于停止状态,接收和发送操作无法进行
  • CANIF_CS_STARTED:控制器处于启动状态,可以进行接收和发送操作
  • CANIF_CS_SLEEP: 控制器处于睡眠状态,在唤醒前无法接收和发送操作,唤醒后可以继续进行接收和发送操作

在初始完成后,控制器模式处于STOPPED状态,无法进行接收和发送操作。但上层模块可通过调CanIf_SetControllerMode()接口请求更改CAN控制器状态。上层模的请求通过CanIf经过CanDrv的特定API传递到指定的CAN控制器。CanIf通过调用函数CanIf_SetControllerMode()CanIf_ControllerBusOff()接受每个状态转换请求。CanIf不决定CAN控制器请求的模式转换是否有效。CanIf仅通过获取当前模式和执行请求的模式转换来与CanDrv交互确定当前控制器状态,仅提供一个桥梁的工作。

CanIf设置控制模式如下图所示:

CanIf设置控制模式

2.3 设置Pdu通道模式

在CanIf中Pdu的接收和发送除受控制器模式影响外,还受Pdu通信模式控制,只有当控制模式处于CANIF_CS_STARTED时才允许更改Pdu通道模式,不同模式下Pdu的通信能力如下:

  • CANIF_OFFLINE:关闭Pdu通道,不允许进行Pdu的接收与发送操作
  • CANIF_ONLINE:开启Pdu通道,允许进行Pdu的接收与发送操作
  • CANIF_TX_OFFLINE:开启发送Pdu通道关闭Pdu接收通道,允许进行Pdu的发送但不允许接收Pdu
  • CANIF_TX_OFFLINE_ACTIVE:模拟成功传输

在初始化期间,CanIf应该将每个通道切换到CANIF_OFFLINE。CanIf通过调用CanIf_GetPduMode()提供关于当前Pdu通道模式的信息。

对于切换到CANIF_OFFLINE模式的物理通道,CanIf应该:

  • 防止将相关L-PDU的传输请求CanIf_Transmit()转发给CanDrv。
  • 清除相应的CanIf传输缓冲区。
  • 防止调用上层模块的接收通知回调服务。
  • 防止调用上层模块的传输确认回调服务。

如果底层调用CanIf_SetControllerMode()CanIf_ControllerBusOff(),则CanIf应将相应通道的PDU通道模式设置为CANIF_TX_OFFLINE

对于切换到CANIF_ONLINE模式的物理信道,CanIf应该:

  • 允许将相关L-PDU的传输请求CanIf_Transmit()转发到CanDrv。
  • 支持调用上层模块的接收指示回调服务。
  • 允许调用上层模块的传输确认回调服务。

如果CanIfTxOfflineActiveSupport为TRUE,CanIf提供通过CANIF_TX_OFFLINE_ACTIVE模式来模拟成功传输。对于每个被分配到CANIF_TX_OFFLINE_ACTIVE模式信道的pdu CanIf会立即调用上层模块的传输确认回调服务,而不是在调用CanIf_Transmit()时将Pdu缓冲或转发到CanDrv。

Pdu通道模式转化如下图所示:

在这里插入图片描述

三、配置项介绍

本章节的配置项截图均来自网页端的配置工具<<<<EasySAR>>> (点击跳转)

3.1 CanIfCtrlCfg

该容器主要配置CanIf控制的控制器相关信息。

序号配置项配置项描述
1CanIfCtrlIdCanIf 控制的 Can 控制器索引, 自动生成
2CanIfCtrlWakeupSupport是否支持控制器唤醒, 只有当 CanIfPublicCfg/CanIfWakeupSupport 使能时才能选择
3CanIfCtrlCanCtrlRef引用路径为 Can/CanConfigSet/CanController 的控制器实例

在这里插入图片描述

3.2 CanIfDispatchCfg

该容器主要配置分配任务相关信息。

序号配置项配置项描述
1CanIfDispatchUserCheckTrcvWakeFlagIndicationUL选择检查收发器唤醒通知标志通知模块是 CanSM 模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制,参数 CanIfPublicPnSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile
2CanIfDispatchUserCheckTrcvWakeFlagIndicationName调用 CanSM 模块检查收发器唤醒通知标志通知对应接口或调用 Cdd 模块对应检查收发器唤醒通知标志的接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 控制。根据参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 选择的模块自动生成相对应的模块的接口, CanSM模块自动生成接口不允许被修改, Cdd 模块接口运行被修改
3CanIfDispatchUserClearTrcvWufFlagIndicationUL选择清除 TrcvWu 标志通知模块是使用 CanSM 模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制, 参数 CanIfPublicPnSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile
4CanIfDispatchUserClearTrcvWufFlagIndicationName调用 CanSM 清除 TrcvWu 标志通知对应接口或调用 Cdd 模块对应清除 TrcvWu 标志通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 控制。根据参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd模块接口运行被修改
5CanIfDispatchUserConfirmPnAvailabilityUL选择确认 PN 有效通知模块是 CanSM模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制, 参数 CanIfPublicPnSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile
6CanIfDispatchUserConfirmPnAvailabilityName调用 CanSM 确认 PN 有效通知对应接口或调用 Cdd 对应确认 PN 有效通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserConfirmPnAvailabilityUL 控制。根据参数 CanIfDispatchUserConfirmPnAvailabilityUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改
7CanIfDispatchUserCtrlBusOffUL选择控制器总线关闭通知模块是 CanSM 模块还是 Cdd 模块。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile
8CanIfDispatchUserCtrlBusOffName调用 CanSM 控制器总线关闭通知对应接口或调用 Cdd 模块对应控制器总线关闭通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCtrlBusOffUL控制。根据参数 CanIfDispatchUserCtrlBusOffUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改
9CanIfDispatchUserCtrlModeIndicationUL选择控制器模式通知模块是 CanSM模块还是 Cdd 模块。选择 CDD 模块必须配置 CanIfPublicCfg 容器中的参数 CanIfPublicCddHeaderFile
10CanIfDispatchUserCtrlModeIndicationName调用 CanSM 控制器模式通知对应接口或调用 Cdd 模块对应控制器模式通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCtrlModeIndicationUL 控制。根据参数 CanIfDispatchUserCtrlModeIndicationUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改
11CanIfDispatchUserTrcvModeIndicationUL选择收发器模式通知模块是 CanSM还是 Cdd 模块。此参数受 CanIfTrcvDrvCfg 容器中子容器 CanIfTrcvCfg 控制, 如果配置了容器 CanIfTrcvCfg 实例则可以配置该参数, 否则禁用该参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile
12CanIfDispatchUserTrcvModeIndicationName调用 CanSM 收发器模式通知对应接口或调用 Cdd 模块对应收发器模式通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserTrcvModeIndicationUL 控制。根据参数 CanIfDispatchUserTrcvModeIndicationUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改
13CanIfDispatchUserValidateWakeupEventUL选择有效唤醒事件通知模块是 EcuM模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicWakeupCheckValidSupport 控制, 参数 CanIfPublicWakeupCheckValidSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile
14CanIfDispatchUserValidateWakeupEventName调用 ECUM 有效唤醒事件对应接口或调用 Cdd 模块对应有效唤醒事件接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserValidateWakeupEventUL 控制。根据参数 CanIfDispatchUserValidateWakeupEventUL 选择的模块自动生成对应的模块的接口, EcuM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改
14CanIfDispatchUserValidateWakeupEventName (英语)调用 ECUM 有效唤醒事件对应接口或调用 Cdd 模块对应有效唤醒事件接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserValidateWakeupEventUL 控制。根据参数 CanIfDispatchUserValidateWakeupEventUL 选择的模块自动生成对应的模块的接口, EcuM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改

在这里插入图片描述

3.3 CanIfInitCfg

该容器主要配置CanIf初始化时相关参数

序号配置项配置项描述
1CanIfInitCfgSetCanIf 的初始化设置, 自动生成
2CanIfMaxBufferSize可选值, 所有 Tx 缓冲区的总大小。如果勾选此参数, 则会根据所有的 Tx Pdu计算出 Tx 缓冲区的总大小
3CanIfMaxRxPduCfg可选值, 最大接收 Pdu 数量。如果勾选此参数, 则会根据 CanIfInitCfg 容器中子容器 CanIfRxPduCfg 的实例数量自动生成
4CanIfMaxTxPduCfg可选值, 最大可发送 Pdu 数量。如果勾选此参数, 则会根据 CanIfInitCfg 容器中子容器 CanIfTxPduCfg 的实例数量自动生成
5CanIfBufferCfg这个容器包含 TxBuffer 配置, 详见 3.3.1
6CanIfInitHohCfg这个容器包含对底层CAN驱动的配置和引用, 详见 3.3.2
7CanIfRxPduCfg这个容器中包每个接收 CAN Pdu 的配置,详见 3.3.3
8CanIfTxPduCfg这个容器中包每个发送 CAN Pdu 的配置,详见 3.3.4

在这里插入图片描述

3.3.1 CanIfBufferCfg

该同期主要配置CanIf缓冲区相关参数

序号配置项配置项描述
1CanIfBufferSize该参数定义了可以缓冲在一个发送缓冲区中的 Tx Pdu 的数量。 如果该值为 0, 则 CanIf 不会对分配给此发送缓冲区的 Tx Pdu进行缓冲。 如果配置参数 CanIfPublicTxBuffering(详见 3.5) 不启用, 则该参数对所有发送缓冲区均等于 0.如果引用的 HTH 的CanHandleType 为 FULL CAN(详见 3.3.2.1) , 则该发送缓冲区的参数也等于 0。此参数会根据以上条件自动生成
2CanIfBufferHthRefCanIf 缓冲区引用硬件发送对象。所有的 CanIfBufferCfg 容器实例中的此参数引用容器 CanIfInitCfg 的子容器 CanIfInitHohCfg 的子容器 CanIfHrhCfg 的实例只能引用一次(容器 CanIfBufferCfg 实例与容器CanIfHrhCfg 的实例一对一),否则会报错

在这里插入图片描述

3.3.2 CanIfHrhCfg

该容器主要配置CanIfHoh中Hrh相关参数

序号配置项配置项描述
1CanIfHrhSoftwareFilter是否支持 Hrh 软件过滤, 在如果 CanIfHrhIdSymRef 参数引用的实例 CanHardwareObject 中参数 CanHandleType 是 BASIC CAN时一定要将这个参数勾选否则过滤不通过, 如果是 FULL CAN 则不需要勾选
2CanIfHrhCanCtrlIdRef引用所属的控制器 Id。 一个控制器可以包含一个或多个 HRH。引用 CanIfCtrlDrvCfg 容器中子容器 CanIfCtrlCfg 的实例名
3CanIfHrhIdSymRef该参数引用 Can 模块中容器 Can/CanConfigSet中的子容器CanHardwareObject的实例名。引用该容器 CanHardwareObject 实例时, 需要配置 CanHandleType 和 CanObjectId 参数
4CanIfHrhRangeCfg在如果 CanIfHrhIdSymRef 参数引用的实例CanHardwareObject 中参数 CanHandleType是 BASIC CAN 时一定要配置此容器, 如果是 FULL CAN 则禁止配置此容器。该容器是配置 CAN ID 范围, 详见 3.3.2.1.1

在这里插入图片描述

3.3.3 CanIfHrhRangeCfg

该容器主要配置Hrh中接收范围相关参数

序号配置项配置项描述
1CanIfHrhRangeBaseId此参数是可选值。 CanId 作为基本值, 与配置参数 CanIfHrhRangeMask 结合使用, 定义一个掩码 Id 范围。 在这个范围内, 所有CanId 都通过软件过滤。 该参数的大小受配置参数 CanIfHrhRangeRxPduRangeCanIdType 的限制
2CanIfHrhRangeMask此参数是可选值。 掩码值与 CanIfHrhRangeBaseId 结合使用, 定义了一个范围。 在这个范围内, 所有的 CanId 都将通过软件过滤。 该参数的大小受到配置参数 CanIfHrhRangeRxPduRangeCanIdType 的限制
3CanIfHrhRangeRxPduLowerCanId允许接收的 Can 数据帧的最小 CanId 值
4CanIfHrhRangeRxPduRangeCanIdType如果接收的 CanId 是标准帧则选择标准帧,反之则选择扩展帧
5CanIfHrhRangeRxPduUpperCanId允许接收的 Can 数据帧的最大 CanId 值

在这里插入图片描述

3.3.4 CanIfHthCfg

该容器主要配置CanIfHoh中Hth相关参数

序号配置项配置项描述
1CanIfHthCanCtrlIdRef引用所属的控制器 Id。 一个控制器可以包含一个或多个 HTH。引用 CanIfCtrlDrvCfg 容器中子容器 CanIfCtrlCfg 的实例名
2CanIfHthIdSymRef该参数引用 Can 模块中容器 Can/CanConfigSet中的子容器CanHardwareObject的实例名。引用该容器 CanHardwareObject 实例时, 需要配置 CanHandleType 和 CanObjectId 参数

在这里插入图片描述

3.3.5 CanIfRxPduCfg

该容器主要配置接收Pdu的相关参数

序号配置项配置项描述
1CanIfRxPduCanIdCanIf 接收 Pdu 的帧 Id。如果想要将接收报文上传给上层模块, 则必须配置此参数。 此参数需要根据参数 CanIfRxPduCanIdType 的类型配置。当配置参数 CanIfRxPduHrhIdRef 引用同一个 Hrh 时, 则不允许配置有相同的 CanId
2CanIfRxPduCanIdMaskCanIf 接收 Pdu 时的 CanId 的掩码。 一般不需要配置即可, 如有需要则可进行配置
3CanIfRxPduCanIdType接收 Pdu 的 CanId 类型
EXTENDED_CAN: CAN 或 CAN FD 扩展帧
EXTENDED_FD_CAN: CAN FD 扩展帧
EXTENDED_NO_FD_CAN: CAN 扩展帧
STANDARD_CAN: CAN 或 CAN FD 标准帧
STANDARD_FD_CAN: CAN FD 标准帧
STANDARD_NO_FD_CAN: CAN 标准帧
4CanIfRxPduDlc此参数用于 DLC 检查, 此参数配置必须小于或者等于接收 Pdu 的数据长度, 才可以通过 DLC 检查。此参数配置为接收 Pdu 的数据长度即可
5CanIfRxPduReadData是否缓存最近一次接收此 Pdu 数据。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicReadRxPduDataApi 控制, 参数 CanIfPublicReadRxPduDataApi 打开则可以配置此参数, 否则禁用此参数
6CanIfRxPduReadNotifyStatus是否支持启动读取接收 Pdu 接收通知状态。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicReadRxPduNotifyStatusApi 控制,参数 CanIfPublicReadRxPduNotifyStatusApi打开则可以配置此参数, 否则禁用此参数
7CanIfRxPduUserRxIndicationName上层模块对应接收 Pdu 的接口名称,此参数受参数 CanIfRxPduUserRxIndicationUL 控制, 根据参数 CanIfRxPduUserRxIndicationUL 引用的模块自动生成对应的接口, 根据 Cdd 模块生成的接口可以修改,其他模块生成的接口无法修改
8CanIfRxPduUserRxIndicationUL接收到的 Pdu 通知的上层模块
9CanIfRxPduHrhIdRef将接收的 Pdu 关联到 HRH
10CanIfRxPduRef引用 EcuC 中用于接收 Pdu。引用 EcuC 模块中 EcucConfigSet 容器中子容器 Pdu 的实例名称
11CanIfRxPduId接收 Pdu 的在 CanIf 层中的 Id, 此参数自动生成
12CanIfRxPduCanIdRange将多个 CAN ID 映射到一个 PduId, 详见3.3.3.1。如果不将多个 CAN ID 映射到一个 PduId则此容器不要配置

在这里插入图片描述

3.3.6 CanIfTxPduCfg

该容器主要配置发送Pdu的相关参数

序号配置参数配置项描述
1CanIfTxPduCanIdCanIf 发送 Pdu 的 Can 帧 Id。如果想要将发送的报文发送给驱动模块,则必须配置此参数。此参数需要根据参数 CanIfTxPduCanIdType 的类型配置。
2CanIfTxPduCanIdMask保持发送 Pdu 部分位静态
3CanIfTxPduCanIdType发送 Pdu 的 CanId 类型
4CanIfTxPduId发送的 Pdu 在 CanIf 中的 Id,会自动生成。
5CanIfTxPduPnFilterPdu在发送 Pdu 中是否支持 PN 中过滤。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制,参数 CanIfPublicPnSupport 打开则可以配置此参数,否则禁用此参数。
6CanIfTxPduReadNotifyStatus是否支持读取发送 Pdu 的通知状态。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicReadTxPduNotifyStatusApi 控制,参数 CanIfPublicReadTxPduNotifyStatusApi 打开则可以配置此参数,否则禁用此参数。
7CanIfTxPduTriggerTransmit确定 CanIf 是否对该 Pdu 使用触发传递。此参数受 CanIfPublicCfg 容器中的参数 CanIfTriggerTransmitSupport 控制,参数 CanIfTriggerTransmitSupport 打开则可以配置此参数,否则禁用此参数。
8CanIfTxPduType发送 Pdu 类型。
9CanIfTxPduUserTriggerTransmitName调用上层模块触发发送相关接口。此参数受参数 CanIfTxPduTriggerTransmit 控制。此参数会根据 CanIfRxPduUserRxIndicationUL 选择的模块自动生成对应的接口,Cdd 模块生成的接口可以修改,其他模块生成的接口无法修改。
10CanIfTxPduUserTxConfirmationName调用上层模块发送确认相关接口。此参数会根据 CanIfRxPduUserRxIndicationUL 选择的模块自动生成对应的接口,Cdd 模块生成的接口可以修改,其他模块生成的接口无法修改。
11CanIfTxPduUserTxConfirmationUL发送确认通知上层模块。
12CanIfTxPduBufferRef将接收的 Pdu 归属到 CanIfBufferCfg 中。引用 CanIfInitCfg 容器中的子容器 CanIfBufferCfg 的实例名称。
13CanIfTxPduRef引用 EcuC 中用于发送 Pdu。引用 EcuC 模块中 EcucConfigSet 容器中子容器 Pdu 的实例名称。

在这里插入图片描述

3.4 CanIfPrivateCfg

该容器主要配置私有接口相关参数

序号配置参数配置项描述
1CanIfFixedBuffer此参数定义了对于仅分配小于 8 字节的 Pdu 的缓冲区, 缓冲区元素长度是否应固定为 8 字节。TRUE: 最小缓冲区元素长度固定为 8 字节。FALSE: 缓冲区元素长度取决于引用 Pdu 的大小。
2CanIfPrivateDlcCheck是否支持 DLC 检查支持
3CanIfPrivateSoftwareFilterType只支持 LINEAR 过滤

3.5 CanIfPublicCfg

该容器主要配置公共接口相关参数

序号配置参数配置项描述
1CanIfMetaDataSupport是否支持使用元数据用于动态 Pdu 处理
2CanIfPublicCancelTransmitSupport是否支持取消发送支持
3CanIfPublicCddHeaderFile用于 Cdd 回调函数头文件包含
4CanIfPublicDevErrorDetect是否支持使用检错报告
5CanIfPublicHandleTypeEnum用于配置 Can_HwHandleType
6CanIfPublicIcomSupport是否支持使用 Icom
7CanIfPublicMultipleDrvSupport是否支持使用多个 CAN 驱动
8CanIfPublicPnSupport是否支持使用局部网络支持
9CanIfPublicReadRxPduDataApi是否支持使用读取接收 Pdu 数据
10CanIfPublicReadRxPduNotifyStatusApi是否支持使用读取接收通知状态
11CanIfPublicReadTxPduNotifyStatusApi是否支持使用读取发送通知状态
12CanIfPublicSetDynamicTxIdApi是否支持使用设置发送 Pdu 中 CanId
13CanIfPublicTxBuffering是否支持使用发送缓冲
14CanIfPublicTxConfirmPollingSupport是否支持使用发送确认轮询
15CanIfPublicVersionInfoApi是否支持获取当前模块版本信息
16CanIfPublicWakeupCheckValidByNM是否支持使用 NM 检查有效唤醒验证
17CanIfPublicWakeupCheckValidSupport是否支持使用检查有效唤醒验证
18CanIfSetBaudrateApi是否支持使用设置波特率
19CanIfTriggerTransmitSupport是否支持使用触发发送
20CanIfTxOfflineActiveSupport是否支持使用 TxOfflineActive
21CanIfWakeupSupport是否支持唤醒

在这里插入图片描述

四、总结

通过提供抽象接口, CanIf 将底层硬件资源映射为上层模块可以使用的抽象软件资源,确保数据在各模块之间传输,从而屏蔽了底层驱动的接口细节,简化了系统的整体设计与实现。

因篇幅问题,关于CanIf模块的主要配置就介绍到这里。毕竟,光是嘴上说,始终如同纸上谈兵。强烈建议想要了解完整的模块配置,可以前往网页端的配置工具<<<<EasySAR>>> (点击跳转,建议使用电脑版登录),亲自上手配置一番。

参考文档:Specification of CAN Interface. AUTOSAR, 4.2.2

在这里建议大家扫码关注一下微信公众号,后台回复资料获取免费的AUTOSAR学习资料,也会用这个号开启直播带大家从0开始搭建AUTOSAR开发环境,手把手撸代码,进行实战教学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值