fendoushuai 发表于 2024-3-20 17:46:16

canfd过滤器配置后不起作用

本帖最后由 fendoushuai 于 2024-3-20 17:55 编辑

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

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


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);

                }
      }
}




fendoushuai 发表于 2024-3-21 08:54:47

本帖最后由 fendoushuai 于 2024-3-21 09:17 编辑

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

eric2013 发表于 2024-3-22 08:49:01

fendoushuai 发表于 2024-3-21 08:54
之前配置中没有加HAL_FDCAN_ConfigGlobalFilter配置,配置以后就好了。

对,这个函数比较重要,否则配置的过滤不起作用。
页: [1]
查看完整版本: canfd过滤器配置后不起作用