K60 CAN 过滤设置

如何只接收特定ID的CAN帧呢?
这里写图片描述

这里写图片描述

设置CANx_RXIMRn,
这是一个31bit的寄存器,
这里写图片描述
格式按照这个设置。
0表示不care
1表示care

void CAN_SetRxFilterMask(uint32_t instance, uint32_t mb, uint32_t mask)
{
    CANBase[instance]->MCR |= (CAN_MCR_FRZ_MASK | CAN_MCR_HALT_MASK);
    while(!(CAN_MCR_FRZACK_MASK & (CANBase[instance]->MCR))) {}; 
    if(mask > 0x7FF)
    {    
      //  CANBase[instance]->RXIMR[mb] = CAN_ID_EXT(mask); 

             CANBase[instance]->RXIMR[mb] =(((uint32_t)(((uint32_t)(mask))<<CAN_ID_EXT_SHIFT))&(CAN_ID_EXT_MASK|CAN_ID_STD_MASK ));

    }
    else
    {
        //CANBase[instance]->RXIMR[mb] = CAN_ID_STD(mask); 

             CANBase[instance]->RXIMR[mb] = (((uint32_t)(((uint32_t)(mask))<<CAN_ID_STD_SHIFT))&CAN_ID_STD_MASK);
    }

    CANBase[instance]->MCR &= ~(CAN_MCR_FRZ_MASK | CAN_MCR_HALT_MASK);
    while((CAN_MCR_FRZACK_MASK & (CANBase[instance]->MCR)));
}

/* ID Bit Fields */
#define CAN_ID_EXT_MASK                          0x3FFFFu
#define CAN_ID_EXT_SHIFT                         0
#define CAN_ID_EXT(x)                            (((uint32_t)(((uint32_t)(x))<<CAN_ID_EXT_SHIFT))&CAN_ID_EXT_MASK)
#define CAN_ID_STD_MASK                          0x1FFC0000u
#define CAN_ID_STD_SHIFT                         18
#define CAN_ID_STD(x)                            (((uint32_t)(((uint32_t)(x))<<CAN_ID_STD_SHIFT))&CAN_ID_STD_MASK)
#define CAN_ID_PRIO_MASK                         0xE0000000u
#define CAN_ID_PRIO_SHIFT                        29
#define CAN_ID_PRIO(x)                           (((uint32_t)(((uint32_t)(x))<<CAN_ID_PRIO_SHIFT))&CAN_ID_PRIO_MAS

设置的时候调用:

CAN_SetRxFilterMask(HW_CAN1,3,0x7FF);// wenxue  标准帧11bits 
111 1111 1111

或者

 CAN_SetRxFilterMask(HW_CAN1,3,0x1FFFFFF);// wenxue  扩展帧 29 bits  1 1111 1111 1111 1111 1111 1111 1111

CAN 扩展帧ID为29位,标准帧为11位

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值