/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file can.c * @brief This file provides code for the configuration * of the CAN instances. ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "can.h" /* USER CODE BEGIN 0 */ CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; CAN_FilterTypeDef sFilterConfig; uint8_t msgDataSend[8]; uint32_t mailBoxNum = 0; /* USER CODE END 0 */ CAN_HandleTypeDef hcan2; /* CAN2 init function */ void MX_CAN2_Init(void) { /* USER CODE BEGIN CAN2_Init 0 */ /* USER CODE END CAN2_Init 0 */ /* USER CODE BEGIN CAN2_Init 1 */ /* USER CODE END CAN2_Init 1 */ hcan2.Instance = CAN2; hcan2.Init.Prescaler = 20; hcan2.Init.Mode = CAN_MODE_NORMAL; hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan2.Init.TimeSeg1 = CAN_BS1_10TQ; hcan2.Init.TimeSeg2 = CAN_BS2_5TQ; hcan2.Init.TimeTriggeredMode = DISABLE; hcan2.Init.AutoBusOff = DISABLE; hcan2.Init.AutoWakeUp = DISABLE; hcan2.Init.AutoRetransmission = DISABLE; hcan2.Init.ReceiveFifoLocked = DISABLE; hcan2.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN CAN2_Init 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(&hcan2, &sFilterConfig) != HAL_OK) { Error_Handler(); } TxHeader.StdId = 0x300; TxHeader.ExtId = 0x11000BE4; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = DISABLE; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_EXT; if(HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { Error_Handler(); } if(HAL_CAN_ActivateNotification(&hcan2, CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK) { Error_Handler(); } /* USER CODE END CAN2_Init 2 */ } void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(canHandle->Instance==CAN2) { /* USER CODE BEGIN CAN2_MspInit 0 */ /* USER CODE END CAN2_MspInit 0 */ /* CAN2 clock enable */ __HAL_RCC_CAN2_CLK_ENABLE(); __HAL_RCC_CAN1_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**CAN2 GPIO Configuration PB12 ------> CAN2_RX PB13 ------> CAN2_TX */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; 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_CAN2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* CAN2 interrupt Init */ HAL_NVIC_SetPriority(CAN2_TX_IRQn, 0, 0); HAL_NVIC_EnableIRQ(CAN2_TX_IRQn); HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn); /* USER CODE BEGIN CAN2_MspInit 1 */ /* USER CODE END CAN2_MspInit 1 */ } } void HAL_CAN_MspDeInit(CAN_HandleTypeDef* canHandle) { if(canHandle->Instance==CAN2) { /* USER CODE BEGIN CAN2_MspDeInit 0 */ /* USER CODE END CAN2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_CAN2_CLK_DISABLE(); __HAL_RCC_CAN1_CLK_DISABLE(); /**CAN2 GPIO Configuration PB12 ------> CAN2_RX PB13 ------> CAN2_TX */ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13); /* CAN2 interrupt Deinit */ HAL_NVIC_DisableIRQ(CAN2_TX_IRQn); HAL_NVIC_DisableIRQ(CAN2_RX0_IRQn); /* USER CODE BEGIN CAN2_MspDeInit 1 */ /* USER CODE END CAN2_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ int CAN_send(uint16_t data[], int Addr) { int wait = 1000; while(wait-- && (HAL_CAN_GetTxMailboxesFreeLevel(&hcan2) == 0)); if (HAL_CAN_GetTxMailboxesFreeLevel(&hcan2) != 0) { msgDataSend[4] = 0xE0|(Addr >>8) & 0x001f; msgDataSend[5] = ( Addr ) & 0x00ff; msgDataSend[6] = (data[Addr ]>>8) & 0x00ff; msgDataSend[7] = (data[Addr ] ) & 0x00ff; msgDataSend[0] = (data[Addr+1]>>8) & 0x00ff; msgDataSend[1] = (data[Addr+1] ) & 0x00ff; msgDataSend[2] = (data[Addr+2]>>8) & 0x00ff; msgDataSend[3] = (data[Addr+2] ) & 0x00ff; HAL_CAN_AddTxMessage(&hcan2, &TxHeader, msgDataSend, &mailBoxNum); return 1; } else { HAL_CAN_Stop(&hcan2); HAL_CAN_Start(&hcan2); return 0; } } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan_i) { CAN_RxHeaderTypeDef msgHeader; uint8_t msgData[8]; HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &msgHeader, msgData); Led_1_TGL; } void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { // HAL_CAN_ERROR_TX_ALST0 & HAL_CAN_ERROR_TX_TERR0; hcan->ErrorCode &= ~(HAL_CAN_ERROR_TX_ALST0|HAL_CAN_ERROR_TX_TERR0); if(fif0_cownt) { fif0_cownt--; CAN_send((uint16_t *)pissa, 0); } } void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) { if(fif0_cownt) { fif0_cownt--; CAN_send((uint16_t *)pissa, 0); } } void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) { if(fif0_cownt) { fif0_cownt--; CAN_send((uint16_t *)pissa, 0); } } /* USER CODE END 1 */