找回密码
 立即注册
查看: 546|回复: 3

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

[复制链接]

该用户从未签到

1

主题

1

回帖

19

积分

新手上路

积分
19
发表于 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 的标准帧也能被接收。这是什么问题呢,有大佬知道吗?非常感谢!
回复 送花

使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    719

    回帖

    2562

    积分

    超级版主

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

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 140 天

    [LV.7]常住居民III

    26

    主题

    1335

    回帖

    4155

    积分

    论坛元老

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

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

    43.62 KB, 下载次数: 94

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    1

    回帖

    19

    积分

    新手上路

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-14 18:15 , Processed in 0.062182 second(s), 43 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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