由于拓展帧ID为29位,所以滤波器模式IDAC需设置为32位滤波器,这时我们只有两个滤波器可供使用了,如何同时过滤标准帧和拓展帧呢?
其实可以使用一组32位滤波器滤除拓展帧,另一组32位滤波器滤除标准帧;这里只需要明白滤波器过滤的并不是ID而是IDR寄存器中的内容即可,对于拓展帧ID存放在IDR0-3寄存器中,对于标准帧ID存放于IDR0-1寄存器中,具体可见芯片寄存器手册,里面还有其他如IDE RTR等标识位 我们常常不需要关注 设置MR寄存器对应位为1不比较即可
下面代码实现了只允许拓展帧0x0C07XXD0通过 和 标准帧0x3XX通过,大家可以对照分析
// 设置滤波器工作模式
CAN0IDAC_IDAM = 0; //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 = 0x60;
CAN0IDAR1 = 0x3F;
CAN0IDAR2 = 0xFF;
CAN0IDAR3 = 0xA0;
CAN0IDMR0 = 0x00;
CAN0IDMR1 = 0x19;
CAN0IDMR2 = 0xFE;
CAN0IDMR3 = 0x00;
//以上设置接收0x0C07XXD0的帧
CAN0IDAR4 = 0x60;
CAN0IDAR5 = 0x00;
CAN0IDAR6 = 0x00;
CAN0IDAR7 = 0x00;
CAN0IDMR4 = 0x1F;
CAN0IDMR5 = 0xFF;
CAN0IDMR6 = 0xFF;
CAN0IDMR7 = 0xFF;
//以上设置接收0x300-0X400的帧