2024-11-12 10:34 PM - last edited on 2024-11-13 01:16 AM by Andrew Neil
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.");
}
}
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.
Any insights or suggestions would be greatly appreciated! Thank you!
2024-11-26 05:00 AM
@SofLit ,
Yes, the intended bitrate 250kb/s
2024-11-26 05:29 AM
Could you confirm again you have this structure for this test?:
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.
2024-11-26 05:36 AM
@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
2024-11-26 05:43 AM - edited 2024-11-26 05:46 AM
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.
2024-11-27 08:22 AM
@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.