RX Fifo1 для CAN не генерирует обратный вызов прерывания (в основном он не получает данные) - PullRequest
0 голосов
/ 26 февраля 2020

На шине 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, чтобы он работал и генерировал прерывания? Я тоже попробовал без использования цифровых фильтров все равно не повезло.

Заранее спасибо,

...