Skip to main content
JLoli
Associate II
October 31, 2018
Question

how to resolve CAN transmit error in STM32L452RE-P ?

  • October 31, 2018
  • 7 replies
  • 3073 views

i am getting error transmit error while using CAN in normal mode so if any work on that please let me know how to resolve

thank you in advanced

This topic has been closed for replies.

7 replies

Technical Moderator
October 31, 2018

Hello,

Could you please precise what are exactly the problems you faced?

I suggest you to check the working CAN example inside the STM32CubeL4 to compare the code with your own to identify what is going wrong:

At this path: STM32Cube_FW_L4_V1.13.0\Projects\STM32L476G-EVAL\Examples\CAN\CAN_Networking

Kind Regards,

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
JLoli
JLoliAuthor
Associate II
November 1, 2018

hello Mam

yes i can let you know what problem i am facing in a CAN driver while transmitting the data to one node to other node i am facing the transmission error so in that TERR0 flag is setting and not able to transmit data to the bus .

here i am attaching my code please review that and let me know what is the problem in it thank you for support in advanced .

below is my function for the can_polling

HAL_StatusTypeDef CAN_Polling(void)

{

 CAN_FilterTypeDef sFilterConfig;

  

 /*##-1- Configure the CAN peripheral #*/

 CanHandle.Instance = CAN1;

   

 CanHandle.Init.TimeTriggeredMode = DISABLE;

 CanHandle.Init.AutoBusOff = ENABLE;

 CanHandle.Init.AutoWakeUp = DISABLE;

 CanHandle.Init.AutoRetransmission = ENABLE;

 CanHandle.Init.ReceiveFifoLocked = DISABLE;

 CanHandle.Init.TransmitFifoPriority = DISABLE;

 CanHandle.Init.Mode = CAN_MODE_NORMAL;

 CanHandle.Init.SyncJumpWidth = CAN_SJW_1TQ;

 CanHandle.Init.TimeSeg1 = CAN_BS1_6TQ;

 CanHandle.Init.TimeSeg2 = CAN_BS2_2TQ;

 CanHandle.Init.Prescaler = 5;

  

 if(HAL_CAN_Init(&CanHandle) != HAL_OK)

 {

  /* Initialization Error */

  Error_Handler();

 }

 /*##-2- Configure the CAN Filter ##*/

 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(&CanHandle, &sFilterConfig) != HAL_OK)

 {

  /* Filter configuration Error */

  Error_Handler();

 }

 /*##-3- Start the CAN peripheral ##*/

 if (HAL_CAN_Start(&CanHandle) != HAL_OK)

 {

  /* Start Error */

  Error_Handler();

 }

 /*##-4- Start the Transmission process ##*/

 TxHeader.StdId = 0x11;

 TxHeader.RTR = CAN_RTR_DATA;

 TxHeader.IDE = CAN_ID_STD;

 TxHeader.DLC = 2;

 TxHeader.TransmitGlobalTime = DISABLE;

// TxData[8]=(uint8_t *)"afflaffl";

 TxData[0] = '1';

 TxData[1] = '2';

  

 /* Request transmission */

 if(HAL_CAN_AddTxMessage(&CanHandle, &TxHeader, TxData, &TxMailbox) != HAL_OK)

 {

  /* Transmission request Error */

  Error_Handler();

 }

  

 /* Wait transmission complete */

 while(HAL_CAN_GetTxMailboxesFreeLevel(&CanHandle) != 3) {}

 /*##-5- Start the Reception process ##*/

 if(HAL_CAN_GetRxFifoFillLevel(&CanHandle, CAN_RX_FIFO0) != 1)

 {

  /* Reception Missing */

  Error_Handler();

 }

 if(HAL_CAN_GetRxMessage(&CanHandle, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)

 {

  /* Reception Error */

  Error_Handler();

 }

 if((RxHeader.StdId != 0x11)           ||

   (RxHeader.RTR != CAN_RTR_DATA)        ||

   (RxHeader.IDE != CAN_ID_STD)         ||

   (RxHeader.DLC != 2)  )            

 //  ((RxData[0]<<8 | RxData[1]) != 0x))

 {

  /* Rx message Error */

  return HAL_ERROR;

 }

 return HAL_OK; /* Test Passed */

}

T J
Senior III
October 31, 2018

Do you have a line driver ?

do you have a slave device set to the same bus speed ?

do you have the terminator ?

JLoli
JLoliAuthor
Associate II
November 1, 2018

sorry but what is line driver ?

and yes i am having a slave device with the same bus speed and also connected the terminator res .

JLoli
JLoliAuthor
Associate II
November 1, 2018

sorry but what is line driver ?

and yes i am having a slave device with the same bus speed and also connected the terminator res .

T J
Senior III
November 1, 2018

you have to do initialise before while(1)

then you poll after while(1)

split up your code and repost it here...

If you cant do that, how can we help you ?

JLoli
JLoliAuthor
Associate II
November 1, 2018

initialization i am doing sir and that response i am able to see in related registers also

if(HAL_CAN_AddTxMessage(&CanHandle, &TxHeader, TxData, &TxMailbox) != HAL_OK) is function also working fine but after that one function named

while(HAL_CAN_GetTxMailboxesFreeLevel(&CanHandle) != 3) {}

i am stucking that is what the problem .

here i am attaching my whole main file kindly find and tell me thanks

#include "main.h"
#include "stm32l4xx_hal.h"
 
 
CAN_HandleTypeDef CanHandle;
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;
uint8_t TxData[8];
uint8_t RxData[8];
uint32_t TxMailbox;
 
static HAL_StatusTypeDef CAN_Polling(void);
 
 
/* Private variables ---------------------------------------------------------*/
CAN_HandleTypeDef hcan1;
 
UART_HandleTypeDef huart2;
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_CAN1_Init(void);
 
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
 
/**
 * @brief The application entry point.
 *
 * @retval None
 */
int main(void)
{
 
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 
 /* Configure the system clock */
 SystemClock_Config();
 
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_USART2_UART_Init();
 MX_CAN1_Init();
 
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
	
	while (1){
 		 if(CAN_Polling() == HAL_OK)
 {
 
// for(int i=0;i<100;i++);
 
	HAL_UART_Transmit(&huart2,(uint8_t *)RxData,2,100);
 }
 /* USER CODE END 3 */
 
}
}
/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
 
 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;
 RCC_PeriphCLKInitTypeDef PeriphClkInit;
 
 /**Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.HSICalibrationValue = 16;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 RCC_OscInitStruct.PLL.PLLM = 1;
 RCC_OscInitStruct.PLL.PLLN = 12;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
 RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 
 /**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_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV16;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 
 /**Configure the main internal regulator output voltage 
 */
 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 
 /**Configure the Systick interrupt time 
 */
 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 
 /**Configure the Systick 
 */
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 
 /* SysTick_IRQn interrupt configuration */
 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
 
/* CAN1 init function */
static void MX_CAN1_Init(void)
{
 
 hcan1.Instance = CAN1;
 hcan1.Init.Prescaler = 12;
 hcan1.Init.Mode = CAN_MODE_NORMAL;
 hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
 hcan1.Init.TimeSeg1 = CAN_BS1_13TQ;
 hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
 hcan1.Init.TimeTriggeredMode = DISABLE;
 hcan1.Init.AutoBusOff = DISABLE;
 hcan1.Init.AutoWakeUp = DISABLE;
 hcan1.Init.AutoRetransmission = DISABLE;
 hcan1.Init.ReceiveFifoLocked = DISABLE;
 hcan1.Init.TransmitFifoPriority = DISABLE;
 if (HAL_CAN_Init(&hcan1) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 
}
 
/* USART2 init function */
static void MX_USART2_UART_Init(void)
{
 
 huart2.Instance = USART2;
 huart2.Init.BaudRate = 115200;
 huart2.Init.WordLength = UART_WORDLENGTH_8B;
 huart2.Init.StopBits = UART_STOPBITS_1;
 huart2.Init.Parity = UART_PARITY_NONE;
 huart2.Init.Mode = UART_MODE_TX_RX;
 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
 huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&huart2) != HAL_OK)
 {
 _Error_Handler(__FILE__, __LINE__);
 }
 
}
 
/** Configure pins as 
 * Analog 
 * Input 
 * Output
 * EVENT_OUT
 * EXTI
*/
static void MX_GPIO_Init(void)
{
 
 GPIO_InitTypeDef GPIO_InitStruct;
 
 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOH_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 
 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(GPIOA, SMPS_EN_Pin|SMPS_V1_Pin|SMPS_SW_Pin, GPIO_PIN_RESET);
 
 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
 
 /*Configure GPIO pin : B1_Pin */
 GPIO_InitStruct.Pin = B1_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
 
 /*Configure GPIO pins : SMPS_EN_Pin SMPS_V1_Pin SMPS_SW_Pin */
 GPIO_InitStruct.Pin = SMPS_EN_Pin|SMPS_V1_Pin|SMPS_SW_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /*Configure GPIO pin : SMPS_PG_Pin */
 GPIO_InitStruct.Pin = SMPS_PG_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(SMPS_PG_GPIO_Port, &GPIO_InitStruct);
 
 /*Configure GPIO pin : LD4_Pin */
 GPIO_InitStruct.Pin = LD4_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(LD4_GPIO_Port, &GPIO_InitStruct);
 
}
 
/* USER CODE BEGIN 4 */
 
HAL_StatusTypeDef CAN_Polling(void)
{
 CAN_FilterTypeDef sFilterConfig;
 
 /*##-1- Configure the CAN peripheral #######################################*/
 CanHandle.Instance = CAN1;
 
 CanHandle.Init.TimeTriggeredMode = DISABLE;
 CanHandle.Init.AutoBusOff = ENABLE;
 CanHandle.Init.AutoWakeUp = DISABLE;
 CanHandle.Init.AutoRetransmission = ENABLE;
 CanHandle.Init.ReceiveFifoLocked = DISABLE;
 CanHandle.Init.TransmitFifoPriority = DISABLE;
 CanHandle.Init.Mode = CAN_MODE_NORMAL;
 CanHandle.Init.SyncJumpWidth = CAN_SJW_1TQ;
 CanHandle.Init.TimeSeg1 = CAN_BS1_6TQ;
 CanHandle.Init.TimeSeg2 = CAN_BS2_2TQ;
 CanHandle.Init.Prescaler = 5;
 
 if(HAL_CAN_Init(&CanHandle) != HAL_OK)
 {
 /* Initialization Error */
 Error_Handler();
 }
 
 /*##-2- Configure the CAN Filter ###########################################*/
 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(&CanHandle, &sFilterConfig) != HAL_OK)
 {
 /* Filter configuration Error */
 Error_Handler();
 }
 
 /*##-3- Start the CAN peripheral ###########################################*/
 if (HAL_CAN_Start(&CanHandle) != HAL_OK)
 {
 /* Start Error */
 Error_Handler();
 }
 
 /*##-4- Start the Transmission process #####################################*/
 TxHeader.StdId = 0x11;
 TxHeader.RTR = CAN_RTR_DATA;
 TxHeader.IDE = CAN_ID_STD;
 TxHeader.DLC = 2;
 TxHeader.TransmitGlobalTime = DISABLE;
//	TxData[8]=(uint8_t *)"afflaffl";
 TxData[0] = '1';
 TxData[1] = '2';
 
 /* Request transmission */
 if(HAL_CAN_AddTxMessage(&CanHandle, &TxHeader, TxData, &TxMailbox) != HAL_OK)
 {
 /* Transmission request Error */
 Error_Handler();
 }
 
 /* Wait transmission complete */
 while(HAL_CAN_GetTxMailboxesFreeLevel(&CanHandle) != 3) {}
 
 /*##-5- Start the Reception process ########################################*/
 if(HAL_CAN_GetRxFifoFillLevel(&CanHandle, CAN_RX_FIFO0) != 1)
 {
 /* Reception Missing */
 Error_Handler();
 }
 
 if(HAL_CAN_GetRxMessage(&CanHandle, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
 {
 /* Reception Error */
 Error_Handler();
 }
 
 if((RxHeader.StdId != 0x11) ||
 (RxHeader.RTR != CAN_RTR_DATA) ||
 (RxHeader.IDE != CAN_ID_STD) ||
 (RxHeader.DLC != 2) ) 
 // ((RxData[0]<<8 | RxData[1]) != 0x))
 {
 /* Rx message Error */
 return HAL_ERROR;
 }
 
 return HAL_OK; /* Test Passed */
}

T J
Senior III
November 1, 2018

I don't use those HAL functions...

did you find an example ?

do you have an external dongle? (I used the CanDo unit)

I suggest you set your external Can device to transmit every 1 second, then work on receiving a frame.

Can you do that ?

The examples should work but they can be touchy...

that's why you set an external unit to transmit first.

Did you look on the scope ? do you have a scope ?

JLoli
JLoliAuthor
Associate II
November 1, 2018

yes i found example code for some different stm mcu and crossed checked code with that both are same only but dont know that code is right or not cause i did not checked that as i dont have that MCU with me .

and ya i can transmit frame with every second but after transmission it is checking that anyfifo is free or not at that time i am getting ERROR . for receiving side also first it should check that any receivefifo is empty or not than it will receives data but in that function i am stucking i tried that also

T J
Senior III
November 1, 2018

this section has to be before while(1), not in CanPolling,

 /*##-1- Configure the CAN peripheral #######################################*/
 CanHandle.Instance = CAN1;
 
 CanHandle.Init.TimeTriggeredMode = DISABLE;
 CanHandle.Init.AutoBusOff = ENABLE;
 CanHandle.Init.AutoWakeUp = DISABLE;
 CanHandle.Init.AutoRetransmission = ENABLE;
 CanHandle.Init.ReceiveFifoLocked = DISABLE;
 CanHandle.Init.TransmitFifoPriority = DISABLE;
 CanHandle.Init.Mode = CAN_MODE_NORMAL;
 CanHandle.Init.SyncJumpWidth = CAN_SJW_1TQ;
 CanHandle.Init.TimeSeg1 = CAN_BS1_6TQ;
 CanHandle.Init.TimeSeg2 = CAN_BS2_2TQ;
 CanHandle.Init.Prescaler = 5;
 
 if(HAL_CAN_Init(&CanHandle) != HAL_OK)
 {
 /* Initialization Error */
 Error_Handler();
 }
 
 /*##-2- Configure the CAN Filter ###########################################*/
 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(&CanHandle, &sFilterConfig) != HAL_OK)
 {
 /* Filter configuration Error */
 Error_Handler();
 }
 
 /*##-3- Start the CAN peripheral ###########################################*/
 if (HAL_CAN_Start(&CanHandle) != HAL_OK)
 {
 /* Start Error */
 Error_Handler();
 }

then here this is way tooo fast...

add delay in here

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
	
	while (1){
 		 if(CAN_Polling() == HAL_OK)
 {
 
// for(int i=0;i<100;i++);
 
	HAL_UART_Transmit(&huart2,(uint8_t *)RxData,2,100);
 
delay here somehow //delay 1 second 
 
 
 
 }
 /* USER CODE END 3 */

JLoli
JLoliAuthor
Associate II
November 1, 2018

ok i will try thank you

T J
Senior III
November 1, 2018

how do you know you transmit ? do you have a scope ?