cancel
Showing results for 
Search instead for 
Did you mean: 

when the STM32H743V uses the api function "HAL_FDCAN_AddMessageToTxFifoQ ", ocassionally the return value is 0x200 that means "HAL_FDCAN_ERROR_FIFO_FULL".

Sjun.1
Associate II

1) FDCAN init is loopback mode, the config as follow:

 /* USER CODE BEGIN FDCAN1_Init 0 */

 /* USER CODE END FDCAN1_Init 0 */

 /* USER CODE BEGIN FDCAN1_Init 1 */

 HAL_FDCAN_DeInit(&hfdcan1);

 /* USER CODE END FDCAN1_Init 1 */

 hfdcan1.Instance = FDCAN1;

 hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;

 hfdcan1.Init.Mode = FDCAN_MODE_INTERNAL_LOOPBACK;

 hfdcan1.Init.AutoRetransmission = DISABLE;

 hfdcan1.Init.TransmitPause = DISABLE;

 hfdcan1.Init.ProtocolException = DISABLE;

 hfdcan1.Init.NominalPrescaler = 4;//80M/4 = 20M -> 50ns

 hfdcan1.Init.NominalSyncJumpWidth = 8;//canbaudrate = 80M/prescale/(seg1+seg2+1) = 80/2/(23+8+8+1) = 500K

 hfdcan1.Init.NominalTimeSeg1 = 31;

 hfdcan1.Init.NominalTimeSeg2 = 8; 

 hfdcan1.Init.DataPrescaler = 4;

 hfdcan1.Init.DataSyncJumpWidth = 8;

 hfdcan1.Init.DataTimeSeg1 = 31;

 hfdcan1.Init.DataTimeSeg2 = 8; 

 hfdcan1.Init.MessageRAMOffset = 0;

 hfdcan1.Init.StdFiltersNbr = 1;

 hfdcan1.Init.ExtFiltersNbr = 0;

 hfdcan1.Init.RxFifo0ElmtsNbr = 1;

 hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;

 hfdcan1.Init.RxFifo1ElmtsNbr = 1;

 hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;

 hfdcan1.Init.RxBuffersNbr = 1;

 hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;

 hfdcan1.Init.TxEventsNbr = 0;

 hfdcan1.Init.TxBuffersNbr = 1;

 hfdcan1.Init.TxFifoQueueElmtsNbr = 1;

 hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;

 hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;

 if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)

 {

   Error_Handler();

 }

 /* USER CODE BEGIN FDCAN1_Init 2 */

 FDCAN_FilterTypeDef can_filter = {0};

 can_filter.IdType = FDCAN_STANDARD_ID;                      

 can_filter.FilterIndex = 0;                                          

 can_filter.FilterType = FDCAN_FILTER_MASK;                  

 can_filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;          

 can_filter.FilterID1 = 1;                              //only receive ID=1 from RxFIFO0

 can_filter.FilterID2 = 1;                              

 if (HAL_OK != HAL_FDCAN_ConfigFilter(&hfdcan1,&can_filter))

 {

  printf("\r\n fdcan1 filter failed.");

  return;

 }

 if (HAL_OK != HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, ENABLE, ENABLE))

 {//filter global enable

  printf("\r\n fdcan filter enable failed.");

  return;

 }

 if (HAL_OK != HAL_FDCAN_Start(&hfdcan1))                         

 {

  printf("\r\n fdcan1 start failed.");

  return;

 }

2) FDCAN1 send test as below:

int FDCAN1_TXTest(void)

{

 FDCAN_TxHeaderTypeDef can_txheader = {0}; 

 unsigned char i;

 unsigned char can_txdata[8] = {0};

 unsigned int ret;

 can_txheader.Identifier = 0x123;

 can_txheader.IdType = FDCAN_STANDARD_ID;

 can_txheader.TxFrameType = FDCAN_DATA_FRAME;

 can_txheader.FDFormat = FDCAN_CLASSIC_CAN;

 can_txheader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;

 can_txheader.BitRateSwitch = FDCAN_BRS_OFF;

 can_txheader.DataLength =FDCAN_DLC_BYTES_8;//

 can_txheader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;

 can_txheader.MessageMarker = 0;

   memset((char *)can_txdata, 0x55, sizeof(can_txdata));

   ret = HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &can_txheader, can_txdata);

   if (HAL_OK == ret)

   {

    printf("\r\n can1 tx(len = %d) ok:", (can_txheader.DataLength>>16));

    for (i = 0;i < (can_txheader.DataLength>>16);i++)

    {

     if ((i % 8) == 0) printf("\r\n");

     printf("%02x ", can_txdata[i]);

    }   

    return 0;

   }

   else

   {

    printf("\r\n can1 send err(0x%x), ErrorCode = 0x%x , state = 0x%x", ret, hfdcan1.ErrorCode, hfdcan1.State);-------The probelm is here, this printf is on.

    return 1;

   }  

}

The return is not OK. The value is 0x200 that means "HAL_FDCAN_ERROR_FIFO_FULL". Please help us, thanks a lot.

4 REPLIES 4
SKacp.1
Senior II

Hi,

Do You have function for receive data from CAN1?

Sjun.1
Associate II

Hi, thanks for your anwser firstly. In the beginning, we try to send one packet and receive packet in the normal mode, then find the erorr. So we try only to send without receive in the loopback mode, but this probelm is still on.

Sjun.1
Associate II

Hi, anyone would help us ?

Wedge
Associate

Hi, did you find the problem? I'm facing the same issue with the STM32H743I-Eval2 board.