文章目录
- 前言
- 配置MCAL CAN
- CAN Controller
- 配置CAN FD波特率
- 配置Ram block
- 关于MailBox
- 代码中使用CAN FD报文发送和接收
- CAN FD报文接收
- CAN FD报文发送
- 总结
前言
在之前的文章中,介绍了标准CAN的MCAL配置,在此基础上,扩展为CAN-FD就会容易很多了。最近项目调试需要用到CAN-FD,下面介绍基于S32K324芯片,EB配置CAN FD,及在代码中如何发送和接收CAN FD报文(非Autosar软件)
配置MCAL CAN
对于之前已经配置好的标准CAN模块,扩展为CAN FD只需要配置如下即可
CAN Controller
勾选支持CAN FD ISO
配置CAN FD波特率
CAN Baudrate Type Suport选择为ENHANCE_CBT
配置CAN FD波特率,此处波特率为2M,CNA BUS时钟为16M,计算公式为 16/1/(1+1+4+2)=2M
注意配置项CAN FD Prescaler一定要打开,如果是灰色的话会有问题。
配置Ram block
使能CanRamBlock,选择PATLOAD为64
关于MailBox
对于MailBox来说,没有关于CAN FD的配置,只有标准帧还是扩展帧的选择,过滤器也不能配置关于CAN FD的位,也就是说过滤器不能过滤CAN还是CAN FD报文,所以实际使用时,需要在上层判断是CAN message还是CAN FD message
代码中使用CAN FD报文发送和接收
CAN FD报文接收
对于接收报文,需要判断接收到的ID的CAN FD指示位是否为1,在S32K324的MCAL中定义如下:
#define CAN_FD_FRAME_U32 ((uint32)0x40000000U)
例如,当接收到的报文为0x11时,实际传到callback函数中的ID值为0x40000011,当接收到该值时,即可开始处理接收到的数据
需要注意的是,如果是扩展帧报文,还需要加入扩展帧位的,和CAN FD位同理,定义如下:
#define CAN_EXTENDED_ID_U32 ((uint32)0x80000000U)
CAN FD报文发送
发送报文和接收类似,在发送之前,将CAN FD位加入即可
Can_PduType CanFD_CreatePduInfo(Can_IdType id, PduIdType swPduHandle, uint8 length, uint8* sdu)
{
Can_PduType PduInfo;
PduInfo.id = id | CAN_FD_FRAME_U32;
PduInfo.swPduHandle = swPduHandle;
PduInfo.length = length;
PduInfo.sdu = sdu;
return PduInfo;
}
总结
现在越来越多的车辆使用了CAN FD,从CAN到CAN FD的扩展也是必然的趋势了。对于S32K324来说,从CAN到CAN FD还是非常方便的。