Skip to main content
Associate III
May 14, 2024
Solved

STM32F405RGT6 CAN Reception Problem

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.
mƎALLEm
mƎALLEmBest answer
ST 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;

 

 

To give better visibility on the answered topics, please click "Best answer" on the reply which solved your issue or answered your question.

9 replies

STUser34Author
Associate III
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. 

Karl Yamashita
Principal
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? 

If a reply has proven helpful, click on Accept as Solution so that it'll show at top of the post.CAN Jammer an open source CAN bus hacking toolCANableV3 Open Source
STUser34Author
Associate III
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ƎALLEm
mƎALLEmBest answer
ST 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;

 

 

To give better visibility on the answered topics, please click "Best answer" on the reply which solved your issue or answered your question.
mƎALLEm
ST 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.

To give better visibility on the answered topics, please click "Best answer" on the reply which solved your issue or answered your question.
STUser34Author
Associate III
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;
 }
}