NXP S32K144W FLEXCAN SDK 的使用

本文介绍了如何使用NXPS32K144WFLEXCAN的SDK进行CAN通信,包括初始化CAN模块、分配收发邮箱、设置硬件过滤以及实现接收队列。在基本的收发通信中,详细阐述了邮箱的申请和配置,以及收发报文的函数调用。硬件过滤通过设置邮箱ID和掩码实现。接收队列则通过申请多个ID相同的邮箱来实现报文的有序接收。
摘要由CSDN通过智能技术生成

NXP S32K144W FLEXCAN SDK 的使用

这篇博文可以应对的场景:
1.实现基本的收发通信。
2.实现硬件过滤报文。
3.实现消息接收队列。

一. 实现基本的收发通信

常规流程:使能CAN模块时钟 -> 使能CAN模块对应引脚 -> 初始化CAN模块 -> 分配收发邮箱
  1. 使能CAN模块时钟
    在S32 DS 配置时钟页面,使能FLEXCAN模块时钟

  2. 使能CAN模块对应引脚
    在这里插入图片描述

  3. 初始化CAN模块
    CAN_Init(&can_pal1_instance, &can_pal1_Config0)
    can_pal1_instance和can_pal1_Config0在外设组件配置界面配置完成后自动生成。

  4. 分配收发邮箱
    上面3步配置完成后,FLEXCAN就可以开始用了,现在的问题是具体怎么用?
    首先我们需要向FLEXCAN模块申请收发报文需要用到的邮箱,NXP的每个CAN模块都有自己的邮箱系统,按照使用手册说明,邮箱系统的地址为CAN模块基地址+偏移地址;整个邮箱系统大小固定,比如32K,每个邮箱头部大小为14BYTE,申请邮箱中负载的大小决定了邮箱的大小;可以申请128个负载为8BYTE的邮箱,或者64个负载为16BYTE的邮箱。
    (注:按照手册所说,每个CAN模块应该有自己独立的邮箱系统,但是我在测试的时候两个模块同时申请编号为1的邮箱时,两个模块的1号邮箱都为同一内存。)
    现申请一个标准帧发送邮箱和一个扩展帧接收邮箱,负载均为8BYTE。

can_buff_config_t buffCfg 0=  {
     .enableFD = true,
     .enableBRS = true,
     .fdPadding = 0U,
     .idType = CAN_MSG_ID_STD,
     .isRemote = false
 };
CAN_ConfigRxBuff(&can_pal1_instance, RX_MAILBOX, &buffCfg0, RX_MSG_ID);

can_buff_config_t buffCfg1 =  {
     .enableFD = true,
     .enableBRS = true,
     .fdPadding = 0U,
     .idType = CAN_MSG_ID_STD,
     .isRemote = false
 };
 CAN_ConfigTxBuff(&can_pal1_instance, TX_MAILBOX, &buffCfg1);

(注:如果要移植代码,这里buffCfg0和buffCfg1必须放入静态存储区,不能放入栈区;因为SDK在保存配置的时候保存的是配置参数的地址指针 )
5. 开始收发报文

  • 注册接收回调函数:CAN_InstallEventCallback();
  • 开启接收:CAN_ConfigRxBuff(&can_pal1_instance, RX_MAILBOX, &buffCfg, RX_MSG_ID);
    每次开启接收都会指定邮箱,未申请的邮箱或者申请为发送的邮箱,都不能开启接收。
    每次开启后,仅接收一帧报文,接收完成后,邮箱标志位将被修改,需将邮箱标志位置位才能继续接收。邮箱标志位置位可以使用重新开启接收的方法启用邮箱,CAN_ConfigRxBuff();`我将这个操作放在了接收回调函数中。(SDK里其它方法好像都被屏蔽了,我只找到这一个重新启用邮箱接收的接口)。
  1. 发送报文
  • 非阻塞发送:CAN_Send();
  • 阻塞式发送:CAN_SendBlocking();

二. 实现硬件过滤报文

  • 硬件过滤设置的地方有两处:一是每个邮箱可以在分配的时候设置接收或发送ID,二是对邮箱设置的ID加上掩码。比如设置ID为0x18FF1234的邮箱,如果掩码设置为0xFFFF0000,那么这个邮箱可以接收ID为0x18FF****的所有报文。掩码默认为0xFFFFFFFF。
  • 需要注意的是:NXP的邮箱系统中,如果启用FIFO,编号靠前的邮箱的内存将被FIFO使用;所以这里的FIFO与邮箱是独立并列存在的,不存在报文相互传递与交互。
  • 掩码设置按照有无FIFO,有无队列区别不同设置方式,大致分类如下图:
    在这里插入图片描述
  • 接口:CAN_SetRxFilter();

三. 实现接收队列

设置队列方法:申请几个接收ID相同的邮箱就可以了。NXP会将接收的报文缓存下来,然后依次和空闲且已分配的邮箱进行ID匹配,匹配成功则将报文缓存到匹配邮箱;如果多申请几个邮箱,都可以接收这个ID的报文,那么当遍历到已经存放数据的邮箱时,会自动跳过去匹配下一个邮箱,这样就能把报文依次存放在分配的多个邮箱中,通过查看邮箱时间戳,即可知道报文被接收的先后顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值