UAEFI connection to STM32G474 VIA CAN
Posted: Tue Sep 02, 2025 4:40 pm
Hi,
I have some trouble for 2 weeks now
trying to connect UA ecu to STM32 dev board (I want to make simple dash screen). STM32G474 has FDCAN peripheral but it is cross compatible with old CAN BUS. I can't identify exact problem one of them is that NVIC doesn't run RXcallback function. Is there any specific CAN BUS setting in Tuner studio MS or am I doing something wrong with filter settings.
My settings in Tuner studio MS are: Here is code for FDCAN initialization (36MHz FDCAN Clock) -> 500kbps :
And part of code that never executes:
Additionally NVIC is initialized automaticaly:
Thank you!
I have some trouble for 2 weeks now

My settings in Tuner studio MS are: Here is code for FDCAN initialization (36MHz FDCAN Clock) -> 500kbps :
Code: Select all
static void MX_FDCAN2_Init(void)
{
/* USER CODE BEGIN FDCAN2_Init 0 */
// Omogoči prekinitev za FDCAN2 v NVIC
FDCAN_FilterTypeDef sFilterConfig; //DeclareS CAN filter structure
/* USER CODE END FDCAN2_Init 0 */
/* USER CODE BEGIN FDCAN2_Init 1 */
/* USER CODE END FDCAN2_Init 1 */
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;
hfdcan2.Init.NominalPrescaler = 1;
hfdcan2.Init.NominalSyncJumpWidth = 3;
hfdcan2.Init.NominalTimeSeg1 = 3;
hfdcan2.Init.NominalTimeSeg2 = 68;
hfdcan2.Init.DataPrescaler = 2;
hfdcan2.Init.DataSyncJumpWidth = 12;
hfdcan2.Init.DataTimeSeg1 = 23;
hfdcan2.Init.DataTimeSeg2 = 12;
hfdcan2.Init.StdFiltersNbr = 1;
hfdcan2.Init.ExtFiltersNbr = 0;
hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN FDCAN2_Init 2 */
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterType = FDCAN_FILTER_RANGE;
sFilterConfig.FilterID1 = 0x321; // Spodnja meja
sFilterConfig.FilterID2 = 0x7FF ; // Zgornja meja
if(HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK){ Error_Handler();}
if(HAL_FDCAN_Start(&hfdcan2) != HAL_OK){ Error_Handler();}
if(HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK){
Error_Handler();
}
// Optional: Activate error notifications (highly recommended for debugging)
if(HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_MESSAGE_LOST | FDCAN_IT_ERROR_WARNING | FDCAN_IT_BUS_OFF, 0) != HAL_OK){ Error_Handler(); }
/* USER CODE END FDCAN2_Init 2 */
}
Code: Select all
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
HAL_GPIO_TogglePin(LED_CAN_RX_GPIO_Port, LED_CAN_RX_GPIO_Port);
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
// Retrieve Rx messages from RX FIFO0
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) {Error_Handler();}
if (HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK) { Error_Handler();}
}
}
Code: Select all
static void MX_NVIC_Init(void)
{
/* FDCAN2_IT0_IRQn interrupt configuration */
HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn);
/* FDCAN2_IT1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(FDCAN2_IT1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(FDCAN2_IT1_IRQn);
}