cancel
Showing results for 
Search instead for 
Did you mean: 

No stuffing bit with HAL_CAN on STM32f4

AGiry.2
Associate II

Hello, I m using the CAN bus on a STM32f412. It is connected to a transiver with a CAN analyser linked. I can receive messages without problem but i can t send any messages. Here is ho i configured the CAN :

/*##-1- Configure the CAN peripheral #######################################*/
hcan.Instance = CAN1;
hcan.Init.Prescaler = 10;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_3TQ;
hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority = ENABLE;
	
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
    while(1);
}
	
CAN_FilterTypeDef filter = {0};
filter.FilterIdHigh = 0;
filter.FilterIdLow = 0;
filter.FilterMaskIdHigh = 0;
filter.FilterMaskIdLow = 0;
filter.FilterFIFOAssignment = CAN_RX_FIFO0;
filter.FilterBank = 0;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterActivation = ENABLE;
filter.SlaveStartFilterBank = 14;
 
if(HAL_CAN_ConfigFilter(&hcan, &filter) != HAL_OK)
{
    while(1);
}
 /*##-3- Start the CAN peripheral ###########################################*/
if(HAL_CAN_Start(&hcan) != HAL_OK)
{
    while(1);
}
/*##-4- Activate CAN RX notification #######################################*/
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
    while(1);
}

in stm32f4xx_hal_msp.c, i have this for the CAN :

void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hcan->Instance==CAN1)
  {
  /* USER CODE BEGIN CAN1_MspInit 0 */
 
  /* USER CODE END CAN1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**CAN1 GPIO Configuration
    PA11     ------> CAN1_RX
    PA12     ------> CAN1_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
    /* CAN1 interrupt Init */
    HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
  /* USER CODE BEGIN CAN1_MspInit 1 */
 
  /* USER CODE END CAN1_MspInit 1 */
  }
}

and when i want to transmit, i do this :

TxHeader.StdId = 0x555;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.IDE = CAN_ID_STD;
TxHeader.DLC = 8;
TxHeader.TransmitGlobalTime = DISABLE;
for(int i = 0; i < 8; i++)TxData[i] = 0x1;
  
  /* Request transmission */
if(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 3)
{
	HAL_CAN_AbortTxRequest(&hcan, 0); 
	HAL_CAN_AbortTxRequest(&hcan, 1); 
	HAL_CAN_AbortTxRequest(&hcan, 2); 
}
HAL_GPIO_TogglePin(LED_vie_Port, LED_vie_Pin);
if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK) 
{
    /* Transmission request Error */
    Error_Handler();
}

When i try so see frames with an osciloscope i get this :

0693W00000JQ3lXQAT.pngSo you can see the communication abort too early and i think it's because ther isn t stuffing bit.

2 REPLIES 2
Bouraoui Chemli
ST Employee

It seems there is no error in your code. Can you please share your project, the clock source and the baud rate to further check the configuration ?

Also, you can refer to CAN example provided in STM32CubeF4 via this link STM32Cube\Repository\STM32Cube_FW_F4_V1.x.y\Projects\STM324xG_EVAL\Examples\CAN\CAN_Networking

I suggest to run this example on your desk.

Bouraoui

Unfortunately, i can t send the whole project. but here is the clock configuration :

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 CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 100;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  RCC_OscInitStruct.PLL.PLLR = 2;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
  /** 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;
 
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);
 
}

And the baud rate is at 1Mbit/s.

I also tested the same configuration in loopback mode and here i hadn't any problem, i received and sent valid frames. Moreover i had the good signal on Rx and Tx pin.