Skip to main content
RahulR
Associate II
November 25, 2020
Question

I am unable to configure CAN in STM32L476VG Discovery board. I wanted to develop an application which sends CAN message and receives CAN message. I enabled 2 interrupts CAN1_TX_Interrupt, CAN1_RX0_Interrupt. I selected Normal Mode only .

  • November 25, 2020
  • 1 reply
  • 825 views

When debugging I found that MX_CAN1_Init() is not getting initialized, inside this code HAL_CAN_Init() is blocked by a while loop.

That blocking iteration is as follows

/* Get tick */

 tickstart = HAL_GetTick();

 /* Check Sleep mode leave acknowledge */

 while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)

 {

  if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)

  {

   /* Update error code */

   hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

   /* Change CAN state */

   hcan->State = HAL_CAN_STATE_ERROR;

   return HAL_ERROR;

  }

 }

I generated the start configuration using:

STM32CubeIDE

Version: 1.4.0

Build: 7511_20200720_0928 (UTC)

Firmwere STM32Cube FW_L4 V1.16.0

Can anyone please tell me the issue??

Code I used:

/* USER CODE BEGIN PV */

CAN_FilterTypeDef sFilterConfig;

CAN_TxHeaderTypeDef TxMessage;

CAN_RxHeaderTypeDef RxMessage;

uint8_t TxData[8];

uint8_t RxData[8];

uint32_t TxMailbox;

/* USER CODE END PV */

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

 /* USER CODE BEGIN 2 */

  sFilterConfig.FilterBank = 0;

   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

   sFilterConfig.FilterIdHigh = 0x0000;

   sFilterConfig.FilterIdLow = 0x0000;

   sFilterConfig.FilterMaskIdHigh = 0x0000;

   sFilterConfig.FilterMaskIdLow = 0x0000;

   sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

   sFilterConfig.FilterActivation = ENABLE;

   sFilterConfig.SlaveStartFilterBank = 14;

   if((HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)) != HAL_OK)

   {

  test1 = 1;

   Error_Handler();

   }

   if((HAL_CAN_Start(&hcan1)) != HAL_OK)

   {

   test2 = 10;

  Error_Handler();

   }

   if((HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_TX_MAILBOX_EMPTY)) != HAL_OK)

   {

   test3 = 100;

  Error_Handler();

   }

   TxMessage.StdId = 0x321;

   TxMessage.ExtId = 0x01;

   TxMessage.RTR  = CAN_RTR_DATA;

   TxMessage.IDE  = CAN_ID_STD;

   TxMessage.DLC  = 8;

   TxMessage.TransmitGlobalTime = DISABLE;

   TxData[0] = 1;

   TxData[1] = 2;

   TxData[2] = 3;

   TxData[3] = 4;

   TxData[4] = 5;

   TxData[5] = 6;

   TxData[6] = 7;

   TxData[7] = 8;

 /* USER CODE END 2 */

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

 HAL_CAN_AddTxMessage(&hcan1, &TxMessage, TxData, &TxMailbox);

 HAL_Delay(500);

 TxData[7] = TxData[7] + 1;

 }

 void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)

 {

 HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);

 }

 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)

 {

 HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxMessage, RxData);

 HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);

 }

 /* USER CODE END 3 */

}

This topic has been closed for replies.

1 reply

Technical Moderator
November 25, 2020

Hello @RahulR​ ,

Welcome to the STM32 Community :smiling_face_with_smiling_eyes:

I recommend you to refer and check the configuration of CAN example, compare the code/functions with yours and make updates according to your needs:

STM32Cube_FW_L4_V1.16.0\Projects\STM32L476G-EVAL\Examples\CAN\CAN_Networking

Imen

In order to give better visibility on the answered topics, please click on 'Best answer' on the reply which solved your issue or answered your question. Thanks
RahulR
RahulRAuthor
Associate II
November 26, 2020

Thank for the reply @Imen DAHMEN

Now HAL_CAN_Init() is working fine. When doing the debug it seems ok.

Now HAL_CAN_Start() and HAL_CAN_ActivateNotification() are not working. HAL_CAN_Start() function is trapped inside the following "wait the acknowledge " loop

 while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U)

  {

   /* Check for the Timeout */

   if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)

   {

    /* Update error code */

    hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

    /* Change CAN state */

    hcan->State = HAL_CAN_STATE_ERROR;

    return HAL_ERROR;

   }

  }

It returns the state other than (state == HAL_CAN_STATE_READY) || (state == HAL_CAN_STATE_LISTENING) ) , HAL_CAN_ActivateNotification() also getting failed.

What may be the issue? Please help me.