Skip to main content
Graduate
May 14, 2024
Solved

STM32F405RGT6 CAN Reception Problem

  • May 14, 2024
  • 3 replies
  • 2279 views

I have been trying to resolve the issue for receiving the CAN interrupt but not able to find the root cause.

Hardware is a custom board micro is STM32F405RGT6 i am using CAN1 for CAN communication with 500 Kbps.

Able to transmit message CAN message using polling method. I am transmitting CAN messages from Peak CAN tool but not able to hit the receive interrupt.

Few observations after reset, the DBF bit is set, will it be a problem?

1.

STUser34_0-1715707247933.png

2.I have the Tx interrupt enabled

STUser34_1-1715707347339.png

But the TMEIE bit is not set after calling the MX_NVIC_Init(void)

STUser34_3-1715707652000.png

Coming to the actual problem the FMPIE0 bit is set and i am sending the messages at 1sec interval 

STUser34_4-1715707732840.png

FMP0 is always 0. What is the problem?

 

int main(void)
{

 /* USER CODE BEGIN 1 */
	/* USER CODE BEGIN 1 */
		TxHeader.IDE = CAN_ID_STD;
		TxHeader.StdId = 0x7df;
		TxHeader.RTR = CAN_RTR_DATA;
		TxHeader.DLC = 8;

		TxData[0] = 8;
		TxData[1] = 2;
		TxData[2] = 1;
		TxData[3] = 0xd;
		TxData[4] = 0;
		TxData[5] = 0;
		TxData[6] = 0;
		TxData[7] = 0;
		TxData[0] = 8;

		TxData1[0] = 8;
		TxData1[1] = 2;
		TxData1[2] = 1;
		TxData1[3] = 0x11;
		TxData1[4] = 0;
		TxData1[5] = 0;
		TxData1[6] = 0;
		TxData1[7] = 0;

 /* 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_CAN1_Init();

 /* Initialize interrupts */
 MX_NVIC_Init();
 /* USER CODE BEGIN 2 */
 CanFilter();
 /*To activate receive notification */
 if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
 {
 Error_Handler();
 }


 if (HAL_CAN_Start(&hcan1) != HAL_OK)
 {
 Error_Handler();
 }


 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);
 if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK)
 {
	 Error_Handler ();
 }
 HAL_Delay(1000);
 while(HAL_CAN_IsTxMessagePending(&hcan1, TxMailbox));

 if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData1, &TxMailbox) != HAL_OK)
 {
	Error_Handler ();
 }


 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}

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

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

 /** 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_ON;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 RCC_OscInitStruct.PLL.PLLM = 8;
 RCC_OscInitStruct.PLL.PLLN = 64;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
 RCC_OscInitStruct.PLL.PLLQ = 4;
 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

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

/**
 * @brief NVIC Configuration.
 * @retval None
 */
static void MX_NVIC_Init(void)
{
 /* FLASH_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(FLASH_IRQn);
 /* RCC_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(RCC_IRQn);
 /* CAN1_TX_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(CAN1_TX_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);
 /* CAN1_RX0_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
 /* CAN1_RX1_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
}

/**
 * @brief CAN1 Initialization Function
 * @PAram None
 * @retval None
 */
static void MX_CAN1_Init(void)
{

 /* USER CODE BEGIN CAN1_Init 0 */

 /* USER CODE END CAN1_Init 0 */

 /* USER CODE BEGIN CAN1_Init 1 */

 /* USER CODE END CAN1_Init 1 */
 hcan1.Instance = CAN1;
 hcan1.Init.Prescaler = 2;
 hcan1.Init.Mode = CAN_MODE_NORMAL;
 hcan1.Init.SyncJumpWidth = CAN_SJW_3TQ;
 hcan1.Init.TimeSeg1 = CAN_BS1_9TQ;
 hcan1.Init.TimeSeg2 = CAN_BS2_6TQ;
 hcan1.Init.TimeTriggeredMode = DISABLE;
 hcan1.Init.AutoBusOff = DISABLE;
 hcan1.Init.AutoWakeUp = DISABLE;
 hcan1.Init.AutoRetransmission = ENABLE;
 hcan1.Init.ReceiveFifoLocked = DISABLE;
 hcan1.Init.TransmitFifoPriority = DISABLE;
 if (HAL_CAN_Init(&hcan1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN CAN1_Init 2 */

 /* USER CODE END CAN1_Init 2 */

}

/**
 * @brief GPIO Initialization Function
 * @PAram None
 * @retval None
 */
static void MX_GPIO_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

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

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_3, GPIO_PIN_RESET);

 /*Configure GPIO pin : PC0 */
 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_PULLDOWN;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 /*Configure GPIO pin : PC3 */
 GPIO_InitStruct.Pin = GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

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

/* USER CODE BEGIN 4 */
void CanFilter(void)
{
	CAN_FilterTypeDef canfilterconfig;

	 canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
	 canfilterconfig.FilterBank = 18; // which filter bank to use from the assigned ones
	 canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
	 canfilterconfig.FilterIdHigh = 0x446<<5;
	 canfilterconfig.FilterIdLow = 0;
	 canfilterconfig.FilterMaskIdHigh = 0x446<<5;
	 canfilterconfig.FilterMaskIdLow = 0x0000;
	 canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
	 canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
	 canfilterconfig.SlaveStartFilterBank = 20; // how many filters to assign to the CAN1 (master can)

	 if (HAL_CAN_ConfigFilter(&hcan1, &canfilterconfig) != HAL_OK)
	 {
	 Error_Handler();
	 }
}

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
 if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
 {
 Error_Handler();
 }

 if ((RxHeader.StdId == 0x103))
 {
	 // datacheck = 1;
 }
}
/* USER CODE END 4 */

 

 

 

 

 

 

    This topic has been closed for replies.
    Best answer by mƎALLEm

    The image is not clear please share another one on which we can at least read the references.

    Also for your filter config set a "pass all messages" filter as the following:

     

    canfilterconfig.FilterIdHigh = 0;
    canfilterconfig.FilterIdLow = 0;
    canfilterconfig.FilterMaskIdHigh = 0;
    canfilterconfig.FilterMaskIdLow = 0;

     

     

    3 replies

    STUser34Author
    Graduate
    May 14, 2024

    The TMEIE bit is set if i use the function

     if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK)
     {
     Error_Handler();
     }

     

    still the problem of CAN Rx interrupt exists, the isr is not called. 

    Graduate II
    May 14, 2024

    Since it's a custom board, show us the schematic on how the CAN transceiver connection to the F405.

    Also have you tried loop back mode? 

    STUser34Author
    Graduate
    May 15, 2024

    I have not tried the loop back mode, i will try that as well. 

    STUser34_0-1715735984476.png

    I am not sure if the image is clear i will share the scanned image after some time.

    mƎALLEmAnswer
    Technical Moderator
    May 15, 2024

    The image is not clear please share another one on which we can at least read the references.

    Also for your filter config set a "pass all messages" filter as the following:

     

    canfilterconfig.FilterIdHigh = 0;
    canfilterconfig.FilterIdLow = 0;
    canfilterconfig.FilterMaskIdHigh = 0;
    canfilterconfig.FilterMaskIdLow = 0;

     

     

    Technical Moderator
    May 14, 2024

    Hello,

     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

    Please don't use HSI for CAN communication. Use HSE with an external crystal.

    STUser34Author
    Graduate
    May 15, 2024

     I have enabled the HSE but no luck, there is no receive interrupt triggered. 

     

    int main(void)
    {
    
     /* USER CODE BEGIN 1 */
    	/* USER CODE BEGIN 1 */
    		TxHeader.IDE = CAN_ID_STD;
    		TxHeader.StdId = 0x700;
    		TxHeader.RTR = CAN_RTR_DATA;
    		TxHeader.DLC = 8;
    
    		TxData[0] = 8;
    		TxData[1] = 2;
    		TxData[2] = 1;
    		TxData[3] = 0xd;
    		TxData[4] = 0;
    		TxData[5] = 0;
    		TxData[6] = 0;
    		TxData[7] = 0;
    		TxData[0] = 8;
    
    		TxData1[0] = 8;
    		TxData1[1] = 2;
    		TxData1[2] = 1;
    		TxData1[3] = 0x11;
    		TxData1[4] = 0;
    		TxData1[5] = 0;
    		TxData1[6] = 0;
    		TxData1[7] = 0;
    
     /* 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_CAN1_Init();
    
     /* Initialize interrupts */
     MX_NVIC_Init();
     /* USER CODE BEGIN 2 */
     CanFilter();
     /*To activate receive notification */
     if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
     {
     Error_Handler();
     }
    
     if (HAL_CAN_Start(&hcan1) != HAL_OK)
     {
     Error_Handler();
     }
    
    
     /* USER CODE END 2 */
    
     /* Infinite loop */
     /* USER CODE BEGIN WHILE */
     while (1)
     {
     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);
     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);
     if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK)
     {
    	 Error_Handler ();
     }
     HAL_Delay(1000);
     while(HAL_CAN_IsTxMessagePending(&hcan1, TxMailbox));
    
     if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData1, &TxMailbox) != HAL_OK)
     {
    	Error_Handler ();
     }
    
    
     /* USER CODE END WHILE */
    
     /* USER CODE BEGIN 3 */
     }
     /* USER CODE END 3 */
    }
    
    /**
     * @brief System Clock Configuration
     * @retval None
     */
    void SystemClock_Config(void)
    {
     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
     /** Configure the main internal regulator output voltage
     */
     __HAL_RCC_PWR_CLK_ENABLE();
     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    
     /** Initializes the RCC Oscillators according to the specified parameters
     * in the RCC_OscInitTypeDef structure.
     */
     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
     RCC_OscInitStruct.PLL.PLLM = 8;
     RCC_OscInitStruct.PLL.PLLN = 64;
     RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
     RCC_OscInitStruct.PLL.PLLQ = 4;
     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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
     {
     Error_Handler();
     }
    }
    
    /**
     * @brief NVIC Configuration.
     * @retval None
     */
    static void MX_NVIC_Init(void)
    {
     /* FLASH_IRQn interrupt configuration */
     HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
     HAL_NVIC_EnableIRQ(FLASH_IRQn);
     /* RCC_IRQn interrupt configuration */
     HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
     HAL_NVIC_EnableIRQ(RCC_IRQn);
     /* CAN1_RX0_IRQn interrupt configuration */
     HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 0, 0);
     HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
     /* CAN1_RX1_IRQn interrupt configuration */
     HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
     HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
    }
    
    /**
     * @brief CAN1 Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_CAN1_Init(void)
    {
    
     /* USER CODE BEGIN CAN1_Init 0 */
    
     /* USER CODE END CAN1_Init 0 */
    
     /* USER CODE BEGIN CAN1_Init 1 */
    
     /* USER CODE END CAN1_Init 1 */
     hcan1.Instance = CAN1;
     hcan1.Init.Prescaler = 2;
     hcan1.Init.Mode = CAN_MODE_NORMAL;
     hcan1.Init.SyncJumpWidth = CAN_SJW_3TQ;
     hcan1.Init.TimeSeg1 = CAN_BS1_9TQ;
     hcan1.Init.TimeSeg2 = CAN_BS2_6TQ;
     hcan1.Init.TimeTriggeredMode = DISABLE;
     hcan1.Init.AutoBusOff = DISABLE;
     hcan1.Init.AutoWakeUp = DISABLE;
     hcan1.Init.AutoRetransmission = ENABLE;
     hcan1.Init.ReceiveFifoLocked = DISABLE;
     hcan1.Init.TransmitFifoPriority = DISABLE;
     if (HAL_CAN_Init(&hcan1) != HAL_OK)
     {
     Error_Handler();
     }
     /* USER CODE BEGIN CAN1_Init 2 */
    
     /* USER CODE END CAN1_Init 2 */
    
    }
    
    /**
     * @brief GPIO Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_GPIO_Init(void)
    {
     GPIO_InitTypeDef GPIO_InitStruct = {0};
    /* USER CODE BEGIN MX_GPIO_Init_1 */
    /* USER CODE END MX_GPIO_Init_1 */
    
     /* GPIO Ports Clock Enable */
     __HAL_RCC_GPIOH_CLK_ENABLE();
     __HAL_RCC_GPIOC_CLK_ENABLE();
     __HAL_RCC_GPIOA_CLK_ENABLE();
     __HAL_RCC_GPIOB_CLK_ENABLE();
    
     /*Configure GPIO pin Output Level */
     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_3, GPIO_PIN_RESET);
    
     /*Configure GPIO pin : PC0 */
     GPIO_InitStruct.Pin = GPIO_PIN_0;
     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
     GPIO_InitStruct.Pull = GPIO_PULLDOWN;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
     /*Configure GPIO pin : PC3 */
     GPIO_InitStruct.Pin = GPIO_PIN_3;
     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
    /* USER CODE BEGIN MX_GPIO_Init_2 */
    /* USER CODE END MX_GPIO_Init_2 */
    }
    
    /* USER CODE BEGIN 4 */
    void CanFilter(void)
    {
    	CAN_FilterTypeDef canfilterconfig;
    
    	 canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
    	 canfilterconfig.FilterBank = 18; // which filter bank to use from the assigned ones
    	 canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    	 canfilterconfig.FilterIdHigh = 0x446<<5;
    	 canfilterconfig.FilterIdLow = 0;
    	 canfilterconfig.FilterMaskIdHigh = 0x446<<5;
    	 canfilterconfig.FilterMaskIdLow = 0x0000;
    	 canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
    	 canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
    	 canfilterconfig.SlaveStartFilterBank = 20; // how many filters to assign to the CAN1 (master can)
    
    	 if (HAL_CAN_ConfigFilter(&hcan1, &canfilterconfig) != HAL_OK)
    	 {
    	 Error_Handler();
    	 }
    }
    
    void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
    {
     if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
     {
     Error_Handler();
     }
    
     if ((RxHeader.StdId == 0x103))
     {
    	 // datacheck = 1;
     }
    }