Skip to main content
Visitor II
September 2, 2025
Solved

FDCAN - DUAL ID FILTER

  • September 2, 2025
  • 5 replies
  • 856 views
In this code I want IDs 0x100 and 0x200 should only be accepted but in my code all IDs are accepted. How to resolve this?

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file : main.c
 * @brief : Main program body
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2025 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

FDCAN_HandleTypeDef hfdcan1;
FDCAN_HandleTypeDef hfdcan2;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_FDCAN1_Init(void);
static void MX_FDCAN2_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

 FDCAN_TxHeaderTypeDef TX_Header1;
 FDCAN_TxHeaderTypeDef TX_Header2;
 FDCAN_RxHeaderTypeDef RX_Header;

 char RX_data[9];
 char RX_data_1[9];
 char RX_data_2[9];
 char TX_data_1[8] = "Hellooo";
 char TX_data_2[8] = "Akshai";
 char TX_data_3[8] = "Muthu08";


// uint8_t FDCAN_Mode_Init(FDCAN_HandleTypeDef *hfdcan,FDCAN_HandleTypeDef *hfdcan_1)
 uint8_t FDCAN_Mode_Init(FDCAN_HandleTypeDef *hfdcan)
 {

 FDCAN_FilterTypeDef sConfigFilter_1;

 sConfigFilter_1.IdType = FDCAN_STANDARD_ID;
 sConfigFilter_1.FilterType = FDCAN_FILTER_DUAL;
 sConfigFilter_1.FilterID1 = 0x100;
 sConfigFilter_1.FilterID2 = 0x200;
 sConfigFilter_1.FilterIndex = 0;
 sConfigFilter_1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
 if(HAL_FDCAN_ConfigFilter(hfdcan, &sConfigFilter_1) != HAL_OK)
 return 1;
 // FDCAN_GlobalTypeDef GlobalFilter;

 HAL_FDCAN_Start(hfdcan);
// HAL_FDCAN_Start(hfdcan_1);

 }



 uint8_t FDCAN_Send_Message(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
 {
 TX_Header1.Identifier = 0x100;
 TX_Header1.BitRateSwitch = FDCAN_BRS_OFF;
 TX_Header1.DataLength = FDCAN_DLC_BYTES_8;
 TX_Header1.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
 TX_Header1.FDFormat = FDCAN_FD_CAN;
 TX_Header1.IdType = FDCAN_STANDARD_ID;
 TX_Header1.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
 TX_Header1.TxFrameType = FDCAN_DATA_FRAME;
 TX_Header1.MessageMarker = 0;

 if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header1, data) != HAL_OK)return 1;
 return 0;

 }

 uint8_t FDCAN_Send_Message_1(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
 {
 TX_Header2.Identifier = 0x200;
 TX_Header2.BitRateSwitch = FDCAN_BRS_OFF;
 TX_Header2.DataLength = FDCAN_DLC_BYTES_8;
 TX_Header2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
 TX_Header2.FDFormat = FDCAN_FD_CAN;
 TX_Header2.IdType = FDCAN_STANDARD_ID;
 TX_Header2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
 TX_Header2.TxFrameType = FDCAN_DATA_FRAME;
 TX_Header2.MessageMarker = 0;

 if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header2, data) != HAL_OK) return 1;
 return 0;

 }

 uint8_t FDCAN_Send_Message_2(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
 {
 TX_Header2.Identifier = 0x300;
 TX_Header2.BitRateSwitch = FDCAN_BRS_OFF;
 TX_Header2.DataLength = FDCAN_DLC_BYTES_8;
 TX_Header2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
 TX_Header2.FDFormat = FDCAN_FD_CAN;
 TX_Header2.IdType = FDCAN_STANDARD_ID;
 TX_Header2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
 TX_Header2.TxFrameType = FDCAN_DATA_FRAME;
 TX_Header2.MessageMarker = 0;

 if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header2, data) != HAL_OK) return 1;
 return 0;

 }

 uint8_t FDCAN_Receive_Message(FDCAN_HandleTypeDef *hfdcan, uint8_t *data )
 {
 if(HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RX_Header, data) != HAL_OK)
 {
 return 1;
 }
 return 0 ;

 }
/* USER CODE END 0 */

/**
 * @brief The application entry point.
 * @retval int
 */
int main(void)
{
 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_FDCAN1_Init();
 MX_FDCAN2_Init();
 /* USER CODE BEGIN 2 */
 if(FDCAN_Mode_Init(&hfdcan2) != 0){
 while(1);
 }
 if(FDCAN_Mode_Init(&hfdcan1) != 0){
 while(1);
 }
 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
 if(FDCAN_Send_Message_2(&hfdcan1,TX_data_1) != 0 )
 {
 while(1);

 }
 HAL_Delay(1);
 if(FDCAN_Receive_Message(&hfdcan2, RX_data) != 0)
 {
 while(1);
 }
 HAL_Delay(1000);

if(FDCAN_Send_Message_2(&hfdcan1, TX_data_3) != 0 )
{
while(1)
{

}
}
HAL_Delay(1);
if(FDCAN_Receive_Message(&hfdcan2, RX_data_2) != 0)
{
while(1)
{

}
}
HAL_Delay(1000);

 if(FDCAN_Send_Message_2(&hfdcan1, TX_data_2) != 0 )
 {
 while(1)
 {

 }
 }
 HAL_Delay(1);
 if(FDCAN_Receive_Message(&hfdcan2, RX_data_1) != 0)
 {
 while(1)
 {

 }
 }
 HAL_Delay(1000);
//

 }
 /* USER CODE END 3 */
}

/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 /** Supply configuration update enable
 */
 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

 /** Configure the main internal regulator output voltage
 */
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

 /** Initializes the RCC Oscillators according to the specified parameters
 * in the RCC_OscInitTypeDef structure.
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 RCC_OscInitStruct.PLL.PLLM = 4;
 RCC_OscInitStruct.PLL.PLLN = 60;
 RCC_OscInitStruct.PLL.PLLP = 4;
 RCC_OscInitStruct.PLL.PLLQ = 16;
 RCC_OscInitStruct.PLL.PLLR = 2;
 RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
 RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
 RCC_OscInitStruct.PLL.PLLFRACN = 0;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }

 /** Initializes the CPU, AHB and APB buses clocks
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 {
 Error_Handler();
 }
}

/**
 * @brief FDCAN1 Initialization Function
 * None
 * @retval None
 */
static void MX_FDCAN1_Init(void)
{

 /* USER CODE BEGIN FDCAN1_Init 0 */

 /* USER CODE END FDCAN1_Init 0 */

 /* USER CODE BEGIN FDCAN1_Init 1 */

 /* USER CODE END FDCAN1_Init 1 */
 hfdcan1.Instance = FDCAN1;
 hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
 hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
 hfdcan1.Init.AutoRetransmission = DISABLE;
 hfdcan1.Init.TransmitPause = DISABLE;
 hfdcan1.Init.ProtocolException = DISABLE;
 hfdcan1.Init.NominalPrescaler = 10;
 hfdcan1.Init.NominalSyncJumpWidth = 1;
 hfdcan1.Init.NominalTimeSeg1 = 2;
 hfdcan1.Init.NominalTimeSeg2 = 2;
 hfdcan1.Init.DataPrescaler = 1;
 hfdcan1.Init.DataSyncJumpWidth = 1;
 hfdcan1.Init.DataTimeSeg1 = 1;
 hfdcan1.Init.DataTimeSeg2 = 1;
 hfdcan1.Init.MessageRAMOffset = 0;
 hfdcan1.Init.StdFiltersNbr = 0;
 hfdcan1.Init.ExtFiltersNbr = 0;
 hfdcan1.Init.RxFifo0ElmtsNbr = 1;
 hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
 hfdcan1.Init.RxFifo1ElmtsNbr = 0;
 hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
 hfdcan1.Init.RxBuffersNbr = 0;
 hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
 hfdcan1.Init.TxEventsNbr = 0;
 hfdcan1.Init.TxBuffersNbr = 0;
 hfdcan1.Init.TxFifoQueueElmtsNbr = 1;
 hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
 hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
 if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN FDCAN1_Init 2 */

 /* USER CODE END FDCAN1_Init 2 */

}

/**
 * @brief FDCAN2 Initialization Function
 * None
 * @retval None
 */
static void MX_FDCAN2_Init(void)
{

 /* USER CODE BEGIN FDCAN2_Init 0 */

 /* USER CODE END FDCAN2_Init 0 */

 /* USER CODE BEGIN FDCAN2_Init 1 */

 /* USER CODE END FDCAN2_Init 1 */
 hfdcan2.Instance = FDCAN2;
 hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
 hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
 hfdcan2.Init.AutoRetransmission = DISABLE;
 hfdcan2.Init.TransmitPause = DISABLE;
 hfdcan2.Init.ProtocolException = DISABLE;
 hfdcan2.Init.NominalPrescaler = 10;
 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.MessageRAMOffset = 0;
 hfdcan2.Init.StdFiltersNbr = 2;
 hfdcan2.Init.ExtFiltersNbr = 0;
 hfdcan2.Init.RxFifo0ElmtsNbr = 1;
 hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
 hfdcan2.Init.RxFifo1ElmtsNbr = 1;
 hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
 hfdcan2.Init.RxBuffersNbr = 0;
 hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
 hfdcan2.Init.TxEventsNbr = 0;
 hfdcan2.Init.TxBuffersNbr = 0;
 hfdcan2.Init.TxFifoQueueElmtsNbr = 1;
 hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
 hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
 if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN FDCAN2_Init 2 */

 /* USER CODE END FDCAN2_Init 2 */

}

/**
 * @brief GPIO Initialization Function
 * None
 * @retval None
 */
static void MX_GPIO_Init(void)
{
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
 * @brief This function is executed in case of error occurrence.
 * @retval None
 */
void Error_Handler(void)
{
 /* USER CODE BEGIN Error_Handler_Debug */
 /* User can add his own implementation to report the HAL error return state */
 __disable_irq();
 while (1)
 {
 }
 /* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
/**
 * @brief Reports the name of the source file and the source line number
 * where the assert_param error has occurred.
 * file: pointer to the source file name
 * line: assert_param error line source number
 * @retval None
 */
void assert_failed(uint8_t *file, uint32_t line)
{
 /* USER CODE BEGIN 6 */
 /* User can add his own implementation to report the file name and line number,
 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
​
    This topic has been closed for replies.
    Best answer by mƎALLEm

    First, in normal mode, you must use HSE with an external crystal. I think as you are using both CAN instances from the same MCU. You can still use HSI. But in a real application you must use a crystal.

    Your code didn't help me to find the issue but I'm attaching a project where I used FDCAN1 in loopback mode and it is sending a classical frame covering all the standard IDs from 0x0 to 0x7FF. The DUAL ID frame is used and only 0x100 and 0x200 are received by FDCAN1.

    Hope that helps.

    5 replies

    Technical Moderator
    September 2, 2025

    Hello @STMUser_1 and welcome to the community,

    In next time please: 

    1- Use the button </> to paste your code. Please read this post.

    2- You need always to provide what is the MCU part number you are using. Please read this post

    Now to answer your question, you need to call after configuring the filter:

     /* Configure global filter to reject all non-matching frames */
     HAL_FDCAN_ConfigGlobalFilter(&hfdcan, FDCAN_REJECT, FDCAN_REJECT, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE);

     

    STMUser_1Author
    Visitor II
    September 2, 2025

    Thanks for your response, I tried add this line earlier but if I add that even Messages with ID 0x100 and 0x200 are not stored in the arrays.

     uint8_t FDCAN_Mode_Init(FDCAN_HandleTypeDef *hfdcan)
     {
    
     FDCAN_FilterTypeDef sConfigFilter_1;
    
     sConfigFilter_1.IdType = FDCAN_STANDARD_ID;
     sConfigFilter_1.FilterType = FDCAN_FILTER_DUAL;
     sConfigFilter_1.FilterID1 = 0x100;
     sConfigFilter_1.FilterID2 = 0x200;
     sConfigFilter_1.FilterIndex = 0;
     sConfigFilter_1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
     if(HAL_FDCAN_ConfigFilter(hfdcan, &sConfigFilter_1) != HAL_OK)
     return 1;
     
     HAL_FDCAN_ConfigGlobalFilter(&hfdcan, FDCAN_REJECT, FDCAN_REJECT, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE);
     HAL_FDCAN_Start(hfdcan);
    
    
     }

    Post edited by ST moderator to follow the community rule especially for the code sharing.

    Technical Moderator
    September 2, 2025

    Again

    1- Please use </> button to paste your code.

    2- Provide the part number of the MCU/ the board you are using.

     

    STMUser_1Author
    Visitor II
    September 2, 2025

    sorry, will use from next time.
    STM32H743VIT6

    mƎALLEmAnswer
    Technical Moderator
    September 2, 2025

    First, in normal mode, you must use HSE with an external crystal. I think as you are using both CAN instances from the same MCU. You can still use HSI. But in a real application you must use a crystal.

    Your code didn't help me to find the issue but I'm attaching a project where I used FDCAN1 in loopback mode and it is sending a classical frame covering all the standard IDs from 0x0 to 0x7FF. The DUAL ID frame is used and only 0x100 and 0x200 are received by FDCAN1.

    Hope that helps.

    STMUser_1Author
    Visitor II
    September 2, 2025

    even for FILTER_MASK unwanted IDs are accepted what might be the issue?

     
    /* USER CODE BEGIN Header */
    /**
     ******************************************************************************
     * @file : main.c
     * @brief : Main program body
     ******************************************************************************
     * @attention
     *
     * Copyright (c) 2025 STMicroelectronics.
     * All rights reserved.
     *
     * This software is licensed under terms that can be found in the LICENSE file
     * in the root directory of this software component.
     * If no LICENSE file comes with this software, it is provided AS-IS.
     *
     ******************************************************************************
     */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    
    FDCAN_HandleTypeDef hfdcan1;
    FDCAN_HandleTypeDef hfdcan2;
    
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_FDCAN1_Init(void);
    static void MX_FDCAN2_Init(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
     FDCAN_TxHeaderTypeDef TX_Header1;
     FDCAN_TxHeaderTypeDef TX_Header2;
     FDCAN_RxHeaderTypeDef RX_Header;
    
     char RX_data[9];
     char RX_data_1[9];
     char RX_data_2[9];
     char TX_data_1[8] = "Hellooo";
     char TX_data_2[8] = "Akshai";
     char TX_data_3[8] = "Muthu08";
    
    
    // uint8_t FDCAN_Mode_Init(FDCAN_HandleTypeDef *hfdcan,FDCAN_HandleTypeDef *hfdcan_1)
     uint8_t FDCAN_Mode_Init(FDCAN_HandleTypeDef *hfdcan)
     {
    
     FDCAN_FilterTypeDef sConfigFilter_1;
    
     sConfigFilter_1.IdType = FDCAN_STANDARD_ID;
     sConfigFilter_1.FilterType = FDCAN_FILTER_MASK;
     sConfigFilter_1.FilterIndex = 0;
     sConfigFilter_1.FilterID1 = 0x100;
     sConfigFilter_1.FilterID2 = 0x7FF;
    
     sConfigFilter_1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
     if(HAL_FDCAN_ConfigFilter(hfdcan, &sConfigFilter_1) != HAL_OK)
     return 1;
    
    // sConfigFilter_1.FilterIndex = 1;
    // sConfigFilter_1.FilterID1 = 0x200;
    // sConfigFilter_1.FilterID2 = 0x7FF;
    // if(HAL_FDCAN_ConfigFilter(hfdcan, &sConfigFilter_1) != HAL_OK)
    // return 1;
    // if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,
    // FDCAN_REJECT, FDCAN_REJECT,
    // FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    // {
    // Error_Handler();
    // }
    
     // FDCAN_GlobalTypeDef GlobalFilter;
    // HAL_FDCAN_ConfigGlobalFilter(&hfdcan, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE);
     HAL_FDCAN_Start(hfdcan);
    // HAL_FDCAN_Start(hfdcan_1);
    
     }
    
    
    
     uint8_t FDCAN_Send_Message(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
     {
     TX_Header1.Identifier = 0x100;
     TX_Header1.BitRateSwitch = FDCAN_BRS_OFF;
     TX_Header1.DataLength = FDCAN_DLC_BYTES_8;
     TX_Header1.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
     TX_Header1.FDFormat = FDCAN_FD_CAN;
     TX_Header1.IdType = FDCAN_STANDARD_ID;
     TX_Header1.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
     TX_Header1.TxFrameType = FDCAN_DATA_FRAME;
     TX_Header1.MessageMarker = 0;
    
     if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header1, data) != HAL_OK)return 1;
     return 0;
    
     }
    
     uint8_t FDCAN_Send_Message_1(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
     {
     TX_Header2.Identifier = 0x200;
     TX_Header2.BitRateSwitch = FDCAN_BRS_OFF;
     TX_Header2.DataLength = FDCAN_DLC_BYTES_8;
     TX_Header2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
     TX_Header2.FDFormat = FDCAN_FD_CAN;
     TX_Header2.IdType = FDCAN_STANDARD_ID;
     TX_Header2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
     TX_Header2.TxFrameType = FDCAN_DATA_FRAME;
     TX_Header2.MessageMarker = 0;
    
     if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header2, data) != HAL_OK) return 1;
     return 0;
    
     }
    
     uint8_t FDCAN_Send_Message_2(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
     {
     TX_Header2.Identifier = 0x300;
     TX_Header2.BitRateSwitch = FDCAN_BRS_OFF;
     TX_Header2.DataLength = FDCAN_DLC_BYTES_8;
     TX_Header2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
     TX_Header2.FDFormat = FDCAN_FD_CAN;
     TX_Header2.IdType = FDCAN_STANDARD_ID;
     TX_Header2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
     TX_Header2.TxFrameType = FDCAN_DATA_FRAME;
     TX_Header2.MessageMarker = 0;
    
     if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header2, data) != HAL_OK) return 1;
     return 0;
    
     }
    
     uint8_t FDCAN_Receive_Message(FDCAN_HandleTypeDef *hfdcan, uint8_t *data )
     {
     if(HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RX_Header, data) != HAL_OK)
     {
     return 1;
     }
     return 0 ;
    
     }
    /* USER CODE END 0 */
    
    /**
     * @brief The application entry point.
     * @retval int
     */
    int main(void)
    {
     /* USER CODE BEGIN 1 */
    
     /* USER CODE END 1 */
    
     /* MCU Configuration--------------------------------------------------------*/
    
     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
     HAL_Init();
    
     /* USER CODE BEGIN Init */
    
     /* USER CODE END Init */
    
     /* Configure the system clock */
     SystemClock_Config();
    
     /* USER CODE BEGIN SysInit */
    
     /* USER CODE END SysInit */
    
     /* Initialize all configured peripherals */
     MX_GPIO_Init();
     MX_FDCAN1_Init();
     MX_FDCAN2_Init();
     /* USER CODE BEGIN 2 */
     if(FDCAN_Mode_Init(&hfdcan2) != 0){
     while(1);
     }
     if(FDCAN_Mode_Init(&hfdcan1) != 0){
     while(1);
     }
     /* USER CODE END 2 */
    
     /* Infinite loop */
     /* USER CODE BEGIN WHILE */
     while (1)
     {
     /* USER CODE END WHILE */
    
     /* USER CODE BEGIN 3 */
     if(FDCAN_Send_Message(&hfdcan1,TX_data_1) != 0 )
     {
     while(1);
    
     }
     HAL_Delay(1);
     if(FDCAN_Receive_Message(&hfdcan2, RX_data) != 0)
     {
     while(1);
     }
     HAL_Delay(1000);
    
    if(FDCAN_Send_Message_2(&hfdcan1, TX_data_3) != 0 )
    {
    while(1)
    {
    
    }
    }
    HAL_Delay(1);
    if(FDCAN_Receive_Message(&hfdcan2, RX_data_2) != 0)
    {
    while(1)
    {
    
    }
    }
    HAL_Delay(1000);
    
     if(FDCAN_Send_Message_2(&hfdcan1, TX_data_2) != 0 )
     {
     while(1)
     {
    
     }
     }
     HAL_Delay(1);
     if(FDCAN_Receive_Message(&hfdcan2, RX_data_1) != 0)
     {
     while(1)
     {
    
     }
     }
     HAL_Delay(1000);
    //
    
     }
     /* USER CODE END 3 */
    }
    
    /**
     * @brief System Clock Configuration
     * @retval None
     */
    void SystemClock_Config(void)
    {
     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
     /** Supply configuration update enable
     */
     HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    
     /** Configure the main internal regulator output voltage
     */
     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
    
     while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    
     /** Initializes the RCC Oscillators according to the specified parameters
     * in the RCC_OscInitTypeDef structure.
     */
     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
     RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
     RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
     RCC_OscInitStruct.PLL.PLLM = 4;
     RCC_OscInitStruct.PLL.PLLN = 60;
     RCC_OscInitStruct.PLL.PLLP = 4;
     RCC_OscInitStruct.PLL.PLLQ = 16;
     RCC_OscInitStruct.PLL.PLLR = 2;
     RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
     RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
     RCC_OscInitStruct.PLL.PLLFRACN = 0;
     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
     {
     Error_Handler();
     }
    
     /** Initializes the CPU, AHB and APB buses clocks
     */
     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
     |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
     |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
     RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
     RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
     RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
     RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
     RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
     RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
    
     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
     {
     Error_Handler();
     }
    }
    
    /**
     * @brief FDCAN1 Initialization Function
     * None
     * @retval None
     */
    static void MX_FDCAN1_Init(void)
    {
    
     /* USER CODE BEGIN FDCAN1_Init 0 */
    
     /* USER CODE END FDCAN1_Init 0 */
    
     /* USER CODE BEGIN FDCAN1_Init 1 */
    
     /* USER CODE END FDCAN1_Init 1 */
     hfdcan1.Instance = FDCAN1;
     hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
     hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
     hfdcan1.Init.AutoRetransmission = DISABLE;
     hfdcan1.Init.TransmitPause = DISABLE;
     hfdcan1.Init.ProtocolException = DISABLE;
     hfdcan1.Init.NominalPrescaler = 10;
     hfdcan1.Init.NominalSyncJumpWidth = 1;
     hfdcan1.Init.NominalTimeSeg1 = 2;
     hfdcan1.Init.NominalTimeSeg2 = 2;
     hfdcan1.Init.DataPrescaler = 1;
     hfdcan1.Init.DataSyncJumpWidth = 1;
     hfdcan1.Init.DataTimeSeg1 = 1;
     hfdcan1.Init.DataTimeSeg2 = 1;
     hfdcan1.Init.MessageRAMOffset = 0;
     hfdcan1.Init.StdFiltersNbr = 0;
     hfdcan1.Init.ExtFiltersNbr = 0;
     hfdcan1.Init.RxFifo0ElmtsNbr = 1;
     hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan1.Init.RxFifo1ElmtsNbr = 0;
     hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan1.Init.RxBuffersNbr = 0;
     hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
     hfdcan1.Init.TxEventsNbr = 0;
     hfdcan1.Init.TxBuffersNbr = 0;
     hfdcan1.Init.TxFifoQueueElmtsNbr = 1;
     hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
     hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
     if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
     {
     Error_Handler();
     }
     /* USER CODE BEGIN FDCAN1_Init 2 */
    
     /* USER CODE END FDCAN1_Init 2 */
    
    }
    
    /**
     * @brief FDCAN2 Initialization Function
     * None
     * @retval None
     */
    static void MX_FDCAN2_Init(void)
    {
    
     /* USER CODE BEGIN FDCAN2_Init 0 */
    
     /* USER CODE END FDCAN2_Init 0 */
    
     /* USER CODE BEGIN FDCAN2_Init 1 */
    
     /* USER CODE END FDCAN2_Init 1 */
     hfdcan2.Instance = FDCAN2;
     hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
     hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
     hfdcan2.Init.AutoRetransmission = DISABLE;
     hfdcan2.Init.TransmitPause = DISABLE;
     hfdcan2.Init.ProtocolException = DISABLE;
     hfdcan2.Init.NominalPrescaler = 10;
     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.MessageRAMOffset = 0;
     hfdcan2.Init.StdFiltersNbr = 2;
     hfdcan2.Init.ExtFiltersNbr = 0;
     hfdcan2.Init.RxFifo0ElmtsNbr = 1;
     hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan2.Init.RxFifo1ElmtsNbr = 1;
     hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan2.Init.RxBuffersNbr = 0;
     hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
     hfdcan2.Init.TxEventsNbr = 0;
     hfdcan2.Init.TxBuffersNbr = 0;
     hfdcan2.Init.TxFifoQueueElmtsNbr = 1;
     hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
     hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
     if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
     {
     Error_Handler();
     }
     /* USER CODE BEGIN FDCAN2_Init 2 */
    
     /* USER CODE END FDCAN2_Init 2 */
    
    }
    
    /**
     * @brief GPIO Initialization Function
     * None
     * @retval None
     */
    static void MX_GPIO_Init(void)
    {
    /* USER CODE BEGIN MX_GPIO_Init_1 */
    /* USER CODE END MX_GPIO_Init_1 */
    
     /* GPIO Ports Clock Enable */
     __HAL_RCC_GPIOB_CLK_ENABLE();
     __HAL_RCC_GPIOA_CLK_ENABLE();
    
    /* USER CODE BEGIN MX_GPIO_Init_2 */
    /* USER CODE END MX_GPIO_Init_2 */
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
     * @brief This function is executed in case of error occurrence.
     * @retval None
     */
    void Error_Handler(void)
    {
     /* USER CODE BEGIN Error_Handler_Debug */
     /* User can add his own implementation to report the HAL error return state */
     __disable_irq();
     while (1)
     {
     }
     /* USER CODE END Error_Handler_Debug */
    }
    
    #ifdef USE_FULL_ASSERT
    /**
     * @brief Reports the name of the source file and the source line number
     * where the assert_param error has occurred.
     * file: pointer to the source file name
     * line: assert_param error line source number
     * @retval None
     */
    void assert_failed(uint8_t *file, uint32_t line)
    {
     /* USER CODE BEGIN 6 */
     /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
     /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    STMUser_1Author
    Visitor II
    September 2, 2025

    I used the configuration you used for my project still I didn't get what I expected. Any other ideas?

     

    Technical Moderator
    September 2, 2025

    Copy paste the content of my main.c in yours and test.

    Graduate II
    September 2, 2025

    Or try again what mEALLEm told you:

    HAL_FDCAN_ConfigGlobalFilter() is a must.

    And before that change FilterType back to FDCAN_FILTER_DUAL .

    STMUser_1Author
    Visitor II
    September 3, 2025

    The below code is working, I increased the StdFilterNbr and configured filter only for FDCAN2, earlier I configured for both instances. Now I am able to communicate between FDCAN1 and FDCAN2 and also reject unwanted IDs. In the below code I have configured for both Dual_Filter and Filter_Mask. for accepting multiple IDs.

    /* USER CODE BEGIN Header */
    /**
     ******************************************************************************
     * @file : main.c
     * @brief : Main program body
     ******************************************************************************
     * @attention
     *
     * Copyright (c) 2025 STMicroelectronics.
     * All rights reserved.
     *
     * This software is licensed under terms that can be found in the LICENSE file
     * in the root directory of this software component.
     * If no LICENSE file comes with this software, it is provided AS-IS.
     *
     ******************************************************************************
     */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    
    FDCAN_HandleTypeDef hfdcan1;
    FDCAN_HandleTypeDef hfdcan2;
    
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_FDCAN1_Init(void);
    static void MX_FDCAN2_Init(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
     FDCAN_TxHeaderTypeDef TX_Header1;
     FDCAN_TxHeaderTypeDef TX_Header2;
     FDCAN_RxHeaderTypeDef RX_Header;
    
     char RX_data[9];
     char RX_data_1[9];
     char RX_data_2[9];
     char TX_data_1[8] = "Hellooo";
     char TX_data_2[8] = "Akshai";
     char TX_data_3[8] = "Muthu08";
    
    
    
     uint8_t FDCAN_Dual_Mode_Init(FDCAN_HandleTypeDef *hfdcan)
     {
    		 FDCAN_FilterTypeDef sFilterConfig;
    
    	 	 	sFilterConfig.IdType = FDCAN_STANDARD_ID;
    	 	 sFilterConfig.FilterIndex = 0;
    	 	 sFilterConfig.FilterType = FDCAN_FILTER_DUAL;
    	 	 sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    	 	 sFilterConfig.FilterID1 = 0x100;
    	 	 sFilterConfig.FilterID2 = 0x200;
    	 	 if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    	 	 {
    //	 	 Error_Handler();
    	 	 }
    
    	 	 /**
    	 	 * Configure global filter:
    	 	 * - Filter all remote frames with STD and EXT ID
    	 	 * - Reject non matching frames with STD ID and EXT ID
    	 	 */
    	 	 if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,
    	 	 FDCAN_REJECT, FDCAN_REJECT,
    	 	 FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    	 	 {
    //	 	 Error_Handler();
    	 	 }
    
    
    	 HAL_FDCAN_Start(hfdcan);
    	 HAL_FDCAN_Start(&hfdcan1);
    
     }
    
     uint8_t FDCAN_Mask_Mode_Init(FDCAN_HandleTypeDef *hfdcan)
     {
    		 FDCAN_FilterTypeDef sFilterConfig;
    
    	 	 	sFilterConfig.IdType = FDCAN_STANDARD_ID;
    	 	 sFilterConfig.FilterIndex = 0;
    	 	 sFilterConfig.FilterType = FDCAN_FILTER_MASK;
    	 	 sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    	 	 sFilterConfig.FilterID1 = 0x400;
    	 	 sFilterConfig.FilterID2 = 0x7FF;
    
    	 	 if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    			{
     //	 	 Error_Handler();
    			}
    
    	 	 sFilterConfig.IdType = FDCAN_STANDARD_ID;
    			sFilterConfig.FilterIndex = 1;
    			sFilterConfig.FilterType = FDCAN_FILTER_MASK;
    			sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    			sFilterConfig.FilterID1 = 0x200;
    			sFilterConfig.FilterID2 = 0x7FF;
    	 	 if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    	 	 {
    //	 	 Error_Handler();
    	 	 }
    
    	 	 sFilterConfig.IdType = FDCAN_STANDARD_ID;
    			sFilterConfig.FilterIndex = 2;
    			sFilterConfig.FilterType = FDCAN_FILTER_MASK;
    			sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    			sFilterConfig.FilterID1 = 0x500;
    			sFilterConfig.FilterID2 = 0x7FF;
    			if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    			{
     //	 	 Error_Handler();
    			}
    
    
    			sFilterConfig.IdType = FDCAN_STANDARD_ID;
    			sFilterConfig.FilterIndex = 3;
    			sFilterConfig.FilterType = FDCAN_FILTER_MASK;
    			sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    			sFilterConfig.FilterID1 = 0x300;
    			sFilterConfig.FilterID2 = 0x7FF;
    			if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    			{
     //	 	 Error_Handler();
    			}
    
    			sFilterConfig.IdType = FDCAN_STANDARD_ID;
    			sFilterConfig.FilterIndex = 4;
    			sFilterConfig.FilterType = FDCAN_FILTER_MASK;
    			sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    			sFilterConfig.FilterID1 = 0x100;
    			sFilterConfig.FilterID2 = 0x7FF;
    			if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
    			{
     //	 	 Error_Handler();
    			}
    
    	 	 /**
    	 	 * Configure global filter:
    	 	 * - Filter all remote frames with STD and EXT ID
    	 	 * - Reject non matching frames with STD ID and EXT ID
    	 	 */
    	 	 if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,
    	 	 FDCAN_REJECT, FDCAN_REJECT,
    	 	 FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    	 	 {
    //	 	 Error_Handler();
    	 	 }
    
    
    	 HAL_FDCAN_Start(hfdcan);
    	 HAL_FDCAN_Start(&hfdcan1);
    
     }
    
     uint8_t FDCAN_Send_Message(FDCAN_HandleTypeDef *hfdcan, uint8_t* data, uint16_t ID)
     {
    	 TX_Header1.Identifier = ID;
    	 TX_Header1.BitRateSwitch = FDCAN_BRS_OFF;
    	 TX_Header1.DataLength = FDCAN_DLC_BYTES_8;
    	 TX_Header1.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
    	 TX_Header1.FDFormat = FDCAN_FD_CAN;
    	 TX_Header1.IdType = FDCAN_STANDARD_ID;
    	 TX_Header1.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
    	 TX_Header1.TxFrameType = FDCAN_DATA_FRAME;
    	 TX_Header1.MessageMarker = 0;
    
    	 if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header1, data) != HAL_OK)return 1;
    	 return 0;
    
     }
    //
    // uint8_t FDCAN_Send_Message_1(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
    // {
    // 	 TX_Header2.Identifier = 0x200;
    // 	 TX_Header2.BitRateSwitch = FDCAN_BRS_OFF;
    // 	 TX_Header2.DataLength = FDCAN_DLC_BYTES_8;
    // 	 TX_Header2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
    // 	 TX_Header2.FDFormat = FDCAN_FD_CAN;
    // 	 TX_Header2.IdType = FDCAN_STANDARD_ID;
    // 	 TX_Header2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
    // 	 TX_Header2.TxFrameType = FDCAN_DATA_FRAME;
    // 	 TX_Header2.MessageMarker = 0;
    //
    // 	 if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header2, data) != HAL_OK) return 1;
    // 	 return 0;
    //
    // }
    //
    // uint8_t FDCAN_Send_Message_2(FDCAN_HandleTypeDef *hfdcan, uint8_t* data)
    // {
    //	 TX_Header2.Identifier = 0x300;
    //	 TX_Header2.BitRateSwitch = FDCAN_BRS_OFF;
    //	 TX_Header2.DataLength = FDCAN_DLC_BYTES_8;
    //	 TX_Header2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
    //	 TX_Header2.FDFormat = FDCAN_FD_CAN;
    //	 TX_Header2.IdType = FDCAN_STANDARD_ID;
    //	 TX_Header2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
    //	 TX_Header2.TxFrameType = FDCAN_DATA_FRAME;
    //	 TX_Header2.MessageMarker = 0;
    //
    //	 if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &TX_Header2, data) != HAL_OK) return 1;
    //	 return 0;
    //
    // }
    
     uint8_t FDCAN_Receive_Message(FDCAN_HandleTypeDef *hfdcan, uint8_t *data )
     {
    	 if(HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RX_Header, data) != HAL_OK)
    	 {
    		 return 1;
    	 }
    	 return 0 ;
    
     }
    /* USER CODE END 0 */
    
    /**
     * @brief The application entry point.
     * @retval int
     */
    int main(void)
    {
     /* USER CODE BEGIN 1 */
    
     /* USER CODE END 1 */
    
     /* MCU Configuration--------------------------------------------------------*/
    
     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
     HAL_Init();
    
     /* USER CODE BEGIN Init */
    
     /* USER CODE END Init */
    
     /* Configure the system clock */
     SystemClock_Config();
    
     /* USER CODE BEGIN SysInit */
    
     /* USER CODE END SysInit */
    
     /* Initialize all configured peripherals */
     MX_GPIO_Init();
     MX_FDCAN1_Init();
     MX_FDCAN2_Init();
     /* USER CODE BEGIN 2 */
     if(FDCAN_Dual_Mode_Init(&hfdcan2) != 0){
     	 while(1);
     }
    
     /* USER CODE END 2 */
    
     /* Infinite loop */
     /* USER CODE BEGIN WHILE */
     while (1)
     {
     /* USER CODE END WHILE */
    
     /* USER CODE BEGIN 3 */
    	 if(FDCAN_Send_Message(&hfdcan1,TX_data_1,0x200) != 0 )
    	 {
    
    
    	 }
    	 HAL_Delay(10);
    	 if(FDCAN_Receive_Message(&hfdcan2, RX_data) != 0)
    	 {
    
    	 }
    	 HAL_Delay(1000);
    
    		if(FDCAN_Send_Message(&hfdcan1, TX_data_3,0x400) != 0 )
    		{
    
    		}
    		HAL_Delay(10);
    		if(FDCAN_Receive_Message(&hfdcan2, RX_data_1) != 0)
    		{
    
    		}
    		HAL_Delay(1000);
    
    	 if(FDCAN_Send_Message(&hfdcan1, TX_data_2,0x100) != 0 )
    	 	 {
    
    	 	 }
    	 HAL_Delay(10);
    	 if(FDCAN_Receive_Message(&hfdcan2, RX_data_2) != 0)
    	 {
    
    	 }
    	 HAL_Delay(1000);
    
    
     }
     /* USER CODE END 3 */
    }
    
    /**
     * @brief System Clock Configuration
     * @retval None
     */
    void SystemClock_Config(void)
    {
     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
     /** Supply configuration update enable
     */
     HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
    
     /** Configure the main internal regulator output voltage
     */
     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
    
     while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
    
     /** Initializes the RCC Oscillators according to the specified parameters
     * in the RCC_OscInitTypeDef structure.
     */
     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
     RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
     RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
     RCC_OscInitStruct.PLL.PLLM = 4;
     RCC_OscInitStruct.PLL.PLLN = 60;
     RCC_OscInitStruct.PLL.PLLP = 4;
     RCC_OscInitStruct.PLL.PLLQ = 16;
     RCC_OscInitStruct.PLL.PLLR = 2;
     RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
     RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
     RCC_OscInitStruct.PLL.PLLFRACN = 0;
     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
     {
     Error_Handler();
     }
    
     /** Initializes the CPU, AHB and APB buses clocks
     */
     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
     |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
     |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
     RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
     RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
     RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;
     RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
     RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
     RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
    
     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
     {
     Error_Handler();
     }
    }
    
    /**
     * @brief FDCAN1 Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_FDCAN1_Init(void)
    {
    
     /* USER CODE BEGIN FDCAN1_Init 0 */
    
     /* USER CODE END FDCAN1_Init 0 */
    
     /* USER CODE BEGIN FDCAN1_Init 1 */
    
     /* USER CODE END FDCAN1_Init 1 */
     hfdcan1.Instance = FDCAN1;
     hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
     hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
     hfdcan1.Init.AutoRetransmission = DISABLE;
     hfdcan1.Init.TransmitPause = DISABLE;
     hfdcan1.Init.ProtocolException = DISABLE;
     hfdcan1.Init.NominalPrescaler = 10;
     hfdcan1.Init.NominalSyncJumpWidth = 1;
     hfdcan1.Init.NominalTimeSeg1 = 2;
     hfdcan1.Init.NominalTimeSeg2 = 2;
     hfdcan1.Init.DataPrescaler = 1;
     hfdcan1.Init.DataSyncJumpWidth = 1;
     hfdcan1.Init.DataTimeSeg1 = 1;
     hfdcan1.Init.DataTimeSeg2 = 1;
     hfdcan1.Init.MessageRAMOffset = 0;
     hfdcan1.Init.StdFiltersNbr = 1;
     hfdcan1.Init.ExtFiltersNbr = 0;
     hfdcan1.Init.RxFifo0ElmtsNbr = 1;
     hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan1.Init.RxFifo1ElmtsNbr = 0;
     hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan1.Init.RxBuffersNbr = 0;
     hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
     hfdcan1.Init.TxEventsNbr = 0;
     hfdcan1.Init.TxBuffersNbr = 0;
     hfdcan1.Init.TxFifoQueueElmtsNbr = 1;
     hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
     hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
     if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
     {
     Error_Handler();
     }
     /* USER CODE BEGIN FDCAN1_Init 2 */
    
     /* USER CODE END FDCAN1_Init 2 */
    
    }
    
    /**
     * @brief FDCAN2 Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_FDCAN2_Init(void)
    {
    
     /* USER CODE BEGIN FDCAN2_Init 0 */
    
     /* USER CODE END FDCAN2_Init 0 */
    
     /* USER CODE BEGIN FDCAN2_Init 1 */
    
     /* USER CODE END FDCAN2_Init 1 */
     hfdcan2.Instance = FDCAN2;
     hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_NO_BRS;
     hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
     hfdcan2.Init.AutoRetransmission = DISABLE;
     hfdcan2.Init.TransmitPause = DISABLE;
     hfdcan2.Init.ProtocolException = DISABLE;
     hfdcan2.Init.NominalPrescaler = 10;
     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.MessageRAMOffset = 0;
     hfdcan2.Init.StdFiltersNbr = 5;
     hfdcan2.Init.ExtFiltersNbr = 0;
     hfdcan2.Init.RxFifo0ElmtsNbr = 1;
     hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan2.Init.RxFifo1ElmtsNbr = 1;
     hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
     hfdcan2.Init.RxBuffersNbr = 0;
     hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
     hfdcan2.Init.TxEventsNbr = 0;
     hfdcan2.Init.TxBuffersNbr = 0;
     hfdcan2.Init.TxFifoQueueElmtsNbr = 1;
     hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
     hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
     if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
     {
     Error_Handler();
     }
     /* USER CODE BEGIN FDCAN2_Init 2 */
    
     /* USER CODE END FDCAN2_Init 2 */
    
    }
    
    /**
     * @brief GPIO Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_GPIO_Init(void)
    {
    /* USER CODE BEGIN MX_GPIO_Init_1 */
    /* USER CODE END MX_GPIO_Init_1 */
    
     /* GPIO Ports Clock Enable */
     __HAL_RCC_GPIOB_CLK_ENABLE();
     __HAL_RCC_GPIOA_CLK_ENABLE();
    
    /* USER CODE BEGIN MX_GPIO_Init_2 */
    /* USER CODE END MX_GPIO_Init_2 */
    }
    
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
     * @brief This function is executed in case of error occurrence.
     * @retval None
     */
    void Error_Handler(void)
    {
     /* USER CODE BEGIN Error_Handler_Debug */
     /* User can add his own implementation to report the HAL error return state */
     __disable_irq();
     while (1)
     {
     }
     /* USER CODE END Error_Handler_Debug */
    }
    
    #ifdef USE_FULL_ASSERT
    /**
     * @brief Reports the name of the source file and the source line number
     * where the assert_param error has occurred.
     * @PAram file: pointer to the source file name
     * @PAram line: assert_param error line source number
     * @retval None
     */
    void assert_failed(uint8_t *file, uint32_t line)
    {
     /* USER CODE BEGIN 6 */
     /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
     /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */