文章目录
>>>>>>>>>>返回专栏总目录《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配置(FullCan
或BasicCan
)匹配到对应的Pdu,根据配置进行不同处理。
- FullCan:HRH接收到的为特定的CAN帧,CanDrv中调用
CanIf_RxIndication()
时得到标准的Pdu,该Pdu将在CanIf中依据配置的CanId进行判断是否为FullCan
。为FullCan
则进行数据长度检查,检查当前接收Pdu是否是一个完整的CAN数据帧。校验通过后CanIf通过CanIfRxPduUserRxIndicationUL
、CanIfRxPduUserRxIndicationName
两个配置参数识别是否配置了目标上层模块,若配置上层模块将该Pdu数据传递至指定模块中。在传递过程中CAN硬件接收句柄序号会被锁定,直到复制到上层模块缓冲区中结束后立即释放。 - BasicCan:HRH依据配置的CanId范围(硬件过滤)接收到的CAN帧,CanDrv中调用
CanIf_RxIndication()
时得到标准的Pdu,该Pdu将在CanIf中依据配置的CanId范围进行判断是否为需要接收的Pdu(软件过滤)。若为需要接收Pdu则进行数据长度检查,检查当前接收Pdu是否是一个完整的CAN数据帧。校验通过后CanIf通过CanIfRxPduUserRxIndicationUL
、CanIfRxPduUserRxIndicationName
两个配置参数识别是否配置了目标上层模块,若配置上层模块将该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设置控制模式如下图所示:
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控制的控制器相关信息。
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfCtrlId | CanIf 控制的 Can 控制器索引, 自动生成 |
2 | CanIfCtrlWakeupSupport | 是否支持控制器唤醒, 只有当 CanIfPublicCfg/CanIfWakeupSupport 使能时才能选择 |
3 | CanIfCtrlCanCtrlRef | 引用路径为 Can/CanConfigSet/CanController 的控制器实例 |
3.2 CanIfDispatchCfg
该容器主要配置分配任务相关信息。
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfDispatchUserCheckTrcvWakeFlagIndicationUL | 选择检查收发器唤醒通知标志通知模块是 CanSM 模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制,参数 CanIfPublicPnSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile |
2 | CanIfDispatchUserCheckTrcvWakeFlagIndicationName | 调用 CanSM 模块检查收发器唤醒通知标志通知对应接口或调用 Cdd 模块对应检查收发器唤醒通知标志的接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 控制。根据参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 选择的模块自动生成相对应的模块的接口, CanSM模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
3 | CanIfDispatchUserClearTrcvWufFlagIndicationUL | 选择清除 TrcvWu 标志通知模块是使用 CanSM 模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制, 参数 CanIfPublicPnSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile |
4 | CanIfDispatchUserClearTrcvWufFlagIndicationName | 调用 CanSM 清除 TrcvWu 标志通知对应接口或调用 Cdd 模块对应清除 TrcvWu 标志通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 控制。根据参数 CanIfDispatchUserCheckTrcvWakeFlagIndicationUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd模块接口运行被修改 |
5 | CanIfDispatchUserConfirmPnAvailabilityUL | 选择确认 PN 有效通知模块是 CanSM模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制, 参数 CanIfPublicPnSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile |
6 | CanIfDispatchUserConfirmPnAvailabilityName | 调用 CanSM 确认 PN 有效通知对应接口或调用 Cdd 对应确认 PN 有效通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserConfirmPnAvailabilityUL 控制。根据参数 CanIfDispatchUserConfirmPnAvailabilityUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
7 | CanIfDispatchUserCtrlBusOffUL | 选择控制器总线关闭通知模块是 CanSM 模块还是 Cdd 模块。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile |
8 | CanIfDispatchUserCtrlBusOffName | 调用 CanSM 控制器总线关闭通知对应接口或调用 Cdd 模块对应控制器总线关闭通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCtrlBusOffUL控制。根据参数 CanIfDispatchUserCtrlBusOffUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
9 | CanIfDispatchUserCtrlModeIndicationUL | 选择控制器模式通知模块是 CanSM模块还是 Cdd 模块。选择 CDD 模块必须配置 CanIfPublicCfg 容器中的参数 CanIfPublicCddHeaderFile |
10 | CanIfDispatchUserCtrlModeIndicationName | 调用 CanSM 控制器模式通知对应接口或调用 Cdd 模块对应控制器模式通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserCtrlModeIndicationUL 控制。根据参数 CanIfDispatchUserCtrlModeIndicationUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
11 | CanIfDispatchUserTrcvModeIndicationUL | 选择收发器模式通知模块是 CanSM还是 Cdd 模块。此参数受 CanIfTrcvDrvCfg 容器中子容器 CanIfTrcvCfg 控制, 如果配置了容器 CanIfTrcvCfg 实例则可以配置该参数, 否则禁用该参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile |
12 | CanIfDispatchUserTrcvModeIndicationName | 调用 CanSM 收发器模式通知对应接口或调用 Cdd 模块对应收发器模式通知接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserTrcvModeIndicationUL 控制。根据参数 CanIfDispatchUserTrcvModeIndicationUL 选择的模块自动生成对应的模块的接口, CanSM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
13 | CanIfDispatchUserValidateWakeupEventUL | 选择有效唤醒事件通知模块是 EcuM模块还是 Cdd 模块。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicWakeupCheckValidSupport 控制, 参数 CanIfPublicWakeupCheckValidSupport 打开则可以配置此参数, 否则禁用此参数。选择 Cdd 模块必须配置 CanIfPublicCfg容器中的参数 CanIfPublicCddHeaderFile |
14 | CanIfDispatchUserValidateWakeupEventName | 调用 ECUM 有效唤醒事件对应接口或调用 Cdd 模块对应有效唤醒事件接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserValidateWakeupEventUL 控制。根据参数 CanIfDispatchUserValidateWakeupEventUL 选择的模块自动生成对应的模块的接口, EcuM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
14 | CanIfDispatchUserValidateWakeupEventName (英语) | 调用 ECUM 有效唤醒事件对应接口或调用 Cdd 模块对应有效唤醒事件接口。此参数受 CanIfDispatchCfg 容器中的参数 CanIfDispatchUserValidateWakeupEventUL 控制。根据参数 CanIfDispatchUserValidateWakeupEventUL 选择的模块自动生成对应的模块的接口, EcuM 模块自动生成接口不允许被修改, Cdd 模块接口运行被修改 |
3.3 CanIfInitCfg
该容器主要配置CanIf初始化时相关参数
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfInitCfgSet | CanIf 的初始化设置, 自动生成 |
2 | CanIfMaxBufferSize | 可选值, 所有 Tx 缓冲区的总大小。如果勾选此参数, 则会根据所有的 Tx Pdu计算出 Tx 缓冲区的总大小 |
3 | CanIfMaxRxPduCfg | 可选值, 最大接收 Pdu 数量。如果勾选此参数, 则会根据 CanIfInitCfg 容器中子容器 CanIfRxPduCfg 的实例数量自动生成 |
4 | CanIfMaxTxPduCfg | 可选值, 最大可发送 Pdu 数量。如果勾选此参数, 则会根据 CanIfInitCfg 容器中子容器 CanIfTxPduCfg 的实例数量自动生成 |
5 | CanIfBufferCfg | 这个容器包含 TxBuffer 配置, 详见 3.3.1 |
6 | CanIfInitHohCfg | 这个容器包含对底层CAN驱动的配置和引用, 详见 3.3.2 |
7 | CanIfRxPduCfg | 这个容器中包每个接收 CAN Pdu 的配置,详见 3.3.3 |
8 | CanIfTxPduCfg | 这个容器中包每个发送 CAN Pdu 的配置,详见 3.3.4 |
3.3.1 CanIfBufferCfg
该同期主要配置CanIf缓冲区相关参数
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfBufferSize | 该参数定义了可以缓冲在一个发送缓冲区中的 Tx Pdu 的数量。 如果该值为 0, 则 CanIf 不会对分配给此发送缓冲区的 Tx Pdu进行缓冲。 如果配置参数 CanIfPublicTxBuffering(详见 3.5) 不启用, 则该参数对所有发送缓冲区均等于 0.如果引用的 HTH 的CanHandleType 为 FULL CAN(详见 3.3.2.1) , 则该发送缓冲区的参数也等于 0。此参数会根据以上条件自动生成 |
2 | CanIfBufferHthRef | CanIf 缓冲区引用硬件发送对象。所有的 CanIfBufferCfg 容器实例中的此参数引用容器 CanIfInitCfg 的子容器 CanIfInitHohCfg 的子容器 CanIfHrhCfg 的实例只能引用一次(容器 CanIfBufferCfg 实例与容器CanIfHrhCfg 的实例一对一),否则会报错 |
3.3.2 CanIfHrhCfg
该容器主要配置CanIfHoh中Hrh相关参数
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfHrhSoftwareFilter | 是否支持 Hrh 软件过滤, 在如果 CanIfHrhIdSymRef 参数引用的实例 CanHardwareObject 中参数 CanHandleType 是 BASIC CAN时一定要将这个参数勾选否则过滤不通过, 如果是 FULL CAN 则不需要勾选 |
2 | CanIfHrhCanCtrlIdRef | 引用所属的控制器 Id。 一个控制器可以包含一个或多个 HRH。引用 CanIfCtrlDrvCfg 容器中子容器 CanIfCtrlCfg 的实例名 |
3 | CanIfHrhIdSymRef | 该参数引用 Can 模块中容器 Can/CanConfigSet中的子容器CanHardwareObject的实例名。引用该容器 CanHardwareObject 实例时, 需要配置 CanHandleType 和 CanObjectId 参数 |
4 | CanIfHrhRangeCfg | 在如果 CanIfHrhIdSymRef 参数引用的实例CanHardwareObject 中参数 CanHandleType是 BASIC CAN 时一定要配置此容器, 如果是 FULL CAN 则禁止配置此容器。该容器是配置 CAN ID 范围, 详见 3.3.2.1.1 |
3.3.3 CanIfHrhRangeCfg
该容器主要配置Hrh中接收范围相关参数
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfHrhRangeBaseId | 此参数是可选值。 CanId 作为基本值, 与配置参数 CanIfHrhRangeMask 结合使用, 定义一个掩码 Id 范围。 在这个范围内, 所有CanId 都通过软件过滤。 该参数的大小受配置参数 CanIfHrhRangeRxPduRangeCanIdType 的限制 |
2 | CanIfHrhRangeMask | 此参数是可选值。 掩码值与 CanIfHrhRangeBaseId 结合使用, 定义了一个范围。 在这个范围内, 所有的 CanId 都将通过软件过滤。 该参数的大小受到配置参数 CanIfHrhRangeRxPduRangeCanIdType 的限制 |
3 | CanIfHrhRangeRxPduLowerCanId | 允许接收的 Can 数据帧的最小 CanId 值 |
4 | CanIfHrhRangeRxPduRangeCanIdType | 如果接收的 CanId 是标准帧则选择标准帧,反之则选择扩展帧 |
5 | CanIfHrhRangeRxPduUpperCanId | 允许接收的 Can 数据帧的最大 CanId 值 |
3.3.4 CanIfHthCfg
该容器主要配置CanIfHoh中Hth相关参数
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfHthCanCtrlIdRef | 引用所属的控制器 Id。 一个控制器可以包含一个或多个 HTH。引用 CanIfCtrlDrvCfg 容器中子容器 CanIfCtrlCfg 的实例名 |
2 | CanIfHthIdSymRef | 该参数引用 Can 模块中容器 Can/CanConfigSet中的子容器CanHardwareObject的实例名。引用该容器 CanHardwareObject 实例时, 需要配置 CanHandleType 和 CanObjectId 参数 |
3.3.5 CanIfRxPduCfg
该容器主要配置接收Pdu的相关参数
序号 | 配置项 | 配置项描述 |
---|---|---|
1 | CanIfRxPduCanId | CanIf 接收 Pdu 的帧 Id。如果想要将接收报文上传给上层模块, 则必须配置此参数。 此参数需要根据参数 CanIfRxPduCanIdType 的类型配置。当配置参数 CanIfRxPduHrhIdRef 引用同一个 Hrh 时, 则不允许配置有相同的 CanId |
2 | CanIfRxPduCanIdMask | CanIf 接收 Pdu 时的 CanId 的掩码。 一般不需要配置即可, 如有需要则可进行配置 |
3 | CanIfRxPduCanIdType | 接收 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 标准帧 |
4 | CanIfRxPduDlc | 此参数用于 DLC 检查, 此参数配置必须小于或者等于接收 Pdu 的数据长度, 才可以通过 DLC 检查。此参数配置为接收 Pdu 的数据长度即可 |
5 | CanIfRxPduReadData | 是否缓存最近一次接收此 Pdu 数据。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicReadRxPduDataApi 控制, 参数 CanIfPublicReadRxPduDataApi 打开则可以配置此参数, 否则禁用此参数 |
6 | CanIfRxPduReadNotifyStatus | 是否支持启动读取接收 Pdu 接收通知状态。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicReadRxPduNotifyStatusApi 控制,参数 CanIfPublicReadRxPduNotifyStatusApi打开则可以配置此参数, 否则禁用此参数 |
7 | CanIfRxPduUserRxIndicationName | 上层模块对应接收 Pdu 的接口名称,此参数受参数 CanIfRxPduUserRxIndicationUL 控制, 根据参数 CanIfRxPduUserRxIndicationUL 引用的模块自动生成对应的接口, 根据 Cdd 模块生成的接口可以修改,其他模块生成的接口无法修改 |
8 | CanIfRxPduUserRxIndicationUL | 接收到的 Pdu 通知的上层模块 |
9 | CanIfRxPduHrhIdRef | 将接收的 Pdu 关联到 HRH |
10 | CanIfRxPduRef | 引用 EcuC 中用于接收 Pdu。引用 EcuC 模块中 EcucConfigSet 容器中子容器 Pdu 的实例名称 |
11 | CanIfRxPduId | 接收 Pdu 的在 CanIf 层中的 Id, 此参数自动生成 |
12 | CanIfRxPduCanIdRange | 将多个 CAN ID 映射到一个 PduId, 详见3.3.3.1。如果不将多个 CAN ID 映射到一个 PduId则此容器不要配置 |
3.3.6 CanIfTxPduCfg
该容器主要配置发送Pdu的相关参数
序号 | 配置参数 | 配置项描述 |
---|---|---|
1 | CanIfTxPduCanId | CanIf 发送 Pdu 的 Can 帧 Id。如果想要将发送的报文发送给驱动模块,则必须配置此参数。此参数需要根据参数 CanIfTxPduCanIdType 的类型配置。 |
2 | CanIfTxPduCanIdMask | 保持发送 Pdu 部分位静态 |
3 | CanIfTxPduCanIdType | 发送 Pdu 的 CanId 类型 |
4 | CanIfTxPduId | 发送的 Pdu 在 CanIf 中的 Id,会自动生成。 |
5 | CanIfTxPduPnFilterPdu | 在发送 Pdu 中是否支持 PN 中过滤。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicPnSupport 控制,参数 CanIfPublicPnSupport 打开则可以配置此参数,否则禁用此参数。 |
6 | CanIfTxPduReadNotifyStatus | 是否支持读取发送 Pdu 的通知状态。此参数受 CanIfPublicCfg 容器中的参数 CanIfPublicReadTxPduNotifyStatusApi 控制,参数 CanIfPublicReadTxPduNotifyStatusApi 打开则可以配置此参数,否则禁用此参数。 |
7 | CanIfTxPduTriggerTransmit | 确定 CanIf 是否对该 Pdu 使用触发传递。此参数受 CanIfPublicCfg 容器中的参数 CanIfTriggerTransmitSupport 控制,参数 CanIfTriggerTransmitSupport 打开则可以配置此参数,否则禁用此参数。 |
8 | CanIfTxPduType | 发送 Pdu 类型。 |
9 | CanIfTxPduUserTriggerTransmitName | 调用上层模块触发发送相关接口。此参数受参数 CanIfTxPduTriggerTransmit 控制。此参数会根据 CanIfRxPduUserRxIndicationUL 选择的模块自动生成对应的接口,Cdd 模块生成的接口可以修改,其他模块生成的接口无法修改。 |
10 | CanIfTxPduUserTxConfirmationName | 调用上层模块发送确认相关接口。此参数会根据 CanIfRxPduUserRxIndicationUL 选择的模块自动生成对应的接口,Cdd 模块生成的接口可以修改,其他模块生成的接口无法修改。 |
11 | CanIfTxPduUserTxConfirmationUL | 发送确认通知上层模块。 |
12 | CanIfTxPduBufferRef | 将接收的 Pdu 归属到 CanIfBufferCfg 中。引用 CanIfInitCfg 容器中的子容器 CanIfBufferCfg 的实例名称。 |
13 | CanIfTxPduRef | 引用 EcuC 中用于发送 Pdu。引用 EcuC 模块中 EcucConfigSet 容器中子容器 Pdu 的实例名称。 |
3.4 CanIfPrivateCfg
该容器主要配置私有接口相关参数
序号 | 配置参数 | 配置项描述 |
---|---|---|
1 | CanIfFixedBuffer | 此参数定义了对于仅分配小于 8 字节的 Pdu 的缓冲区, 缓冲区元素长度是否应固定为 8 字节。TRUE: 最小缓冲区元素长度固定为 8 字节。FALSE: 缓冲区元素长度取决于引用 Pdu 的大小。 |
2 | CanIfPrivateDlcCheck | 是否支持 DLC 检查支持 |
3 | CanIfPrivateSoftwareFilterType | 只支持 LINEAR 过滤 |
3.5 CanIfPublicCfg
该容器主要配置公共接口相关参数
序号 | 配置参数 | 配置项描述 |
---|---|---|
1 | CanIfMetaDataSupport | 是否支持使用元数据用于动态 Pdu 处理 |
2 | CanIfPublicCancelTransmitSupport | 是否支持取消发送支持 |
3 | CanIfPublicCddHeaderFile | 用于 Cdd 回调函数头文件包含 |
4 | CanIfPublicDevErrorDetect | 是否支持使用检错报告 |
5 | CanIfPublicHandleTypeEnum | 用于配置 Can_HwHandleType |
6 | CanIfPublicIcomSupport | 是否支持使用 Icom |
7 | CanIfPublicMultipleDrvSupport | 是否支持使用多个 CAN 驱动 |
8 | CanIfPublicPnSupport | 是否支持使用局部网络支持 |
9 | CanIfPublicReadRxPduDataApi | 是否支持使用读取接收 Pdu 数据 |
10 | CanIfPublicReadRxPduNotifyStatusApi | 是否支持使用读取接收通知状态 |
11 | CanIfPublicReadTxPduNotifyStatusApi | 是否支持使用读取发送通知状态 |
12 | CanIfPublicSetDynamicTxIdApi | 是否支持使用设置发送 Pdu 中 CanId |
13 | CanIfPublicTxBuffering | 是否支持使用发送缓冲 |
14 | CanIfPublicTxConfirmPollingSupport | 是否支持使用发送确认轮询 |
15 | CanIfPublicVersionInfoApi | 是否支持获取当前模块版本信息 |
16 | CanIfPublicWakeupCheckValidByNM | 是否支持使用 NM 检查有效唤醒验证 |
17 | CanIfPublicWakeupCheckValidSupport | 是否支持使用检查有效唤醒验证 |
18 | CanIfSetBaudrateApi | 是否支持使用设置波特率 |
19 | CanIfTriggerTransmitSupport | 是否支持使用触发发送 |
20 | CanIfTxOfflineActiveSupport | 是否支持使用 TxOfflineActive |
21 | CanIfWakeupSupport | 是否支持唤醒 |
四、总结
通过提供抽象接口, CanIf 将底层硬件资源映射为上层模块可以使用的抽象软件资源,确保数据在各模块之间传输,从而屏蔽了底层驱动的接口细节,简化了系统的整体设计与实现。
因篇幅问题,关于CanIf模块的主要配置就介绍到这里。毕竟,光是嘴上说,始终如同纸上谈兵。强烈建议想要了解完整的模块配置,可以前往网页端的配置工具<<<<【 EasySAR 】>>> (点击跳转,建议使用电脑版登录),亲自上手配置一番。
参考文档:Specification of CAN Interface. AUTOSAR, 4.2.2
在这里建议大家扫码关注一下微信公众号,后台回复资料获取免费的AUTOSAR学习资料,也会用这个号开启直播带大家从0开始搭建AUTOSAR开发环境,手把手撸代码,进行实战教学。