基于EB MCAL,S32K312_CAN配置

本文配置只记录主要点、易错点、易遗忘点

一、这款芯片的can配置

时钟源

手册931页

可知想要配置can的波特率,主要是要配置 FLEXCANn_PE_CLK 时钟,而这个时钟是挂载在

可由如图内部高速、外部高速、总线快时钟、系统时钟分频得到

S32K312 拥有6个canfd外设

二、can外设配置

其中can0最高级,拥有20个增强型RXFIFO(canfd接收)

常规则分别拥有64个8字节邮箱或者32个8字节邮箱

二、EB配置

1、时钟

刚刚图中mux3中配置can 012的时钟源,这里选择外部高速时钟,最好也配置外部高速时钟,更加的稳定

之后配置时钟参考点

配置完成后,开启外设时钟

2、配置can0通道

这里如果配置接收或者发送为轮询模式,则需要在

添加MainFuntion函数,添加个数发送接收要分开

配置接收发送邮箱时调用

中断模式则需要

在中断配置中勾选使能中断,中断函数需要根据静态mcal中已经写好的名称,不能自己写

很多其他芯片这里生成的时候,中断名都会自动配置好,这里则需要手动填写

3、canfd模式

canfd模式下

需要打开RamBlock

同时配置数据端的波特率

!!!

特别注意使用canfd的时候,需要 | 上 CAN_43_FLEXCAN_FD_FRAME_U32

例如

#define CAN_43_FLEXCAN_FD_FRAME_U32        ((uint32)0x40000000U)
#define CAN_43_FLEXCAN_EXTENDED_ID_U32     ((uint32)0x80000000U)

同理也要注意 扩展帧的 CAN_43_FLEXCAN_EXTENDED_ID_U32

4、注意配置canif

这款芯片需要特别配置canif

顺着把这几个配置了就可以了,都是引用的

三、函数调用

Platform_Init(NULL_PTR);
Can_43_FLEXCAN_Init(&Can_43_FLEXCAN_Config);
Can_43_FLEXCAN_SetControllerMode(Can_43_FLEXCANConf_CanController_CanController_0,
                                     CAN_CS_STARTED);
Can_43_FLEXCAN_SetControllerMode(Can_43_FLEXCANConf_CanController_CanController_1,
                                     CAN_CS_STARTED);
static Can_PduType Can_PduInfo;
Std_ReturnType     eRetVal = E_NOT_OK;
Can_PduInfo                = Can_CreatePduInfo(0U, 0U, 8U, Can_au8Sdu8bytes);
eRetVal     = Can_43_FLEXCAN_Write(Can_43_FLEXCANConf_CanHardwareObject_CanHardwareObject_2,
                               &Can_PduInfo);
eRetVal     = E_NOT_OK;
Can_PduInfo = Can_CreatePduInfo(12U | CAN_43_FLEXCAN_FD_FRAME_U32, 2U, 64U, Can_au64Sdu8bytes);
eRetVal     = Can_43_FLEXCAN_Write(Can_43_FLEXCANConf_CanHardwareObject_CanHardwareObject_4,
                                       &Can_PduInfo);

注意使用轮询的话需要带上

Can_43_FLEXCAN_MainFunction_Write_CanMainFunctionRWPeriods_4();
Can_43_FLEXCAN_MainFunction_Read_CanMainFunctionRWPeriods_3();

类似这两个函数,用来收发can数据

这款芯片无法自己写回调函数

只能使用下面这几个固定的函数

void CanIf_ControllerBusOff(uint8 ControllerId) { (void)ControllerId; }

void CanIf_ControllerModeIndication(uint8 ControllerId, Can_ControllerStateType ControllerMode)
{
    (void)ControllerId;
    (void)ControllerMode;
}
void CanIf_TxConfirmation(PduIdType CanTxPduId)
{
    CanIf_u8TxConfirmCnt++;
    CanIf_bTxFlag = TRUE;
    (void)CanTxPduId;
}

void CanIf_RxIndication(const Can_HwType *Mailbox, const PduInfoType *PduInfoPtr)
{
    CanIf_u8RxIndicationCnt++;
    CanIf_bRxFlag = TRUE;
    (void)Mailbox;
    (void)PduInfoPtr;
}

这几个函数存在于mcal静态代码的canif.c中

Q&A

一、邮箱、传统fifo、增强型fifo 说明

邮箱、传统FIFO、增强型FIFO.pdf

邮箱模式下

一个邮箱实际占用16字节

这是云途mcu里面的说明,8字节的头还有后面的数据,如果是8字节数据则就是16字节,这也是为什么邮箱模式往往不能使用dma的原因,数据在地址里面并不连续

传统RXFIFO下

当 FIFO 使能时,前 6+n 个邮箱被分配为接收 FIFO,接收 FIFO 包含接收消息队列和接收滤波器接收码。消息队列固定

占用 6 个消息邮箱。接收滤波器接收码数量通过寄存器位域 CTLR2[RFFN] 配置,故 FIFO 占用的消息邮箱的个数取决于

配置的接收滤波器接收码的个数。

滤波器接收码数量:

由该图则可以很简单的明白,传统FIFO和邮箱可以并存,并且邮箱剩余多少取决于FIFO中配置的过滤器的多少,同样过滤器的数量也是由最大限制的

CANFD模式下邮箱

CANFD 增强型FIFO

增强型FIFO的内存是另一片单独的空间

下面的ERFFEL则是配置过滤器的地方

二、FIFO模式的过滤规则

1.传统FIFO

td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
特性 格式 A (Format A) 格式 B (Format B) 格式 C (Format C)
每元素过滤数 1 个 ID 过滤条件 2 个 ID 过滤条件 4 个 ID 过滤条件
ID 比对位宽 全 29 位 (扩展帧) 或 11 位 (标准帧) 高 14 位 (扩展帧) 或 11 位 (标准帧) 高 8 位
适用场景 需要精确匹配完整 ID 需匹配ID 高 14 位,如过滤特定ID段 粗粒度过滤,如只关心ID的高8位
过滤粒度 最精细 中等 最粗略
最大过滤数 128 个 256 个 512 个

2.增强型FIFO

1、

2、

3、

(扩展帧则多占四个字节)

posted on 2026-08-19 19:55  li5920o  阅读(11)  评论(0)    收藏  举报

导航