stcstc 发表于 2023-7-25 09:02:31

关于CAN过滤器配置使用问题 | 已解决

首先是看到我们实验箱例程中的CAN滤波配置,备注是过滤只接收的ID,看到程序下面实际配置ACR,AMR和备注接收的ID怎么对应上去,看了参考资料是说在AMR位为1是不屏蔽位这个好理解,手册上说当AMR位为0时需要ACR位和接收ID位必须相同才可以接收,比如例程里的标准帧单滤波器只接收0x07fe,那么ACR不是也应该和这个接收ID的数据相同吗?这样当AMR位为0时ACR位才能与接收ID进行位对应啊!所以根据手册上是这么理解的,但我看demo例程配置却根本又不是那么回事儿,度了下stm32的配置图就很好理解而和我的想法也相同,如果我们手册中有这么简单明了的配置图就好了,不知道我理解错误在哪方面寻思许久百思不得其解,希望论坛高手给指导一下

神农鼎 发表于 2023-7-25 11:17:17



【新提醒】CAN 的 入门参考资料,第三方 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

stcstc 发表于 2023-7-25 16:18:47

经过认真研究了资料手册,确实大意了感谢神长老的回复,遇到困难还是多得看资料啊!

peterwangjp 发表于 2024-2-18 21:32:45

我的理解就是验收码和屏蔽码,屏蔽对应位为1时候,那么就忽略验收码,如果设置为0,那么就接收到ID这一位就要必须与验收码一致,通过这种组合可以实现过滤一定范围的ID。

peterwangjp 发表于 2024-2-18 21:35:18

STM32的匹配逻辑与STC32G好像是想反的,

神农鼎 发表于 2024-2-18 21:38:29

现在有详细的 CAN 视频讲解了





视频教学:【CAN 总线原理及实战,8课时】,大学标准课程 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

神农鼎 发表于 2024-2-18 21:40:11

结合最新的数据手册







sun65886566 发表于 2024-2-22 14:02:42

我也研究半天,原来是有一位RTR给错位了

eqpwljxz 发表于 2025-10-6 16:41:53

求教,头都快炸了。厂家例程什么问题都没有,但是自己配的双滤波怎么都不好用,发送指定ID的消息就是没反应。求帮忙看看我哪里写的不对。我只想接收2D0和2D2的ID
void CANInit(void)
{
        P_SW2 |= 0x80;                            //将EAXFR位置1,以访问在XDATA区域的扩展SFR

        //-------- CAN2 --------
        CANEN = 1;          //CAN1模块使能
        CANSEL = 0;         //选择CAN1模块
        P_SW1 = (P_SW1 & ~0x30) | 0x10;                //CAN1: CANRX(P5.0), CANTX(P5.1)


        CanWriteReg(MR,0x04);                //使能 Reset Mode
        CANSetBaudrate();                                        //设置波特率

        // 滤波器:接收ID=0x2D0和2D2
        CanWriteReg(ACR0, 0xD2);   
        CanWriteReg(ACR1, 0x02);   
        CanWriteReg(ACR2, 0xD0);   
        CanWriteReg(ACR3, 0x02);   
        CanWriteReg(AMR0, 0x00);   
        CanWriteReg(AMR1, 0x0F);   
        CanWriteReg(AMR2, 0x00);   
        CanWriteReg(AMR3, 0x0F);   
               

        CanWriteReg(IMR ,0xff);                //中断寄存器
        CanWriteReg(ISR ,0xff);                //清中断标志
        CanWriteReg(MR,0x00);                //退出 Reset Mode   00
        CANICR |= 0x02;                                                //CAN1中断使能
}

乘风飞扬 发表于 7 天前

eqpwljxz 发表于 2025-10-6 16:41
求教,头都快炸了。厂家例程什么问题都没有,但是自己配的双滤波怎么都不好用,发送指定ID的消息就是没反应 ...

屏蔽验收代码寄存器参考例子设置:

CanWriteReg(MR,0x04);                //使能 Reset Mode
        CANSetBaudrate();        //设置波特率
       
        CanWriteReg(ACR0,0x5A);                //总线验收代码寄存器
        CanWriteReg(ACR1,0x00);
        CanWriteReg(ACR2,0x5A);
        CanWriteReg(ACR3,0x40);
        CanWriteReg(AMR0,0x00);                //总线验收屏蔽寄存器
        CanWriteReg(AMR1,0x0F);
        CanWriteReg(AMR2,0x00);
        CanWriteReg(AMR3,0x0F);

        CanWriteReg(IMR ,0xff);                //中断寄存器
        CanWriteReg(ISR ,0xff);                //清中断标志
        CanWriteReg(MR,0x00);                //退出 Reset Mode, 双滤波模式
        CANICR = 0x02;                                //CAN中断使能AMRx寄存器相关位置0,无关位置1。
ACRx寄存器相关位设置需要接收的ID值,无关位随便设(例子置0)。

测试结果,CAN1只接收ID=0x2D0与0x2D2的报文:

页: [1]
查看完整版本: 关于CAN过滤器配置使用问题 | 已解决