Skip to main content
Ksmol
Associate
September 21, 2019
Question

STM32F103C8T6 CAN receive interrupt not firing

  • September 21, 2019
  • 1 reply
  • 825 views

Hi,

I'm using an STM32F103C8T6 MCU with SN65HVD230 CAN transceiver to read can data. 500bps.

Bus is healthy, terminated and HAL initializes OK, but the receive interrupt never fires.

CAN_HandleTypeDef hcan;
 
CAN_FilterTypeDef sFilterConfig;
CAN_TxHeaderTypeDef *TxMessage;
CAN_RxHeaderTypeDef *RxMessage;
uint8_t TxData[8];
uint8_t RxData[8];
uint32_t TxMailbox;
 
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
static void MX_TIM1_Init(void);
 
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
 
 
void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB busses 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_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 {
 Error_Handler();
 }
}
 
static void MX_CAN_Init(void)
{
 
 /* USER CODE BEGIN CAN_Init 0 */
 
 /* USER CODE END CAN_Init 0 */
 
 /* USER CODE BEGIN CAN_Init 1 */
	 /* CAN filter init */
 
	sFilterConfig.FilterBank = 0;// 0..13 for CAN1, 14..27 for CAN2
	sFilterConfig.FilterFIFOAssignment = 0;
	sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
	sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
	sFilterConfig.FilterIdHigh = 0x0000;
	sFilterConfig.FilterIdLow= 0x0000;
	sFilterConfig.FilterMaskIdHigh = 0x0000;
	sFilterConfig.FilterMaskIdLow = 0x0000;
	sFilterConfig.FilterActivation = ENABLE;
	HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);
 
 /* USER CODE END CAN_Init 1 */
 hcan.Instance = CAN1;
 hcan.Init.Prescaler = 8;
 hcan.Init.Mode = CAN_MODE_NORMAL;
 hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
 hcan.Init.TimeSeg1 = CAN_BS1_5TQ;
 hcan.Init.TimeSeg2 = CAN_BS2_3TQ;
 hcan.Init.TimeTriggeredMode = DISABLE;
 hcan.Init.AutoBusOff = DISABLE;
 hcan.Init.AutoWakeUp = DISABLE;
 hcan.Init.AutoRetransmission = DISABLE;
 hcan.Init.ReceiveFifoLocked = DISABLE;
 hcan.Init.TransmitFifoPriority = DISABLE;
 if (HAL_CAN_Init(&hcan) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN CAN_Init 2 */
 
 /* USER CODE END CAN_Init 2 */
 
}
 
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
 {
	 TFT9341_String(80,120,ORANGE,BLACK,"GOT CAN DATA",2);
 HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, RxMessage, RxData);
 TFT9341_DrawCircle(119,159,5,RED,1);
 
 if(RxData > 0)
 {
 	 Read_CAN_Message();
 }
 
 }

Thank you

This topic has been closed for replies.

1 reply

Ksmol
KsmolAuthor
Associate
September 26, 2019

any ideas?

AKilo
Associate
October 16, 2019

Did you allow interrupts?