硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2963|回复: 9
收起左侧

[CAN/FDCAN] canfd过滤器配置后不起作用

[复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2024-3-20 17:46:16 | 显示全部楼层 |阅读模式
本帖最后由 fendoushuai 于 2024-3-20 17:55 编辑

大家好,在配置stm32h7的can过滤器时,发现总是不起作用:
我的配置是使用CANFD发送CAN2.0扩展报文,设置了扩展报文的滤波器,
滤波器匹配后保存到RX FIFO 0,开启了RXFIFO0的阈值中断,
过滤使用屏蔽位模式,ID2设置的是0x1FFFFFFF,所以应该是只有ID1的报文才能接收

但是设置完滤波器后,在发送其他ID的报文时依然会进入RXFIFO0中断,不知道是不是里面哪个地方配置错了,
麻烦各位帮忙看下,谢谢


[C] 纯文本查看 复制代码
void BSP_vInitCan1(void)
{
Can_Init1.hfdcan.Instance = FDCAN1;                         /* 配置FDCAN1 */             
        Can_Init1.hfdcan.Init.FrameFormat = FDCAN_FRAME_CLASSIC;    /* 配置使用CAN2.0 */  
        Can_Init1.hfdcan.Init.Mode = FDCAN_MODE_NORMAL;             /* 配置使用正常模式 */ 
        Can_Init1.hfdcan.Init.AutoRetransmission = ENABLE;          /* 使能自动重发 */ 
        Can_Init1.hfdcan.Init.TransmitPause = DISABLE;              /* 配置禁止传输暂停特性 */
        Can_Init1.hfdcan.Init.ProtocolException = ENABLE;           /* 协议异常处理使能 */

        Can_Init1.hfdcan.Init.NominalPrescaler = 1;           /* CAN时钟分配设置,一般设置为1即可,tq = NominalPrescaler x (1/ fdcan_ker_ck), 范围1-512 */
        Can_Init1.hfdcan.Init.NominalSyncJumpWidth = 8;
        Can_Init1.hfdcan.Init.NominalTimeSeg1 = 128;           /* Seg1是两个参数之和,对应位时间特性图的 Pro_Seg + Phase_Seg1,范围2-256 */
        Can_Init1.hfdcan.Init.NominalTimeSeg2 = 31;      /* 对应Phase_Seg2,范围2- 128 */
        Can_Init1.hfdcan.Init.DataPrescaler = 0x01;      /* CAN时钟分配设置,一般设置为1即可,tq = NominalPrescaler x (1/ fdcan_ker_ck),范围1-32 */
        Can_Init1.hfdcan.Init.DataSyncJumpWidth = 0x01;  /* 用于动态调节Phase_Seg1和 Phase_Seg2,范围1-16 */
        Can_Init1.hfdcan.Init.DataTimeSeg1 = 0x01;                 /* Seg1是两个参数之和,对应位时间特性图的 Pro_Seg + Phase_Seg1,范围 */
        Can_Init1.hfdcan.Init.DataTimeSeg2 = 0x01;       /* 对应位时间特性图的 Phase_Seg2 */  

        Can_Init1.hfdcan.Init.MessageRAMOffset = 0;                              /* CAN1和CAN2共享2560个字, 这里CAN1分配前1280字 */
        Can_Init1.hfdcan.Init.StdFiltersNbr = 1;                                 /* 设置标准ID过滤器个数,范围0-128 */       
        Can_Init1.hfdcan.Init.ExtFiltersNbr = 1;                                 /* 设置扩展ID过滤器个数,范围0-64 */   
        Can_Init1.hfdcan.Init.RxFifo0ElmtsNbr = 64;                   /* 设置Rx FIFO0的元素个数,范围0-64 */  
        Can_Init1.hfdcan.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;         /* 设置Rx FIFO0中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */   
        Can_Init1.hfdcan.Init.RxFifo1ElmtsNbr = 0;                   /* 设置Rx FIFO1的元素个数,范围0-64 */
        Can_Init1.hfdcan.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;  /* 设置Rx FIFO1中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */        
        Can_Init1.hfdcan.Init.RxBuffersNbr = 0;                      /* 设置Rx Buffer个数,范围0-64 */
        Can_Init1.hfdcan.Init.RxBufferSize = FDCAN_DATA_BYTES_8;     /* 设置Rx Buffer中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */        

        Can_Init1.hfdcan.Init.TxEventsNbr = 0;                                                        /* 设置Tx Event FIFO中元素个数,范围0-32 */        
        Can_Init1.hfdcan.Init.TxBuffersNbr = 0;                                                        /* 设置Tx Buffer中元素个数,范围0-32 */
        Can_Init1.hfdcan.Init.TxFifoQueueElmtsNbr = 32;                   /* 设置用于Tx FIFO/Queue的Tx Buffers个数。范围0到32 */
        Can_Init1.hfdcan.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; /* 设置FIFO模式或者QUEUE队列模式 */
        Can_Init1.hfdcan.Init.TxElmtSize = FDCAN_DATA_BYTES_8;           /* 设置Tx Element中的数据域大小,支持8,12,16,20,24,32,48或者64字节 */
        HAL_FDCAN_Init(&Can_Init1.hfdcan);


        Can_Init1.sFilterConfig.IdType = FDCAN_EXTENDED_ID;              /* 扩展ID */
        Can_Init1.sFilterConfig.FilterIndex = 0;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
        Can_Init1.sFilterConfig.FilterType = FDCAN_FILTER_MASK;          /* 过滤器采样屏蔽位模式 --------------*/
        Can_Init1.sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;  /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
        Can_Init1.sFilterConfig.FilterID1 = 0x12345681;                  /* 屏蔽位模式下,FilterID1是消息ID */
        Can_Init1.sFilterConfig.FilterID2 = 0x1FFFFFFF;                                         /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
        HAL_FDCAN_ConfigFilter(&Can_Init1.hfdcan, &Can_Init1.sFilterConfig);      /* 配置过滤器 */

/* CAN receive data in interrupts*/

                /* 设置Rx FIFO0的阈值为1 ---------------------------------------*/
                HAL_FDCAN_ConfigFifoWatermark(&Can_Init1.hfdcan, FDCAN_CFG_RX_FIFO0, 1);

                /* 开启RX FIFO0的阈值中断 */
                HAL_FDCAN_ActivateNotification(&Can_Init1.hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);

        /* 启动FDCAN */
        HAL_FDCAN_Start(&Can_Init1.hfdcan);        
}



*********************************************************************************************************
*        函 数 名: HAL_FDCAN_RxFifo0Callback
*        功能说明: Rx FIFO0回调函数
*        形    参: hfdcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
        if (hfdcan == &Can_Init1.hfdcan)
        {
                if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
                {
                        /* 从RX FIFO0读取数据 */
                        HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &Can_Init1.g_CanRxHeader, Can_Init1.g_CanRxData);

                        /* 重新使能RX FIFO0阈值中断 */
                        HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);

                }
        }
}




回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2024-3-21 08:54:47 | 显示全部楼层
本帖最后由 fendoushuai 于 2024-3-21 09:17 编辑

之前配置中没有加HAL_FDCAN_ConfigGlobalFilter配置,配置以后就好了。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121123
QQ
发表于 2024-3-22 08:49:01 | 显示全部楼层
fendoushuai 发表于 2024-3-21 08:54
之前配置中没有加HAL_FDCAN_ConfigGlobalFilter配置,配置以后就好了。

对,这个函数比较重要,否则配置的过滤不起作用。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-3-27 14:49:22 | 显示全部楼层
我今天也遇到这个问题了,还是硬汉组织好!
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-3-27 14:49:50 | 显示全部楼层
感谢指点!
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-7-4 09:46:57 | 显示全部楼层
fendoushuai 发表于 2024-3-21 08:54
之前配置中没有加HAL_FDCAN_ConfigGlobalFilter配置,配置以后就好了。

为什么我配置全局过滤器,结果什么消息都没有了
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121123
QQ
发表于 2025-7-5 09:19:07 | 显示全部楼层
cfh763551832 发表于 2025-7-4 09:46
为什么我配置全局过滤器,结果什么消息都没有了

参考此贴楼主末尾例子的配置。

BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲,图文并茂,配合综合实战演练(2023-05-15)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=119189
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-10-15 09:32:10 | 显示全部楼层
eric2013 发表于 2025-7-5 09:19
参考此贴楼主末尾例子的配置。

BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲, ...

好,感谢                              
回复

使用道具 举报

15

主题

55

回帖

100

积分

初级会员

积分
100
发表于 2026-1-29 19:25:41 | 显示全部楼层
本帖最后由 walk 于 2026-1-29 23:22 编辑

stm32h7  canfd配置如下,调用函数HAL_FDCAN_ConfigGlobalFilter就收不到can信息,注释就可以,过滤器是范围过来,共4个范围端,分别映射到FIFO0和FIFO1,好像默认消息是到FIFO0

void MX_FDCAN1_Init(void)
{
  /* USER CODE BEGIN FDCAN1_Init 0 */
       
  /* USER CODE END FDCAN1_Init 0 */

  /* USER CODE BEGIN FDCAN1_Init 1 */
        /* 第1步:基础配置 ==================================================================================*/
  /* USER CODE END FDCAN1_Init 1 */
  hfdcan1.Instance = FDCAN1;                                        /* 配置FDCAN1 */
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;/* 配置使用FDCAN可变波特率 */
  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;                /* 配置使用正常模式 */
  hfdcan1.Init.AutoRetransmission = ENABLE;                /* 使能自动重传!传统模式下一定要关闭!!! */
  hfdcan1.Init.TransmitPause = DISABLE;                        /* 配置禁止传输暂停特性 */
  hfdcan1.Init.ProtocolException = ENABLE;                /* 协议异常处理使能 */
        /* 第2步:波特率配置 ==================================================================================*/
/* FDCAN中仲裁段位速率最高1Mbit/s, 数据段位速率最高8Mbit/s */
/* 仲裁段通信速率(FDCAN与传统CAN均需配置) = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc)= 70M / ((1 + 59 + 10)*1) = 1Mbit/s */
  hfdcan1.Init.NominalPrescaler = 1;
  hfdcan1.Init.NominalSyncJumpWidth = 10;
  hfdcan1.Init.NominalTimeSeg1 = 59;
  hfdcan1.Init.NominalTimeSeg2 = 10;
/* 数据段通信速率(仅FDCAN模式需配置) = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc) = 70M / ((7 + 6 + 1)*1) = 5 Mbit/s */       
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 6;
hfdcan1.Init.DataTimeSeg1 = 7;
  hfdcan1.Init.DataTimeSeg2 = 6;
  /* 第3步:RAM管理器配置 ==================================================================================*/
    hfdcan1.Init.MessageRAMOffset = 0;                              /* CAN1和CAN2共享2560个字, 这里CAN1分配前1280字 */
        hfdcan1.Init.StdFiltersNbr = 1;                                 /* 设置标准ID过滤器个数,范围0-128 */      
        hfdcan1.Init.ExtFiltersNbr = 1;                                 /* 设置扩展ID过滤器个数,范围0-64 */   
        hfdcan1.Init.RxFifo0ElmtsNbr = 16;                   /* 设置Rx FIFO0的元素个数,范围0-64 */  
        hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;  /* 设置Rx FIFO0中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */   
        hfdcan1.Init.RxFifo1ElmtsNbr = 4;                   /* 设置Rx FIFO1的元素个数,范围0-64 */
        hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;  /* 设置Rx FIFO1中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */       
        hfdcan1.Init.RxBuffersNbr = 4;                      /* 设置Rx Buffer个数,范围0-64 */
        hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64;     /* 设置Rx Buffer中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */       

        hfdcan1.Init.TxEventsNbr = 8;                                                        /* 设置Tx Event FIFO中元素个数,范围0-32 */       
        hfdcan1.Init.TxBuffersNbr = 8;                                                        /* 设置Tx Buffer中元素个数,范围0-32 */
        hfdcan1.Init.TxFifoQueueElmtsNbr = 8;                   /* 设置用于Tx FIFO/Queue的Tx Buffers个数。范围0到32 */
        hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; /* 设置FIFO模式或者QUEUE队列模式 */
        hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;           /* 设置Tx Element中的数据域大小,支持8,12,16,20,24,32,48或者64字节 */
        if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
        {
                Error_Handler();
        }

        /* 第4步:扩展ID过滤设置 ==================================================================================*/       
        sFilterConfig1.IdType = FDCAN_EXTENDED_ID;              /* 扩展ID */
        sFilterConfig1.FilterIndex = 0;                                                   /* 用于过滤索引,扩展ID,范围0到64 */
        sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;          /* 范围过滤 -----------------*/
        sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;  /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
        sFilterConfig1.FilterID1 = 0x00000000;                  /* 屏蔽位模式下,FilterID1是消息ID */
        sFilterConfig1.FilterID2 = 0x1FFFFFFF;                                         /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
        HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */

        /* 第5步:标准ID过滤设置 ==================================================================================*/       
                sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
                sFilterConfig1.FilterIndex = 0;                                                   /* 用于过滤索引,标准ID,范围0到127 */
                sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;          /* 范围过滤 -----------------*/
                sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;  /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
                sFilterConfig1.FilterID1 = 0x420;                       /* 屏蔽位模式下,FilterID1是消息ID */
                sFilterConfig1.FilterID2 = 0x43F;                                                 /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
                HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
               
                sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
                sFilterConfig1.FilterIndex = 1;                                                   /* 用于过滤索引,标准ID,范围0到127 */
                sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;          /* 范围过滤 -----------------*/
                sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;  /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
                sFilterConfig1.FilterID1 = 0x460;                       /* 屏蔽位模式下,FilterID1是消息ID */
                sFilterConfig1.FilterID2 = 0x47F;                                                 /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
                HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
               
                sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
                sFilterConfig1.FilterIndex = 2;                                                   /* 用于过滤索引,标准ID,范围0到127 */
                sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;          /* 范围过滤 -----------------*/
                sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;  /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
                sFilterConfig1.FilterID1 = 0x4A0;                       /* 屏蔽位模式下,FilterID1是消息ID */
                sFilterConfig1.FilterID2 = 0x4BF;                                                 /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
                HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */
               
                sFilterConfig1.IdType = FDCAN_STANDARD_ID;              /* 设置标准ID或者扩展ID */
                sFilterConfig1.FilterIndex = 3;                                                   /* 用于过滤索引,标准ID,范围0到127 */
                sFilterConfig1.FilterType = FDCAN_FILTER_RANGE;          /* 范围过滤 -----------------*/
                sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;  /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
                sFilterConfig1.FilterID1 = 0x4E0;                       /* 屏蔽位模式下,FilterID1是消息ID */
                sFilterConfig1.FilterID2 = 0x4FF;                                                 /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
                HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1);      /* 配置过滤器 */

       
        HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,                  /* 全局过滤设置 */
                                      FDCAN_REJECT,             /* 接收到消息ID与标准ID过滤不匹配,不接受 */
                                                                  FDCAN_REJECT,             /* 接收到消息ID与扩展ID过滤不匹配,不接受 */
                                                                  FDCAN_FILTER_REMOTE,      /* 过滤标准ID远程帧 */
                                                                  FDCAN_REJECT_REMOTE);     /* 拒绝扩展ID远程帧 */
        /* 第5步:Rx FIFO0中断配置 ===================================================================*/       
        /* 设置Rx FIFO0的阈值为1 ---------------------------------------*/
        HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 1);

        /* 开启RX FIFO0的阈值中断 */
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
       
        /* 第6步:Rx FIFO1中断配置 ===================================================================*/       
        /* 开启RX FIFO1的新数据中断 */
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
       
//        /* 第7步:Rx Buffer中断配置 ==================================================================*/       
//        /* Rx Buffer接收到新消息就触发中断 */
//        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_BUFFER_NEW_MESSAGE, 0);       

        /* 第8步:Tx Delay配置 ==================================================================*/       
        HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan1, hfdcan1.Init.DataPrescaler * hfdcan1.Init.DataTimeSeg1, 2);
       
        /* 第9步:Tx Delays使能 ==================================================================*/
    HAL_FDCAN_EnableTxDelayCompensation(&hfdcan1);
       
        /*第10步:启动FDCAN */
        HAL_FDCAN_Start(&hfdcan1);       
  /* USER CODE END FDCAN1_Init 2 */
}

回复

使用道具 举报

15

主题

55

回帖

100

积分

初级会员

积分
100
发表于 2026-1-30 10:53:40 | 显示全部楼层
walk 发表于 2026-1-29 19:25
stm32h7  canfd配置如下,调用函数HAL_FDCAN_ConfigGlobalFilter就收不到can信息,注释就可以,过滤器是范围 ...

已解决,过滤器数量设置不对。。。。。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-24 09:57 , Processed in 0.079467 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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