K60 CAN 过滤设置
【摘要】
如何只接收特定ID的CAN帧呢?
设置CANx_RXIMRn, 这是一个31bit的寄存器, 格式按照这个设置。 0表示不care 1表示care
void CAN_SetRxFi...
如何只接收特定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位
文章来源: blog.csdn.net,作者:TopSemic嵌入式,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/wangwenxue1989/article/details/53117568
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)