2026-05-12 2:34 PM
Hi,
I am using STM32G491 with 2 FDCAN channels. FDCAN1 is working normally for sending and receiving data. FDCAN2 is sending out data normally, but it can't receive any data, not able to generate any receiving interrupts. Here is the initialization code. Can anyone have any ideas what could be the issue? Thanks.
void MX_FDCAN2_Classic_Init(void)
{
FDCAN_FilterTypeDef sFilterConfig;
__HAL_RCC_FDCAN_CLK_ENABLE();
hfdcan2.Instance = FDCAN2;
hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan2.Init.AutoRetransmission = DISABLE;
hfdcan2.Init.TransmitPause = DISABLE;
hfdcan2.Init.ProtocolException = DISABLE;
//CAN 500kbps
hfdcan2.Init.NominalPrescaler = 16;
hfdcan2.Init.NominalSyncJumpWidth = 1;
hfdcan2.Init.NominalTimeSeg1 = 2;
hfdcan2.Init.NominalTimeSeg2 = 2;
hfdcan2.Init.DataPrescaler = 1;
hfdcan2.Init.DataSyncJumpWidth = 1;
hfdcan2.Init.DataTimeSeg1 = 1;
hfdcan2.Init.DataTimeSeg2 = 1;
hfdcan2.Init.StdFiltersNbr = 0;
hfdcan2.Init.ExtFiltersNbr = 0;
hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
{
Error_Handler();
}
/* Configure the CAN Filter */
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 1;
sFilterConfig.FilterType = FDCAN_FILTER_RANGE;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1 = 0x321;
sFilterConfig.FilterID2 = 0x7FF;
if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK) {
Error_Handler();
}
if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK) {
Error_Handler();
}
// 2. Assign the event to a specific interrupt line (Line 0 is default)
HAL_FDCAN_ConfigInterruptLines(&hfdcan2, FDCAN_IT_GROUP_RX_FIFO0, FDCAN_INTERRUPT_LINE0);
HAL_FDCAN_ConfigInterruptLines(&hfdcan2, FDCAN_IT_GROUP_RX_FIFO1, FDCAN_INTERRUPT_LINE1);
// 3. Enable the global FDCAN Line 0
//HAL_FDCAN_ConfigInterruptLines(&hfdcan2, FDCAN_INTERRUPT_LINE0);
// 4. Activate the specific notification (e.g., RX FIFO 0 New Message)
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
//if (HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK) {
//Error_Handler();
//}
NVIC_SetPriority(FDCAN2_IT0_IRQn, 2);
NVIC_EnableIRQ(FDCAN2_IT0_IRQn);
NVIC_SetPriority(FDCAN2_IT1_IRQn, 2);
NVIC_EnableIRQ(FDCAN2_IT1_IRQn);
/* Configure Transmission process */
FDCAN2_TxHeader.Identifier = 0x321;
FDCAN2_TxHeader.IdType = FDCAN_STANDARD_ID;
FDCAN2_TxHeader.TxFrameType = FDCAN_DATA_FRAME;
FDCAN2_TxHeader.DataLength = FDCAN_DLC_BYTES_8;
FDCAN2_TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
FDCAN2_TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
}
2026-05-12 4:48 PM
In the future, use the </> to insert code so it's properly formatted.
Attach your IOC file.