2025-12-17 1:32 AM
Hi guys i have a nucleo h7A3Zi-q dev board . i am trying to receive CAN messges sent from ESP32 borads . esp is sending can frame by using SN65HVD232D. and i configured the FDCAN to receive the can messages . esp can is set at 500 kbits , and my stm configurations is like this
static void MX_FDCAN1_Init(void)
{
/* USER CODE BEGIN FDCAN1_Init 0 */
/* USER CODE END FDCAN1_Init 0 */
FDCAN_ClkCalUnitTypeDef sCcuConfig = {0};
/* USER CODE BEGIN FDCAN1_Init 1 */
/* USER CODE END FDCAN1_Init 1 */
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan1.Init.AutoRetransmission = DISABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
hfdcan1.Init.NominalPrescaler = 8;
hfdcan1.Init.NominalSyncJumpWidth = 1;
hfdcan1.Init.NominalTimeSeg1 = 13;
hfdcan1.Init.NominalTimeSeg2 = 2;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 1;
hfdcan1.Init.DataTimeSeg2 = 1;
hfdcan1.Init.MessageRAMOffset = 0;
hfdcan1.Init.StdFiltersNbr = 1;
hfdcan1.Init.ExtFiltersNbr = 0;
hfdcan1.Init.RxFifo0ElmtsNbr = 0;
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
hfdcan1.Init.RxFifo1ElmtsNbr = 0;
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
hfdcan1.Init.RxBuffersNbr = 0;
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
hfdcan1.Init.TxEventsNbr = 0;
hfdcan1.Init.TxBuffersNbr = 0;
hfdcan1.Init.TxFifoQueueElmtsNbr = 0;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
sCcuConfig.ClockDivider = FDCAN_CLOCK_DIV1;
sCcuConfig.MinOscClkPeriods = 0x00;
sCcuConfig.CalFieldLength = FDCAN_CALIB_FIELD_LENGTH_32;
sCcuConfig.TimeQuantaPerBitTime = 4;
sCcuConfig.WatchdogStartValue = 0x0000;
if (HAL_FDCAN_ConfigClockCalibration(&hfdcan1, &sCcuConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN FDCAN1_Init 2 */
/* USER CODE END FDCAN1_Init 2 */
}
void can_init(void)
{
if(can_h == NULL)
Error_Handler();
CanRxQueue = xQueueCreateStatic(16,sizeof(can_frame_t),ucQueueStorageArea,&xStaticQueue);
if (CanRxQueue == NULL)
Error_Handler();
sFilter.IdType = FDCAN_STANDARD_ID;
sFilter.FilterIndex = 0u;
sFilter.FilterID1 = 0;
sFilter.FilterID2 = 0x1FFFFFFF;
sFilter.FilterType = FDCAN_FILTER_RANGE;
sFilter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
//sFilter.RxBufferIndex = FDCAN_FILTER_TO_RXBUFFER;
if(HAL_FDCAN_ConfigFilter(can_h,&sFilter)!= HAL_OK){
Error_Handler();
}
if(HAL_FDCAN_Start(can_h) != HAL_OK){
Error_Handler();
}
if(HAL_FDCAN_ActivateNotification(can_h,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0)!=HAL_OK){
Error_Handler();
}
printf("can initialized \n");
}
void HAL_FDCAN_RxFifoCallback(FDCAN_HandleTypeDef *hfdcan,uint32_t RxFifo0ITs)
{
printf("can callback \n");
Error_Handler();
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
if(HAL_FDCAN_GetRxMessage(can_h, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
/* Reception Error */
Error_Handler();
rxdata.can_id = RxHeader.Identifier;
rxdata.can_dlc = RxHeader.DataLength;
memcpy(rxdata.data , RxData , CAN_MAX_DATA);
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR(CanRxQueue,&rxdata,&xHigherPriorityTaskWoken);
if(xHigherPriorityTaskWoken)
{
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
if (HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
/* Notification Error */
Error_Handler();
}
}.
what i need is the can should work in interrupt mode . and i have to set up multiple esp and receive those messges.