【AutoSAR】详解CANIF模块

不行动,一切梦想都是空想。

一、前言

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

二、基本功能

CanIf主要提供了两类功能:

  1. CanSM通过CanIf提供的接口控制CAN controllers和CAN transceivers,而NM和ComM通过CanSM达到控制和监控多路CAN网络。
  2. 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通信系统的稳定性与可移植性。

相关推荐
小小的代码里面挖呀挖呀挖2 小时前
恒玄BES蓝牙耳机开发--IIC接口应用
笔记·单片机·物联网·学习·iot
xyx-3v2 小时前
RS485 RE、DE
单片机·嵌入式硬件
weixin_432444762 小时前
单片机 Flash 指定地址存储常量字符串调试笔记
笔记·单片机·嵌入式硬件
提灯春秋3 小时前
基于定时器中断的多任务轮询架构
单片机·嵌入式硬件·架构
jllllyuz3 小时前
ESP32开发-迷你掌上平衡车miniBot完整开发指南
单片机·嵌入式硬件
不爱吃大饼3 小时前
WeMos开发板
单片机·嵌入式硬件
雅斯驰3 小时前
BMS、电机控制、医疗设备:ISO1540DR的I²C隔离应用版图
单片机·嵌入式硬件
yuan199973 小时前
温度传感器VC++串口通信程序(与51单片机通讯)
stm32·单片机·嵌入式硬件
LCMICRO-133108477463 小时前
国产长芯微LDC4048完全P2P替代DAC128S085,是一款 8 通道、带输出放大器的数模转换器 (DAC)
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·数模转换器dac