基于S32K144的canopen接收不同数量ID的实现方式

基于S32K144的canopen接收邮箱的几种方式主要有:

一.配置邮箱收取固定ID。

二.配置实现收取所有ID。

三.配置收取一个范围的ID。(最多127个)

一、接收固定ID:

我用的方法是不用Rx FIFO,所以没有勾选。邮箱设置32个,中断触发方式。设置如下: 

 初始化:

flexcan模块进行初始化,调用 FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);

配置:

接收邮箱的配置使用FLEXCAN_DRV_ConfigRxMb(INST_CANCOM1通道一,RX_MAILBOX邮箱号,&dataInfo报文规格信息,0x320接收报文ID)

配置完邮箱后,需要安装中断回调函数,使用的是FLEXCAN_DRV_InstallEventCallback(INST_CANCOM1通道一,flexcan0_Callback回调函数名称,NULL)

开启接收:

FLEXCAN_DRV_Receive(INST_CANCOM1通道一,RX_MAILBOX邮箱号,&recvBuff接收报文的存储buff)

recvBuff也就是结构体flexcan_msgbuff_t。

回调函数内容:

回调函数中可以根据项目需要执行一些想要的动作,最后都要再使用如下

FLEXCAN_DRV_Receive(INST_CANCOM1通道一,RX_MAILBOX邮箱号,&recvBuff接收报文的存储buff) 再次开启中断,实现连续收取报文功能。

二、接收所有ID

初始化同上

设置如下使用了FIFO方式:

代码部分:

这里要说的有几点:

1.fiterTable配置的是8个过滤器,每个过滤器预设ID为0x780。

2.生成ID过滤表如图FLEXCAN_DRV_ConfigRxFifo

3. 配置掩码类型,系统中可以选的有私有掩码和全局掩码。图中是私有掩码类型。

FLEXCAN_DRV_SetRxMaskType

4.设置接收全部ID的FIFO掩码FLEXCAN_DRV_SetRxFifoGlobalMask(接收所有ID使用,图中屏蔽是本人项目需要)

5.接收全部ID不需要使用FLEXCAN_DRV_SetRxIndividualMask

6.最后要调用FLEXCAN_DRV_RxFifo,中断回调函数同样要再使用一次,实现连续。

三、接收范围ID

初始化同上,设置同全部ID方式。

代码部分如全部ID方式。

与全部ID不同的地方是需要设置掩码内容:

使用原理举例:

Eg:FLEXCAN_DRV_SetRxIndividualMask(INST_CANCOM1, FLEXCAN_MSG_ID_STD, id_counter, 0xC0000000|0x7FF);

行为:向特定的通道写入掩码0xC0000000|0x7FF, ID为标准帧。

上边的0xC0000000|0x7FF掩码参数,传参进去之后是标准帧调用FLEXCAN_SetRxIndividualStdMask设置标准帧私有掩码

实现:(base->RXIMR[msgBuffIdx]) = (stdMask << CAN_ID_STD_SHIFT) & CAN_ID_STD_MASK;
CAN_ID_STD_SHIFT 宏为18
即0xC00007FF 左移18位=0x1FFC0000;
#define CAN_ID_STD_MASK 0x1FFC0000u
相与之后还是0x1FFC0000u
这个0x1FFC0000u二进制是 00011111111111000000000000000000
正好是19-29位 标准帧全部接受check
现在我们传入掩码0xC0000000|0x7FC
最后得到的值是0x1FF00000二进制是11111111100000000000000000000 少了19和20两个bit也就是说为0,也就不检测。如果来的是0x780ID的话掩码为0x7FC能通过掩码的ID为0x780~0x783 两个bit最多是3。

我的项目中需要收取ID范围是0x780~0x7FF,刚好是127个。掩码设置为0x780。

简单说0xC0000000|0x7FF掩码只能通过一个ID

0xC0000000|0x7FC掩码可以通过3个,0X780掩码可以通过127个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值