基于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个。