Search code examples
stm32can-bus

STM32 CAN controller gets arbitration lost transmitting at 500 Kbit/s


My APB1 clock is reported by the STM32 library as being 36MHz.

I used a website to calculate a prescaler value of 3 (4 with the automatic +1), BS1 of CAN_BS1_15tq and BS2 of CAN_BS2_2tq. When I use the values in a quick spreadsheet calculation they come out right for a 500 Kbit/s baud rate.

I used different values, but assuming the same clock speed of 36 MHz to talk at 250 Kbit/s baud rate to NMEA 2000 devices successfully. When I run my code at 250 Kbit/s it works correctly and talks to my test board (which is using the same code) successfully.

I wondered if the TX and RX pin GPIO speed mattered. Here is my configuration for those pins:

        gpio_init_data.GPIO_Speed = GPIO_Speed_10MHz;
        gpio_init_data.GPIO_Pin = CAN1_RX;
        gpio_init_data.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(CAN1_PIN_GROUP, &gpio_init_data);

        gpio_init_data.GPIO_Pin = CAN1_TX;
        gpio_init_data.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(CAN1_PIN_GROUP, &gpio_init_data);

When I run at 500 KBit/s baud rate I get all transmissions failing and arbitration lost flagged: TSR=41000004. This happens even with the RX and TX pins at GPIO speed 50 MHz.

The CAN transceiver is an ISO1050 which, according to the data sheet, can handle up to 1 Mbit/s.

Does anyone have any idea what I could be doing wrong? Could it be a problem in the circuitry?


Solution

  • As Lundin said, "CAN transceivers need an ideal impedance of 60 ohm to work properly."

    The system I am using is a test rig with a board to be tested connected to a test board by about 8cm of CAN bus cable pair. Up to speeds of 250 Kbits this works perfectly well, but not at 500 Kbits.

    Adding a 56 ohm resistor (2 x 120 ohm may be better) solves the problem.

    Many thanks to Lundin for his patience and excellent information.