MCUXpresso version:
MCUXpresso IDE v25.6
The problem happens when I use more than 4 ID filters (rxFilter.listSize).
Follow my entire code:
mcan_config_t mcanConfig;
mcan_memory_config_t memoryConfig = {0};
mcan_frame_filter_config_t rxFilter = {0};
mcan_std_filter_element_config_t stdFilter = {0};
mcan_rx_fifo_config_t rxFifo0 = {0};
mcan_tx_buffer_config_t txBuffer = {0};
/* Initialize board hardware. */
//BOARD_InitHardware();
//Set MCAN clock 100Mhz/5=20MHz.
CLOCK_SetClkDiv(kCLOCK_DivCanClk, 5U, true);
CLOCK_AttachClk(kMCAN_DIV_to_MCAN);
PRINTF("\r\n==MCAN loopback functional example -- Start.==\r\n\r\n");
/* Get MCAN module default Configuration. */
/*
* mcanConfig.baudRate = 500000U;
* mcanConfig.baudRateFD = 2000000U;
* mcanConfig.enableCanfdNormal = false;
* mcanConfig.enableCanfdSwitch = false;
* mcanConfig.enableLoopBackInt = false;
* mcanConfig.enableLoopBackExt = false;
* mcanConfig.enableBusMon = false;
*/
MCAN_GetDefaultConfig(&mcanConfig);
/* Enable external loop back mode.
* Current node treats its own transmitted messages as received messages,
* Other node can receive Current node transmitted messages,
* Other node can't transmit messages or ACK signal to Current node.
*/
//mcanConfig.enableLoopBackExt = true;
mcan_timing_config_t timing_config;
memset(&timing_config, 0, sizeof(timing_config));
if (MCAN_CalculateImprovedTimingValues(mcanConfig.baudRateA, MCAN_CLK_FREQ, &timing_config))
{
/* Update the improved timing configuration*/
memcpy(&(mcanConfig.timingConfig), &timing_config, sizeof(mcan_timing_config_t));
}
else
{
PRINTF("No found Improved Timing Configuration. use default configuration\r\n\r\n");
}
mcanConfig.baudRateA = CAN1_SPEED_100kBit;
MCAN_Init(EXAMPLE_MCAN, &mcanConfig, MCAN_CLK_FREQ);
memoryConfig.baseAddr = (uint32_t)msgRam;
/* STD filter config. */
rxFilter.address = STD_FILTER_OFS;
rxFilter.idFormat = kMCAN_FrameIDStandard;
rxFilter.listSize = 6U;
rxFilter.nmFrame = kMCAN_reject0;
rxFilter.remFrame = kMCAN_rejectFrame;
memoryConfig.stdFilterCfg = &rxFilter;
/* RX fifo0 config. */
rxFifo0.address = RX_FIFO0_OFS;
rxFifo0.elementSize = 1U;
rxFifo0.watermark = 0;
rxFifo0.opmode = kMCAN_FifoBlocking;
rxFifo0.datafieldSize = kMCAN_8ByteDatafield;
memoryConfig.rxFifo0Cfg = &rxFifo0;
/* TX buffer config. */
txBuffer.address = TX_BUFFER_OFS;
txBuffer.dedicatedSize = 1U;
txBuffer.fqSize = 0;
txBuffer.datafieldSize = kMCAN_8ByteDatafield;
memoryConfig.txBufferCfg = &txBuffer;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Follow is when the error occurs
/* Set Message RAM config and clear memory to avoid BEU/BEC error. */
memset((void *)msgRam, 0, MSG_RAM_SIZE * sizeof(uint8_t));
if (kStatus_Success != MCAN_SetMessageRamConfig(EXAMPLE_MCAN, &memoryConfig))
{
PRINTF("MCAN Message RAM configuration failed, please check parameters!\r\n");
return -1;
}
If you put "rxFilter.listSize > 4" , the message "MCAN Message RAM configuration failed, please check parameters!" will be displayed.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
And follow my filters:
stdFilter.sfec = kMCAN_storeinFifo0;
//Classic filter mode, only filter matching ID.
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = 0x4B0U;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 0);
stdFilter.sfec = kMCAN_storeinFifo0;
//Classic filter mode, only filter matching ID.
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = 0x600U;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 1);
stdFilter.sfec = kMCAN_storeinFifo0;
//Classic filter mode, only filter matching ID.
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = 0x1a1U;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 2);
stdFilter.sfec = kMCAN_storeinFifo0;
//Classic filter mode, only filter matching ID.
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = 0x2a2U;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 3);
stdFilter.sfec = kMCAN_storeinFifo0;
//Classic filter mode, only filter matching ID.
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = 0x421U;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 4);
stdFilter.sfec = kMCAN_storeinFifo0;
//Classic filter mode, only filter matching ID.
stdFilter.sft = kMCAN_classic;
stdFilter.sfid1 = 0x100U;
stdFilter.sfid2 = 0x7FFU;
MCAN_SetSTDFilterElement(EXAMPLE_MCAN, &rxFilter, &stdFilter, 5);
/* Enable RX fifo0 new message interrupt using interrupt line 0. */
MCAN_EnableInterrupts(EXAMPLE_MCAN, 0, CAN_IE_RF0NE_MASK);
EnableIRQ(CAN0_IRQ0_IRQn);
Regards,
Alvaro