cancel
Showing results for 
Search instead for 
Did you mean: 

STM32G474RE FDCAN0 Transmit Errors & Passive Mode without CAN Master or Analyzer

omkarprayag
Associate III

Hello Community,

I'm using an STM32G474RE MCU with FDCAN0 to set up CANopen communication for a sensor node device. The setup is designed to cascade multiple sensor devices on the same CAN bus, each with a unique node ID, so they can transmit data independently.

Currently, I have two devices connected in a simple cascading configuration, both operating as CANopen nodes with different IDs. No CAN master or analyzer is connected, as these sensor nodes are meant to operate autonomously on the bus.

Here is my FDCAN initialization code:

 

 

 

void MX_FDCAN1_Init(void)
{
    FDCAN_FilterTypeDef sFilterConfig;
    
    /* FDCAN1 parameter configuration */
    hfdcan1.Instance = FDCAN1;
    hfdcan1.Init.DataPrescaler = 12; 
    hfdcan1.Init.NominalPrescaler = 12; 
    hfdcan1.Init.NominalTimeSeg1 = 13; 
    hfdcan1.Init.DataTimeSeg1 = 13;
    hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
    hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
    hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
    hfdcan1.Init.AutoRetransmission = ENABLE;
    hfdcan1.Init.TransmitPause = DISABLE;
    hfdcan1.Init.ProtocolException = ENABLE;
    hfdcan1.Init.NominalSyncJumpWidth = 1;
    hfdcan1.Init.NominalTimeSeg2 = 2;
    hfdcan1.Init.DataSyncJumpWidth = 1;
    hfdcan1.Init.DataTimeSeg2 = 2;
    hfdcan1.Init.StdFiltersNbr = 0;
    hfdcan1.Init.ExtFiltersNbr = 0;
    hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
    
    if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
    {
        Error_Handler();
    }

    /* Configure Rx filter */
    sFilterConfig.IdType = FDCAN_STANDARD_ID;
    sFilterConfig.FilterIndex = 0;
    sFilterConfig.FilterType = FDCAN_FILTER_MASK;
    sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    sFilterConfig.FilterID1 = 0x0000;
    sFilterConfig.FilterID2 = 0x0000;
    
    if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
    {
        DebugPrint("Failed to config filter.");
    }

    /* Configure global filter to accept all frames */
    if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_ACCEPT_IN_RX_FIFO0, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    {
        DebugPrint("Failed to config global filter.");
    }

    /* Clearing Error Flags */
    __HAL_FDCAN_CLEAR_FLAG(&hfdcan1, FDCAN_FLAG_ERROR_PASSIVE | FDCAN_FLAG_BUS_OFF);

    /* Start the FDCAN module */
    if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
    {
        DebugPrint("Failed to start FDCAN.");
    }

    if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_ERROR_PASSIVE | FDCAN_IT_BUS_OFF, 0) != HAL_OK)
    {
        DebugPrint("Failed to activate notifications.");
    }
}

 

 

 

 

The Issue

With the two sensor nodes connected, the bus doesn’t transition to an Active mode, as expected. Instead, it enters an Error Passive state, and the Transmit Error Counter (TEC) reaches 128. This seems to imply a problem with message transmission or bus communication even though both nodes have unique IDs.

 

Questions for the Community

  1. Given that both devices are sensor nodes on CANopen, should they need a master or analyzer to activate the bus, or should the nodes be able to communicate autonomously?
  2. Are there any additional configurations to ensure the devices move to an Active state and avoid the passive error mode?
  3. Is manually initiating communication via an NMT (Network Management) Start command necessary, or should each node operate independently on the bus?

Any insights or suggestions would be greatly appreciated! Thank you!

24 REPLIES 24

@SofLit ,

Yes, the intended bitrate 250kb/s 

Could you confirm again you have this structure for this test?:

SofLit_0-1729078448084.png

Meanwhile, you need to check again your HW:

1- Check the transceiver power supply: check directly the power on the chip pins: VCC (5V) on pin3 and VIO (3.3V) on pin 5.

2- Check again your wiring between the transceivers: CAN_H to CAN_H pin 7 of both transceivers / CAN_L to CAN_L pin 6 of both transceivers. Use continuity option of the multimeter. For this you need to power off the board before the check.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

@SofLit ,

Yes, the connections you mentioned are the same on my end. I have verified them multiple times.

Answer 1: Yes, the power supply is as expected VCC (5V) on pin3 and VIO (3.3V) on pin 5.
Answer 2: Yes, the wiring, termination resistors and connection are intact.

P.S.: When I connect a CAN analyzer to the bus, communication works correctly without any issues. This confirms that both the communication and physical connections are functioning properly

You didn't tell what GPIOs were used for CAN_Tx and CAN_Rx? are they really connected to the CAN transceiver? could you please check?

It could be a wrong selection of CAN_Tx /CAN_Rx GPIO pins.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

@SofLit ,

No, I’ve ensured the GPIOs are configured correctly:

Pin 4 (RXD) of the transceiver is connected to PA11.
Pin 1 (TXD) of the transceiver is connected to PA12.
To clarify, when I connect a CAN analyzer to the CAN bus alongside the nodes, communication works perfectly, confirming that the physical CAN bus connections are correct.

However, the issue arises when the CAN analyzer is removed, leaving only the two nodes on the CAN bus. In this case, I consistently receive an ERROR PASSIVE state. This is the problem I’m trying to resolve.