Skip to main content
yldzmuhammed
Associate III
September 14, 2022
Question

STM32G431 Classic CAN Not Working

  • September 14, 2022
  • 1 reply
  • 1442 views

Hello everyone,

I am trying to create a CAN project with STM32G431C8 . But there is no data in CANTX pin.

I created init codes with CubeMX and codes are below.

Here is main function;

/**
 * @brief The application entry point.
 * @retval int
 */
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_FDCAN1_Init();
// MX_I2C2_Init();
// MX_SPI1_Init();
// MX_TIM4_Init();
// MX_TIM7_Init();
// MX_USART2_UART_Init();
 /* USER CODE BEGIN 2 */
//	main_canopen();
 FDCAN_Config();
 
//	GPIO_InitTypeDef GPIO_InitStruct = {0};
//	GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
//	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
//	GPIO_InitStruct.Pull = GPIO_NOPULL;
//	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
//	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /* USER CODE END 2 */
//HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData);
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	 HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
	 HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
	 
//	 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_11 | GPIO_PIN_12);
 
	/* Set the data to be transmitted */
	TxData[0] = 0x55;//ubKeyNumber1;
	TxData[1] = 0x56;
	TxData[2] = 0x57;
	TxData[3] = 0x58;
	TxData[4] = 0x59;
	TxData[5] = 0x5A;
	TxData[6] = 0x5A;
	++TxData[7];
 
	/* Start the Transmission process */
	if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK)
	{
		++ubKeyNumber1;
		
//		if (ubKeyNumber1 == 0x4)
//		{
//			ubKeyNumber1 = 0x00;
//		}
		
		/* Transmission request Error */
//		Error_Handler();
	}
	else
	{
		++ubKeyNumber2;
	}
	
	HAL_Delay(delay);
 /* USER CODE END WHILE */
 
 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}

fdcan.c file content;

FDCAN_HandleTypeDef hfdcan1;
 
/* FDCAN1 init function */
void MX_FDCAN1_Init(void)
{
 
 /* USER CODE BEGIN FDCAN1_Init 0 */
 
 /* USER CODE END FDCAN1_Init 0 */
 
 /* USER CODE BEGIN FDCAN1_Init 1 */
 
 /* USER CODE END FDCAN1_Init 1 */
 hfdcan1.Instance = FDCAN1;
 hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
 hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
 hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
 hfdcan1.Init.AutoRetransmission = ENABLE;
 hfdcan1.Init.TransmitPause = DISABLE;
 hfdcan1.Init.ProtocolException = DISABLE;
 hfdcan1.Init.NominalPrescaler = 1;
 hfdcan1.Init.NominalSyncJumpWidth = 4;
 hfdcan1.Init.NominalTimeSeg1 = 63;
 hfdcan1.Init.NominalTimeSeg2 = 16;
 hfdcan1.Init.DataPrescaler = 1;
 hfdcan1.Init.DataSyncJumpWidth = 1;
 hfdcan1.Init.DataTimeSeg1 = 5;
 hfdcan1.Init.DataTimeSeg2 = 4;
 hfdcan1.Init.StdFiltersNbr = 1;
 hfdcan1.Init.ExtFiltersNbr = 0;
 hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
 if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN FDCAN1_Init 2 */
 
 /* USER CODE END FDCAN1_Init 2 */
 
}
 
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{
 
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 if(fdcanHandle->Instance==FDCAN1)
 {
 /* USER CODE BEGIN FDCAN1_MspInit 0 */
 
 /* USER CODE END FDCAN1_MspInit 0 */
 
 /** Initializes the peripherals clocks
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
 PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PCLK1;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* FDCAN1 clock enable */
 __HAL_RCC_FDCAN_CLK_ENABLE();
 
 __HAL_RCC_GPIOA_CLK_ENABLE();
 /**FDCAN1 GPIO Configuration
 PA11 ------> FDCAN1_RX
 PA12 ------> FDCAN1_TX
 */
 GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 /* FDCAN1 interrupt Init */
 HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
 HAL_NVIC_SetPriority(FDCAN1_IT1_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(FDCAN1_IT1_IRQn);
 /* USER CODE BEGIN FDCAN1_MspInit 1 */
 
 /* USER CODE END FDCAN1_MspInit 1 */
 }
}

FDCAN_Config function;

/**
 * @brief Configures the FDCAN.
 * @param None
 * @retval None
 */
static void FDCAN_Config(void)
{
 FDCAN_FilterTypeDef sFilterConfig;
 
 /* Configure Rx filter */
 sFilterConfig.IdType = FDCAN_STANDARD_ID;
 sFilterConfig.FilterIndex = 0;
 sFilterConfig.FilterType = FDCAN_FILTER_MASK;
 sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
 sFilterConfig.FilterID1 = 0x321;
 sFilterConfig.FilterID2 = 0x7FF;
 if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* Configure global filter:
 Filter all remote frames with STD and EXT ID
 Reject non matching frames with STD ID and EXT ID */
 if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* Start the FDCAN module */
 if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
 {
 Error_Handler();
 }
 
 if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
 {
 Error_Handler();
 }
 
 if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_EVT_FIFO_NEW_DATA, 0) != HAL_OK)
 {
 Error_Handler();
 }
 
 if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_EVT_FIFO_FULL, 0) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* Prepare Tx Header */
 TxHeader.Identifier = 0x321;
 TxHeader.IdType = FDCAN_STANDARD_ID;
 TxHeader.TxFrameType = FDCAN_DATA_FRAME;
 TxHeader.DataLength = FDCAN_DLC_BYTES_8;
 TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
 TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
 TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
 TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
 TxHeader.MessageMarker = 0;
}

BTW, I removed CAN transceiver from the circuit for testing porpuse.

Here is my test procedure;

  • I connect the Oscilloscope probes to the CAN Tx pin and CAN Rx pin and GND from my circuit.
  • Power the PCB.
  • I connect the debugger and start debugging.
  • Push the run button from Keil.
  • I expect to see some data on CAN Tx pin from Scop's screen. But there is nothing happing. BTW CAN Tx pin is high all the time.

I tried to test the GPIO pin (PA11, PA12) with normal Output feature and toggle it. There was no problem with toggling.

When i looked at the CAN RAM section, all the datas were there which i try to send.

And interrupt never occurs.

I also tried to load the example application from the CAN Classic folder but still there was no change.

What should i do to fix this? How can i run the CAN?

This topic has been closed for replies.

1 reply

yldzmuhammed
Associate III
September 16, 2022

Thank you so much for your reply Rachel.

You could do this from CubeProgrammer too.

But I did this configuration earlier. Thank you.