Skip to main content
Visitor II
December 5, 2022
Solved

FDCAN in normal mode is not working

  • December 5, 2022
  • 4 replies
  • 3313 views

Hi!

I am using the stm32mp157C-DK2 board to communicate via FDCAN and my idea is to use it as normal mode to send and receive CAN messages. For this I have created a program in stm32cubeide and I enable FDCAN1 with the following parameters (125Kb/s):

 hfdcan1.Instance = FDCAN1;

 hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;

 hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;

 hfdcan1.Init.AutoRetransmission = ENABLE;

 hfdcan1.Init.TransmitPause = DISABLE;

 hfdcan1.Init.ProtocolException = DISABLE;

 hfdcan1.Init.NominalPrescaler = 8;

 hfdcan1.Init.NominalSyncJumpWidth = 3;

 hfdcan1.Init.NominalTimeSeg1 = 20;

 hfdcan1.Init.NominalTimeSeg2 = 3;

 hfdcan1.Init.DataPrescaler = 16;

 hfdcan1.Init.DataSyncJumpWidth = 6;

 hfdcan1.Init.DataTimeSeg1 = 5;

 hfdcan1.Init.DataTimeSeg2 = 6;

 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 = 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 = 5;

 hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;

 hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;

 if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)

 {

  Error_Handler();

 }

I have also changed FDCAN1 pins to be able to connect to the board (FDCAN_RX --> PA11 and FDCAN_TX --> PA12). Finally, I have created the program to send message via CAN:

 while (1)

 {

 sprintf ((char *)TxData1, "CAN1: %d", indx++);

 if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader1, TxData1)!= HAL_OK)

 {

 Error_Handler();

 }

 HAL_Delay (1000);

 }

But when I run this program, i can´tsend messages and always get the same error:

HAL_FDCAN_ERROR_FIFO_FULL;

It seems that the FDCAN is not sending messages.

Can somebody help me?

Thanks!

    This topic has been closed for replies.
    Best answer by PatrickF

    Hi,

    I don't know much about FDCAN, but I assume that if external loopback is ok then it mean the clocks are ok.

    Maybe you have an electrical issue on your FDCAN transceiver (e.g. wrong signal levels at TX or RX) which might block the transmit.

    Or maybe just because you are trying to transmit without any device able to receive (i.e no ACK), so TX will become full.

    This is just my though, sorry not able to help you more.

    Regards.

    4 replies

    Technical Moderator
    December 5, 2022

    Hi @TArre.1​ 

    I'm not knowledgeable for FDCAN, but did you have all the required clocks present to the IP ?

    0693W00000WKDXzQAP.png 

    0693W00000WKDYnQAP.png 

    Regards,

    In order to give better visibility on the answered topics, please click on 'Select as Best' on the reply which solved your issue or answered your question. See also 'Best Answers'

    TArre.1Author
    Visitor II
    December 5, 2022

    Hi @PatrickF​ , thank you for your reply!

    I see that i have to enable the clock. In my case, I have connected the FDCAN1 to HSE as you can see in the image:

    0693W00000WKDjRQAX.pngIn the main program, I think I have enable this with the PeriphCommonClock_Config program:

    void PeriphCommonClock_Config(void)

    {

     RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

     PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_CKPER;

     PeriphClkInit.CkperClockSelection = RCC_CKPERCLKSOURCE_HSE;

     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

     {

      Error_Handler();

     }

    }

    Is something missing in my program or do I have to change something?

    Thanks!

    Technical Moderator
    December 5, 2022

    Hi,

    I assume you are in Development Boot mode, so HSE is not automatically started. Don't know if CubeMX generate the code for that (as in production mode, root clocks are managed by TF-A/uBoot/Linux).

    Note that on DK2 board, the HSE should be started in 'digital bypass' mode.

    I think you already checked that the FDCANEN bit in RCC is set.

    Regards.

    TArre.1Author
    Visitor II
    December 5, 2022

    Hi @PatrickF​ 

    I am in engineering boot mode. I've tried in external loopback mode and everything is ok, but when I run this program in normal mode, I can't send messages and always get the same error:

    HAL_FDCAN_ERROR_FIFO_FULL.

    Now, I have tried to do with another source clock (HSI) but the result is the same.

    How can I know if the clock is running?

    Thanks!

    PatrickFAnswer
    Technical Moderator
    December 5, 2022

    Hi,

    I don't know much about FDCAN, but I assume that if external loopback is ok then it mean the clocks are ok.

    Maybe you have an electrical issue on your FDCAN transceiver (e.g. wrong signal levels at TX or RX) which might block the transmit.

    Or maybe just because you are trying to transmit without any device able to receive (i.e no ACK), so TX will become full.

    This is just my though, sorry not able to help you more.

    Regards.

    TArre.1Author
    Visitor II
    December 5, 2022

    Hi @PatrickF​ 

    Thanks for your advice, I'll try to test it with other devices to see if it works for me ;)

    Visitor II
    December 12, 2023

    hi, Have you fixed that error yet?