cancel
Showing results for 
Search instead for 
Did you mean: 

HAL Library does not send can messages to stm32f103c8t6

André Conradt
Associate

Hello,

I am trying to use the HAL library to send data from a variable through CAN Network with interrupts. However my code is not sending data. Observing on the oscilloscope, the Tx Can pin is always on a high logic level. For this application I am using the stm32f103c8t6 microcontroller and the L9615D transceiver.

Could someone suggest what's wrong with my code?

I think I may have made some misconfiguration, I'm starting to work with the HAL library right now.

#include "main.h"

#include "stm32f1xx_hal.h"

CAN_HandleTypeDef hcan;

CanTxMsgTypeDef      TxM;

CanRxMsgTypeDef      RxM;   /*!< Pointer to reception structure for RX FIFO0 msg */

CAN_FilterConfTypeDef sFilterConfig;

int A;

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_CAN_Init(void);

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**

 * @brief The application entry point.

 *

 * @retval None

 */

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

 /* USER CODE BEGIN 2 */

 hcan.pTxMsg=&TxM;

 hcan.pRxMsg=&RxM;

 /* USER CODE END 2 */

 sFilterConfig.FilterNumber=0;

 sFilterConfig.FilterMode=CAN_FILTERMODE_IDLIST;

 sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT;

 sFilterConfig.FilterIdHigh=0x244<<5;

 sFilterConfig.FilterIdLow=0;

 sFilterConfig.FilterMaskIdHigh=0;

 sFilterConfig.FilterMaskIdLow=0;

 sFilterConfig.FilterFIFOAssignment=0;

 sFilterConfig.BankNumber=14;

 HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);

 hcan.pTxMsg->StdId=0x234;

 hcan.pTxMsg->RTR=CAN_RTR_DATA;

 hcan.pTxMsg->IDE=CAN_ID_STD;

 hcan.pTxMsg->DLC=1;

 HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

 /* USER CODE END WHILE */

  A= A+1;

  hcan.pTxMsg->Data[0]=A;

  HAL_CAN_Transmit(&hcan,100);

 /* USER CODE BEGIN 3 */

  HAL_Delay(200);

 /* USER CODE BEGIN 3 */

 }

 /* USER CODE END 3 */

}

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct;

 RCC_ClkInitTypeDef RCC_ClkInitStruct;

  /**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_NONE;

 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_HSI;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != 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);

}

/* CAN init function */

static void MX_CAN_Init(void)

{

 hcan.Instance = CAN1;

 hcan.Init.Prescaler = 16;

 hcan.Init.Mode = CAN_MODE_NORMAL;

 hcan.Init.SJW = CAN_SJW_1TQ;

 hcan.Init.BS1 = CAN_BS1_1TQ;

 hcan.Init.BS2 = CAN_BS2_1TQ;

 hcan.Init.TTCM = DISABLE;

 hcan.Init.ABOM = DISABLE;

 hcan.Init.AWUM = DISABLE;

 hcan.Init.NART = DISABLE;

 hcan.Init.RFLM = DISABLE;

 hcan.Init.TXFP = DISABLE;

 if (HAL_CAN_Init(&hcan) != 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_GPIOA_CLK_ENABLE();

 /*Configure GPIO pin : PC13 */

 GPIO_InitStruct.Pin = GPIO_PIN_13;

 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

 GPIO_InitStruct.Pull = GPIO_NOPULL;

 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

 * @brief This function is executed in case of error occurrence.

 * @param file: The file name as string.

 * @param line: The line in file as a number.

 * @retval None

 */

void _Error_Handler(char *file, int line)

{

 /* USER CODE BEGIN Error_Handler_Debug */

 /* User can add his own implementation to report the HAL error return state */

 while(1)

 {

 }

 /* USER CODE END Error_Handler_Debug */

}

#ifdef USE_FULL_ASSERT

/**

 * @brief Reports the name of the source file and the source line number

 *     where the assert_param error has occurred.

 * @param file: pointer to the source file name

 * @param line: assert_param error line source number

 * @retval None

 */

void assert_failed(uint8_t* file, uint32_t line)

 /* USER CODE BEGIN 6 */

 /* User can add his own implementation to report the file name and line number,

   tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

 /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

0 REPLIES 0