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

相关推荐
西城微科方案开发4 小时前
方案商|西城微科胎压计方案开发
单片机·嵌入式硬件
深圳市尚想信息技术有限公司4 小时前
HITENX海速芯TM56M152A-SOP8单片机MCU微控制器IC,高精度ADC-16位PWM国产主控芯片
单片机·嵌入式硬件
艾芯微科技5 小时前
CJX3134K 长晶双 N 沟道 MOS 管详解|SOT-563 20V 小型电源开关方案
网络·单片机·嵌入式硬件·集成测试·51单片机
云勤通5 小时前
智慧后勤系统哪家满意度高
车载系统
云勤通5 小时前
智慧后勤系统生产厂家
车载系统
Zentceh5 小时前
PixelClean 这类 AI 降噪算法是怎么工作的?从 RAW 域到 GAN 色彩重建的技术拆解
图像处理·人工智能·科技·算法·计算机视觉·车载系统·智能硬件
番茄灭世神5 小时前
PN学堂GD32教程第14篇——Arm单片机启动流程
arm开发·单片机·嵌入式硬件
嵌入式学习菌7 小时前
Modbus 03H 最多读多少寄存器?10H 最多写多少寄存器?
单片机
小李不想当小白7 小时前
USART串口数据包(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
硅基手札8 小时前
【Linux 内核专栏 18】进程间通信 IPC(下)— Socket·Netlink·fd 三件套·futex·线程同步
linux·运维·驱动开发·单片机·嵌入式硬件·mcu·架构