不行动,一切梦想都是空想。
一、前言
Can接口模块(CAN Interface,简称CanIf)提供了统一的接口管理不同的CAN硬件,包括CAN控制器(CAN controllers)和CAN收发器(CAN transceivers)。CanIf位于底层驱动层(CanDrv、CanTrcv)和上层通信服务层(CanSM、CanNM、CanTP、PduR)之间,是上下层通信的"桥梁",屏蔽了底层硬件差异,为上层模块提供标准化的通信接口。

二、基本功能
CanIf主要提供了两类功能:
- CanSM通过CanIf提供的接口控制CAN controllers和CAN transceivers,而NM和ComM通过CanSM达到控制和监控多路CAN网络。
- PduR、CanTp、CanNm等AUTOSAR依赖通信的模块,通过CanIf提供的收发机制,完成数据的接收和发送。
三、功能描述
CANIF的核心功能可拆解为数据接收、数据发送、控制器模式设置、PDU通道模式设置四大模块,每个模块的操作逻辑与规范如下,是实际开发中重点关注的内容:
3.1、数据接收
HRH标识CAN硬件接收句柄,接收CAN帧。在CanDrv中调用CanIf_RxIndication(),指示接收到CAN帧后,CanIf将依据接收CAN帧的HRH配置(FullCan或BasicCan)匹配到对应的Pdu,根据配置进行不同处理。
- FullCan:HRH接收到的为特定的CAN帧。
- BasicCan :HRH依据配置的CanId范围(硬件过滤)接收到的CAN帧,CanDrv中调用CanIf_RxIndication()时得到标准的Pdu,该Pdu将在CanIf中依据配置的CanId范围进行判断是否为需要接收的Pdu(软件过滤)。
3.2、数据发送
CanIf的发送请求函数CanIf_Transmit()是上层模块请求发送Pdu的通用接口。
CanIf_Transmit()对PDU发送前执行以下操作:
- 检查CanIf的发送状态(控制器模式、Pdu通信模式)
- 当使用多个CanDrv时,匹配对应的CanDrv
- 根据配置找到对应的CAN硬件传输对象HTH
- 调用CanDrv的Can_Write()
若发送成功,CanDrv将调用CanIf_TxConfirmation()通知CanIf模块,当前发送数据成功发送可以发送下一个Pdu数据;
若发送失败,且Pdu未配置发送缓冲,则CanIf_Transmit()将返回E_NOT_OK;若启用了发送缓冲,将本次发送的Pdu数据存储在缓冲区CanIfTxBuffer中,CanIf_Transmit()也会返回E_OK值,CanIf通过CanIf_TxConfirmation()回调处理未完成的发送,使上层无需重新提出传输请求,在CanIf_TxConfirmation()中再次处理发送后,若仍未成功,将依据CanIf中相关处理方式(如丢弃或插入缓冲中待HTH空闲时重新发送等)进行不同操作。
3.3、设置控制器模式
通过调用CanIf_SetControllerMode()接口请求更改CAN控制器状态。控制器共有如下四种状态:
- CANIF_CS_UNINIT:控制器未初始化,需将控制初始化后进行后续操作
- CANIF_CS_STOPPED :控制器处于停止状态,接收和发送操作无法进行
- CANIF_CS_STARTED:控制器处于启动状态,可以进行接收和发送操作
- CANIF_CS_SLEEP: 控制器处于睡眠状态,在唤醒前无法接收和发送操作,唤醒后可以继续进行接收和发送操作
3.4、设置PDU通道模式
只有当控制器模式处于CANIF_CS_STARTED时才允许通过CanIf_SetPduMode()更改Pdu通道模式,不同模式下Pdu的通信能力如下:
- CANIF_OFFLINE:关闭PDU通道,不允许进行PDU的接收与发送操作
- CANIF_ONLINE:开启PDU通道,允许进行PDU的接收与发送操作
- CANIF_TX_OFFLINE:关闭发送Pdu通开启PDU接收通道,允许进行Pdu的接收但不允许发送PDU
- CANIF_TX_OFFLINE_ACTIVE:模拟成功传输
四、配置说明
4.1、术语定义
**HOH:**CAN hardware object handle,CAN硬件缓存句柄,包括HTH和HRH。
**HRH:**CAN hardware receive handle,CAN硬件接收缓存句柄。
**HTH:**CAN hardware transmit handle,CAN硬件发送缓存句柄。
4.2、CanIfBufferCfgs
**CanIfBufferSize:**当前配置队列的大小,当CanIfPublicTxBuffering为TRUE才可配置。
**CanIfTxQueueSupport:**当前配置队列的类型,可以支持多种配置,包括FIFO、PQ、NONE。
FIFO:先进先出队列;PQ:以CANID为优先级的Buffer队列;NONE:不配置队列。
4.3、CanIfHrhCfgs
**CanIfHrhCanCtrlIdRef:**该引用关联到CanIf模块中CanIfCtrlCfg配置,表示当前配置归属的Can控制器。
**CanIfHrhIdSymRef:**该引用关联到Can模块中CanHardwareObject配置,表示当前配置与Can模块的某个HRH绑定。
4.4、CanIfHthCfgs
**CanIfHthIdSymRef:**该引用关联到Can模块中CanHardwareObject配置,表示当前配置与Can模块的某个HTH绑定。
4.5、CanIfRxPduCfgs
**CanIfRxPduCanIdType:**CanId类型,标识了Can报文的几种类型,表示当前PDU可以接收哪类Can报文:
- EXTENDED_CAN(所有扩展帧)
- EXTENDED_FD_CAN(扩展CANFD帧)
- EXTENDED_NO_FD_CAN(普通扩展帧)
- STANDARD_CAN(所有标准帧)
- STANDARD_FD_CAN(标准CANFD帧)
- STANDARD_NO_FD_CAN(CAN2.0标准帧)
4.6、CanIfTxPduCfgs
**CanIfTxPduCanIdType:**该配置标识了Can报文的几种类型,表示当前PDU可以发送哪几类Can报文:
- EXTENDED_CAN(普通扩展帧)
- EXTENDED_FD_CAN(扩展CANFD帧)
- STANDARD_CAN(CAN2.0标准帧)
- STANDARD_FD_CAN(标准CANFD帧)
**CanIfTxPduType:**该配置为PDU的类型选项,支持如下两种:
- DYNAMIC(发送报文的CanId可以动态通过接口CanIf_SetDynamicTxId()修改)
- STATIC(发送报文的CanId为静态配置决定)
五、总结
CANIF模块作为AutoSAR CAN通信栈的"中间枢纽",核心作用是统一接口、隔离硬件差异,其功能涵盖数据收发、控制器与PDU通道模式管控,配置则围绕硬件句柄、缓冲区、PDU参数展开。掌握本文梳理的功能逻辑与配置要点,能有效避免开发中的配置错误与功能异常,提升CAN通信系统的稳定性与可移植性。