首页 > 解决方案 > CAN的RX Fifo1没有产生中断回调(基本上它没有接收数据)

问题描述

CAN 总线上有两种类型的消息。这些是广播消息和默认消息。目前,我对这两个消息都使用了 fifo0(效果很好)。但我想使用 fifo1 专门用于广播消息。下面是我的初始化代码

uint8 BspCan_RxFilterConfig(uint32 filterId, uint32 filterMask, uint8 filterBankId, uint8 enableFlag, uint8 fifoAssignment)
{
    ///\todo Add method for calculating filter on the fly
    CAN_FilterTypeDef  canBusFilterConfig;
    FunctionalState filterEnableFlag = ENABLE;

    if(enableFlag == 0)
    {
        filterEnableFlag = DISABLE;
    }
    else
    {
        filterEnableFlag = ENABLE;
    }

     /*Define filter used to determine if application needs to handle message on the CAN bus or if it should
    ignore it.  If the selected rx FIFO is changed, the rx functions in this module must also be updated.
    Using mask mode with all bits set to "don't care"*/  

    canBusFilterConfig.FilterBank           = filterBankId;                                //Identification of which of the filter banks to define.  
    canBusFilterConfig.FilterMode           = CAN_FILTERMODE_IDMASK;            //Sets whether to filter out messages based on a specific id or a list
    canBusFilterConfig.FilterScale          = CAN_FILTERSCALE_32BIT;            //Sets the width of the filter, 32-bit width means filter applies to full range of std id, extended id, IDE, and RTR bits
    canBusFilterConfig.FilterIdHigh         = (0xFFFF0000 & filterId)>>16;                           //For upper 16 bits, dominant bit is expected (logic 0)
    canBusFilterConfig.FilterIdLow          = 0x0000FFFF & filterId;                           //For Lower 16 bits, dominant bit is expected (logic 0)
    canBusFilterConfig.FilterMaskIdHigh     = (0xFFFF0000 & filterMask)>>16;                           //Upper 16 bits are don't care
    canBusFilterConfig.FilterMaskIdLow      = 0x0000FFFF & filterMask;                           //Lower 16 bits are don't care
    //canBusFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;                 //Sets which rx FIFO to which to apply the filter settings
    canBusFilterConfig.FilterActivation     = filterEnableFlag;
    canBusFilterConfig.SlaveStartFilterBank           = 1;                               //Bank for the defined filter. Arbitrary value.

    if (fifoAssignment == 0)
    {
      canBusFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    }
    else
    {
      canBusFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO1;
    }

    //Only fails if CAN peripheral is not in ready or listening state
    if (HAL_CAN_ConfigFilter(&gCanBusH, &canBusFilterConfig) != HAL_OK)
    {
        return(ERR_CAN_INIT_FAILED);
    }
    else
    {
        return(SZW_NO_ERROR);
    }

}//end BspCan_RxFilterConfig

初始化时,fifo0 可以正常工作,但 fifo1 不能。如果我只是为这两种类型的消息初始化 fifo1,它不会产生中断。我在这里做错了什么?如何初始化 fifo1 以使其工作并产生中断?我也试过不使用数字滤波器仍然没有运气。

提前致谢,

标签: embeddedstm32fifocan-busiar

解决方案


推荐阅读