cancel
Showing results for 
Search instead for 
Did you mean: 

interrupt on can bus with STM32f446

fab04
Associate III

Hi everybody,

I'm trying to set up a communication with a can bus.

I'm using a STM32F446. I use PB12 & PB13 (CAN2). I can see RX frames on PB12.

I'd like to read frames that I received by using interrupts.

I've found this example : https://github.com/STMicroelectronics/STM32CubeL4/blob/master/Projects/STM32L476G-EVAL/Examples/CAN/CAN_Networking/Src/main.c

But, I have put a breakpoint on the interrupt, but it never goes in.

static void MX_CAN2_Init(void)
{

  /* USER CODE BEGIN CAN2_Init 0 */
	CAN_FilterTypeDef  sFilterConfig2;
  /* USER CODE END CAN2_Init 0 */

  /* USER CODE BEGIN CAN2_Init 1 */

  /* USER CODE END CAN2_Init 1 */
  hcan2.Instance = CAN2;
  hcan2.Init.Prescaler = 12;
  hcan2.Init.Mode = CAN_MODE_NORMAL;
  hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan2.Init.TimeSeg1 = CAN_BS1_8TQ;
  hcan2.Init.TimeSeg2 = CAN_BS2_6TQ;
  hcan2.Init.TimeTriggeredMode = DISABLE;
  hcan2.Init.AutoBusOff = DISABLE;
  hcan2.Init.AutoWakeUp = DISABLE;
  hcan2.Init.AutoRetransmission = DISABLE;
  hcan2.Init.ReceiveFifoLocked = DISABLE;
  hcan2.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN2_Init 2 */
  /*##-2- Configure the CAN Filter ###########################################*/
  sFilterConfig2.FilterBank = 0;
  sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig2.FilterIdHigh = 0x0000;
  sFilterConfig2.FilterIdLow = 0x0000;
  sFilterConfig2.FilterMaskIdHigh = 0x0000;
  sFilterConfig2.FilterMaskIdLow = 0x0000;
  sFilterConfig2.FilterFIFOAssignment = CAN_RX_FIFO0;
  sFilterConfig2.FilterActivation = ENABLE;
  sFilterConfig2.SlaveStartFilterBank = 14;

  if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig2) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

  /*##-3- Start the CAN peripheral ###########################################*/
  if (HAL_CAN_Start(&hcan2) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

  /*##-4- Activate CAN RX notification #######################################*/
  if (HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  {
    /* Notification Error */
    Error_Handler();
  }
  /* USER CODE END CAN2_Init 2 */

 

/**
  * @brief  Rx Fifo 0 message pending callback
  * @PAram  hcan: pointer to a CAN_HandleTypeDef structure that contains
  *         the configuration information for the specified CAN.
  * @retval None
  */
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan2)
{
  /* Get RX message */
  if (HAL_CAN_GetRxMessage(hcan2, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
  {
    /* Reception Error */
    Error_Handler();
  }
}
/**
  * @brief This function handles CAN2 RX0 interrupt.
  */
void CAN2_RX0_IRQHandler(void)
{
  /* USER CODE BEGIN CAN2_RX0_IRQn 0 */

  /* USER CODE END CAN2_RX0_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan2);
  /* USER CODE BEGIN CAN2_RX0_IRQn 1 */

  /* USER CODE END CAN2_RX0_IRQn 1 */
}

 

If you have any suggestions, I'll be very happy.

Thank you.

1 ACCEPTED SOLUTION

Accepted Solutions

Thank you for your reply.

I've checked some points on my board.

The baudrate of my can bus is 250kbits (I've well measured this speed on the differential pairs), but when I do the measure on my transceiver (MCP2542), I haven't the right baudrate. After checking, I forgot to put STBY pin @ 0V. So now, this point is OK.

2nd thing, I've modify the filterbank (I need to spend time to well understand how it works).

And now, it works well.

Thank you.

 

 

View solution in original post

2 REPLIES 2

CAN2 would typically want to start with FilterBank 14 not zero.

If bit rate wrong you won't receive anything. Check if you need an error call back too.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

Thank you for your reply.

I've checked some points on my board.

The baudrate of my can bus is 250kbits (I've well measured this speed on the differential pairs), but when I do the measure on my transceiver (MCP2542), I haven't the right baudrate. After checking, I forgot to put STBY pin @ 0V. So now, this point is OK.

2nd thing, I've modify the filterbank (I need to spend time to well understand how it works).

And now, it works well.

Thank you.