基于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
| 特性 | 格式 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、
(扩展帧则多占四个字节)
浙公网安备 33010602011771号