【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通信系统的稳定性与可移植性。

相关推荐
振南的单片机世界1 天前
CPU时钟:频率越高跑越快,但物理极限在“拖后腿”
stm32·单片机·嵌入式硬件
普中科技1 天前
【普中 51-Ai8051 开发攻略】-- 第 20 章 输入捕获实验
单片机·嵌入式硬件·输入捕获·pca·普中科技·ai8051u·aicube
d111111111d1 天前
直流电机位置式 PID 控制 和 舵机的区别
笔记·stm32·单片机·嵌入式硬件·学习
Cho1yon1 天前
【第15期:车机CarPlay使用中语音唤醒失效问题分析与解决方案】
macos·车载系统·objective-c·cocoa
d111111111d1 天前
了解Modbus
网络·笔记·stm32·单片机·嵌入式硬件·学习
三佛科技-134163842121 天前
主控FT32F031便携式吸尘器方案,迷你手持吸尘器MCU控制方案开发
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
一个平凡而乐于分享的小比特1 天前
一文读懂MCU与FPGA:核心区别、协同之道与双修秘籍
单片机·fpga开发·职场发展·mcu开发
踏着七彩祥云的小丑1 天前
嵌入式——认识电子元器件——微动开关系列
单片机·嵌入式硬件
调光IC-小雅1 天前
解析FP62××系列限流保护机制:为何它是DC/DC芯片的安全底线
单片机·嵌入式硬件
gihigo19981 天前
MAX30102 + STM32 人体血氧饱和度(SpO₂)测量方案
stm32·单片机·嵌入式硬件