1 Reply Latest reply on Nov 6, 2019 4:00 AM by michaelkellett

    CAN Bus Baud Rate

    iaguilar

      I am going through UG585 document and trying to understand the formulas for the can bus baud rate.  I am using the example from SDK (xcanps_intr_example).  I am trying to understand how they are arriving at those numbers.  Ultimately I would like to set up the baud rate at 1 megabit per second.

      /*

      * The Baud Rate Prescaler Register (BRPR) and Bit Timing Register (BTR)

      * are setup such that CAN baud rate equals 40Kbps, assuming that the

      * the CAN clock is 24MHz. The user needs to modify these values based on

      * the desired baud rate and the CAN clock frequency. For more information

      * see the CAN 2.0A, CAN 2.0B, ISO 11898-1 specifications.

      */

       

      /*

      * Timing parameters to be set in the Bit Timing Register (BTR).

      * These values are for a 40 Kbps baudrate assuming the CAN input clock

      * frequency is 24 MHz.

      */

      #define TEST_BTR_SYNCJUMPWIDTH          3

      #define TEST_BTR_SECOND_TIMESEGMENT    2

      #define TEST_BTR_FIRST_TIMESEGMENT      15

       

      /*

      * The Baud rate Prescalar value in the Baud Rate Prescaler Register

      * needs to be set based on the input clock  frequency to the CAN core and

      * the desired CAN baud rate.

      * This value is for a 40 Kbps baudrate assuming the CAN input clock frequency

      * is 24 MHz.

      */

      #define TEST_BRPR_BAUD_PRESCALAR 29

       

      Formulas from the UG585:

      tTQ_CLK = tCAN_REF_CLK * (can.BRPR[BRP] + 1)

      freqTQ_CLK = freqCAN_REF_CLK / (can.BRPR[BRP] + 1)

      tSYNC_SEGMENT = 1 * tTQ_CLK

      tTIME_SEGMENT1 = tTQ_CLK * (can.BTR[TS1] + 1)

      tTIME_SEGMENT2 = tTQ_CLK * (can.BTR[TS2] + 1)

      tBIT_RATE = tSYNC_SEGMENT + tTIME_SEGMENT1 + tTIME_SEGMENT2

      freqBIT_RATE = freqCAN_REF_CLK / ((can.BRPR[BRP] + 1) * (3 + can.BTR[TS1] + can.BTR[TS2]))

       

      How are they deriving those numbers?  How do I choose BRP?  How are they getting  TEST_BTR_SYNCJUMPWIDTH, TEST_BTR_SECOND_TIMESEGMENT and TEST_BTR_FIRST_TIMESEGMENT. Again I am trying to understand configure the baud rate for 1 megabit per second. 

        • Re: CAN Bus Baud Rate
          michaelkellett

          To use CAN effectively you need to understand a bit more about how it works.

          I've always found it hard to Google for CAN info because can is such a common word.

          You will find a decent description of some of this stuff in various CAN equipped micro controller data sheets.

           

          The essence of it is that the CAN bit time is considered to be made up from several pieces (each tQ long) and you can set the size of them. tQ is set by the basic clock rate of 24MHz divided by the pre-scaler.

          Depending on the hardware there division may be by BRP or BRP + 1,

          in the example 24MHz is divided by 30 = 800000

          so (3 + can.BTR[TS1] + can.BTR[TS2]) needs to be 20 to meet the 40kHz requirement

          In your case try BRP = 0 and then (3 + can.BTR[TS1] + can.BTR[TS2]) = 24

          there will be maximum allowed values for TS1 and TS2 so you may possibly need to use BRP = 1n and then (3 + can.BTR[TS1] + can.BTR[TS2]) = 12

          To fully understand the TS1 and TS2 setting you need to read up on CAN

           

          Here's a link:

           

          https://sites.google.com/site/johnkneenmicrocontrollers/19_can_bus/can_stm32f107

           

          Very much about a  different processor but halfway down the page is a section on TS setting that may help.

           

          MK