1.该芯片具有最多8个8位滤波器,可配置为2个32位滤波器 4个16位滤波器 8个8位滤波器。具体通过寄存器CANIDAC配置为不同模式
2.需要注意:
<1>滤波器为并行设计,也就是说任何通过某一滤波器的ID帧都会进入接收缓冲区,如果你想滤波就必须设置所以的滤波器,设置某一滤波器而不设置其他滤波器(全部通过)那么这样的滤波将是失败的
<2>设计滤波的ID需要还原为IDRn寄存器中的内容,因为IDRn寄存器中还包括RTR IDE等多种标志
3.实际演示:仅仅接收ID为0x11的帧
<1>将ID还原为IDR0 IDR1寄存器内容:IDR0 = 0x02 IDR1 = 0x02
<2>设置滤波模式IDAC 设置滤波IDAR IDMR的内容,其中IDMR中的位0代表需要匹配 1代表无需匹配 故IDAR0 = IDR0 IDAR1 = IDR1 IDMR0 = 0x00 IDMR1 = 0x3F
<3>使用CAN分析仪验证 仅有0x11的帧能够使CAN模块产生接收中断
4.源代码
/*滤波器是并行的 是或的关系 通过滤波的数据都将放入缓冲器中*/
// 设置滤波器工作模式
CAN0IDAC_IDAM = 1; //0-2个32位滤波器 1-4个16位滤波器 2-8个8位滤波器
// 启用所有滤波器 - 否则数据还是会通过关闭滤波的滤波器
CAN0IDMR0 = 0x00;
CAN0IDMR1 = 0x00;
CAN0IDMR2 = 0x00;
CAN0IDMR3 = 0x00;
CAN0IDMR4 = 0x00;
CAN0IDMR5 = 0x00;
CAN0IDMR6 = 0x00;
CAN0IDMR7 = 0x00;
// 设置接收寄存器与掩码寄存器(0为需要匹配)
CAN0IDAR0 = 0x02; //高位ID
CAN0IDAR1 = 0x02; //低位ID
CAN0IDMR0 = 0x00; //高位ID滤波
CAN0IDMR1 = 0x3F; //低位ID滤波 注意低5位不匹配 这些位是RTR IDE 和三位保留位
//以上设置仅仅接收0x11 ID的帧