when the STM32H743V uses the api function "HAL_FDCAN_AddMessageToTxFifoQ ", ocassionally the return value is 0x200 that means "HAL_FDCAN_ERROR_FIFO_FULL".
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.
