找回密码
 立即注册
查看: 1076|回复: 4

请问一个关于 CAN 滤波器的问题。已解决。

[复制链接]

1

主题

1

回帖

23

积分

新手上路

积分
23
发表于 2023-6-27 15:33:55 | 显示全部楼层 |阅读模式
本帖最后由 芯LYS 于 2023-8-16 11:15 编辑

怎样设置滤波器,使得程序只接收 ID 为 0x280 ~ 0x2ff 的标准帧报文呢?

我尝试着按照手册上的指引,在初始化 CAN 的时候写了下面这段代码:


  1. void Can_Config(u8 baudrate)
  2. {
  3.     CAN_InitTypeDef init;
  4.     // P0.0 和 P0.1 设置为准双向口
  5.     P0_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1);
  6.     CAN1_SW(CAN1_P00_P01);
  7.     // CAN 控制器使能, 可选值: ENABLE, DISABLE
  8.     init.CAN_Enable = ENABLE;
  9.     // CAN 中断寄存器, 可选值:
  10.     // CAN_DOIM, CAN_BEIM, CAN_TIM, CAN_RIM,
  11.     // CAN_EPIM, CAN_EWIM, CAN_ALIM, CAN_ALLIM, DISABLE
  12.     init.CAN_IMR = CAN_ALLIM;
  13.     // 重新同步跳跃宽度, 可选值: 0~3
  14.     init.CAN_SJW = 0;
  15.     // 总线电平采样次数, 可选值:
  16.     // 0=采样一次, 1=采样三次
  17.     init.CAN_SAM = 0;
  18.     // CAN 总线波特率: Fclk / ((1 + (TSG1 + 1) + (TSG2 + 1)) * (BRP + 1) * 2)
  19.     // 250kHz = 32000000 / ((1 + 3 + 12) * 4 * 2)
  20.     init.CAN_TSG1 = 12;
  21.     init.CAN_TSG2 = 1;
  22.     init.CAN_BRP = baudrate <= 125 ? 7 : 3;
  23.     // 只接收 ID 为 0x280 ~ 0x2ff, 类型为标准帧的 CAN 报文
  24.     // 11 位 CAN ID 的二进制范围为 01010000000 ~ 01011111111
  25.     //
  26.     //        ID.10 | ID.09 | ID.08 | ID.07 | ID.06 | ID.05 | ID. 4 | ID.03
  27.     // [ACR0]   0   |   1   |   0   |   1   |   x   |   x   |   x   |   x  (0x50)
  28.     // [AMR0]   0   |   0   |   0   |   0   |   1   |   1   |   1   |   1  (0x0f)
  29.     //
  30.     //        ID.02 | ID.01 | ID.00 |  RTR  |       |       |       |
  31.     // [ACR1]   x   |   x   |   x   |   0   |   x   |   x   |   x   |   x  (0x00)
  32.     // [AMR1]   1   |   1   |   1   |   0   |   1   |   1   |   1   |   1  (0xef)
  33.     init.CAN_ACR0 = 0x50;
  34.     init.CAN_ACR1 = 0x00;
  35.     init.CAN_ACR2 = 0x00;
  36.     init.CAN_ACR3 = 0x00;
  37.     init.CAN_AMR0 = 0x0f;
  38.     init.CAN_AMR1 = 0xef;
  39.     init.CAN_AMR2 = 0xff;
  40.     init.CAN_AMR3 = 0xff;
  41.     // CAN1 初始化
  42.     CAN_Inilize(CAN1, &init);
  43.     NVIC_CAN_Init(CAN1, ENABLE, Priority_1);
  44. } // Can_Config(u8)
复制代码
但实际运行的时候,发现滤波器并没有生效,其余 ID 的标准帧也能被接收。这是什么问题呢,有大佬知道吗?非常感谢!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2023-6-27 16:27:31 | 显示全部楼层
CAN的MR寄存器的bit0(AFM)你有设置吗
lib里面默认是设置为0,即双滤波设置
你的代码使用的是单滤波
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-6-28 19:51:27 | 显示全部楼层
确实是滤波类型没有设置为单滤波模式。
之前的库函数没有设置滤波模式,默认是双滤波模式。
附件例程已添加了滤波模式设置,请参考。

27-CAN总线接口数据收发程序.zip

43.62 KB, 下载次数: 181

回复 支持 反对

使用道具 举报 送花

1

主题

1

回帖

23

积分

新手上路

积分
23
发表于 2023-6-29 11:12:08 | 显示全部楼层
明白了,谢谢!我再去试试。
回复 支持 反对

使用道具 举报 送花

已绑定手机

3

主题

5

回帖

24

积分

新手上路

积分
24
发表于 2024-11-5 10:46:19 | 显示全部楼层
我也是滤波的问题,我设置的是扩展帧的单滤波器,设置完就什么消息都接收不到,AFM位也置1了。我要求能通过的ID是0x1828D0E0,AMR、ACR设置如下:
                CAN_write_reg(MR ,0x01);        //退出Reset Mode,设置为单滤波器
                CAN_write_reg(ACR0,0x18);        //总线验收代码寄存器
                CAN_write_reg(ACR1,0x28);       
                CAN_write_reg(ACR2,0xD0);       
                CAN_write_reg(ACR3,0xE0);       
                CAN_write_reg(AMR0,0x00);        //总线验收屏蔽寄存器
                CAN_write_reg(AMR1,0x00);
                CAN_write_reg(AMR2,0x00);
                CAN_write_reg(AMR3,0x07);
是我哪里搞错了吗,比如CAN ID的位置顺序错了?
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:29 , Processed in 0.120531 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表