small_yang 发表于 2023-6-27 15:33:55

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

本帖最后由 芯LYS 于 2023-8-16 11:15 编辑

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

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


void Can_Config(u8 baudrate)
{
    CAN_InitTypeDef init;

    // P0.0 和 P0.1 设置为准双向口
    P0_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1);
    CAN1_SW(CAN1_P00_P01);

    // CAN 控制器使能, 可选值: ENABLE, DISABLE
    init.CAN_Enable = ENABLE;

    // CAN 中断寄存器, 可选值:
    // CAN_DOIM, CAN_BEIM, CAN_TIM, CAN_RIM,
    // CAN_EPIM, CAN_EWIM, CAN_ALIM, CAN_ALLIM, DISABLE
    init.CAN_IMR = CAN_ALLIM;

    // 重新同步跳跃宽度, 可选值: 0~3
    init.CAN_SJW = 0;

    // 总线电平采样次数, 可选值:
    // 0=采样一次, 1=采样三次
    init.CAN_SAM = 0;

    // CAN 总线波特率: Fclk / ((1 + (TSG1 + 1) + (TSG2 + 1)) * (BRP + 1) * 2)
    // 250kHz = 32000000 / ((1 + 3 + 12) * 4 * 2)
    init.CAN_TSG1 = 12;
    init.CAN_TSG2 = 1;
    init.CAN_BRP = baudrate <= 125 ? 7 : 3;

    // 只接收 ID 为 0x280 ~ 0x2ff, 类型为标准帧的 CAN 报文
    // 11 位 CAN ID 的二进制范围为 01010000000 ~ 01011111111
    //
    //      ID.10 | ID.09 | ID.08 | ID.07 | ID.06 | ID.05 | ID. 4 | ID.03
    //    0   |   1   |   0   |   1   |   x   |   x   |   x   |   x(0x50)
    //    0   |   0   |   0   |   0   |   1   |   1   |   1   |   1(0x0f)
    //
    //      ID.02 | ID.01 | ID.00 |RTR|       |       |       |
    //    x   |   x   |   x   |   0   |   x   |   x   |   x   |   x(0x00)
    //    1   |   1   |   1   |   0   |   1   |   1   |   1   |   1(0xef)
    init.CAN_ACR0 = 0x50;
    init.CAN_ACR1 = 0x00;
    init.CAN_ACR2 = 0x00;
    init.CAN_ACR3 = 0x00;
    init.CAN_AMR0 = 0x0f;
    init.CAN_AMR1 = 0xef;
    init.CAN_AMR2 = 0xff;
    init.CAN_AMR3 = 0xff;

    // CAN1 初始化
    CAN_Inilize(CAN1, &init);
    NVIC_CAN_Init(CAN1, ENABLE, Priority_1);
} // Can_Config(u8)但实际运行的时候,发现滤波器并没有生效,其余 ID 的标准帧也能被接收。这是什么问题呢,有大佬知道吗?非常感谢!

zhp 发表于 2023-6-27 16:27:31

CAN的MR寄存器的bit0(AFM)你有设置吗
lib里面默认是设置为0,即双滤波设置
你的代码使用的是单滤波

乘风飞扬 发表于 2023-6-28 19:51:27

确实是滤波类型没有设置为单滤波模式。
之前的库函数没有设置滤波模式,默认是双滤波模式。
附件例程已添加了滤波模式设置,请参考。

small_yang 发表于 2023-6-29 11:12:08

明白了,谢谢!我再去试试。

牢星运 发表于 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的位置顺序错了?
页: [1]
查看完整版本: 请问一个关于 CAN 滤波器的问题。已解决。