|
发表于 2023-4-4 20:21:53
|
显示全部楼层
期待期待。硬汉哥。最近在整CAN的时候,发现掩码模式下,过滤的不是那么干净。这个是掩码模式的特征决定了,还是与算法有关系呢?这一块可以深入讲解下么。还有就是实际项目中,如何使用掩码模式比较稳妥。如下配置:设定7E0 ~ 7E9 。实测7EA~7EF没有过滤掉,也会进来。
uint16_t StdIdArray[10] ={0x7e0,0x7e1,0x7e2,0x7e3,0x7e4,
0x7e5,0x7e6,0x7e7,0x7e8,0x7e9}; //定义一组标准CAN ID
uint16_t mask,num,tmp,i;
CAN_FilterStruct.FilterBank = 2; //使用过滤器2
CAN_FilterStruct.FilterMode = CAN_FILTERMODE_IDMASK; //配置为掩码模式
CAN_FilterStruct.FilterScale = CAN_FILTERSCALE_32BIT; //设置为32位宽
CAN_FilterStruct.FilterIdHigh =(StdIdArray[0]<<5); //验证码可以设置为StdIdArray[]数组中任意一个,这里使用StdIdArray[0]作为验证码
CAN_FilterStruct.FilterIdLow =0;
mask =0x7ff; //下面开始计算屏蔽码
num =sizeof(StdIdArray)/sizeof(StdIdArray[0]);
for(i =0; i<num; i++) //屏蔽码位StdIdArray[]数组中所有成员的同或结果
{
tmp =StdIdArray ^ (~StdIdArray[0]); //所有数组成员与第0个成员进行同或操作
mask &=tmp;
}
CAN_FilterStruct.FilterMaskIdHigh =(mask<<5);
CAN_FilterStruct.FilterMaskIdLow =0|0x02; //只接收数据帧
CAN_FilterStruct.FilterFIFOAssignment = 0;
CAN_FilterStruct.FilterActivation = ENABLE;
CAN_FilterStruct.FilterBank = 14;
|
|