关于CAN过滤器配置使用问题 | 已解决
首先是看到我们实验箱例程中的CAN滤波配置,备注是过滤只接收的ID,看到程序下面实际配置ACR,AMR和备注接收的ID怎么对应上去,看了参考资料是说在AMR位为1是不屏蔽位这个好理解,手册上说当AMR位为0时需要ACR位和接收ID位必须相同才可以接收,比如例程里的标准帧单滤波器只接收0x07fe,那么ACR不是也应该和这个接收ID的数据相同吗?这样当AMR位为0时ACR位才能与接收ID进行位对应啊!所以根据手册上是这么理解的,但我看demo例程配置却根本又不是那么回事儿,度了下stm32的配置图就很好理解而和我的想法也相同,如果我们手册中有这么简单明了的配置图就好了,不知道我理解错误在哪方面寻思许久百思不得其解,希望论坛高手给指导一下【新提醒】CAN 的 入门参考资料,第三方 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
经过认真研究了资料手册,确实大意了感谢神长老的回复,遇到困难还是多得看资料啊! 我的理解就是验收码和屏蔽码,屏蔽对应位为1时候,那么就忽略验收码,如果设置为0,那么就接收到ID这一位就要必须与验收码一致,通过这种组合可以实现过滤一定范围的ID。 STM32的匹配逻辑与STC32G好像是想反的, 现在有详细的 CAN 视频讲解了
视频教学:【CAN 总线原理及实战,8课时】,大学标准课程 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
结合最新的数据手册
我也研究半天,原来是有一位RTR给错位了 求教,头都快炸了。厂家例程什么问题都没有,但是自己配的双滤波怎么都不好用,发送指定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中断使能
} 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]