• 0
tahoe250

CAN Bus Baud Rate Calculation.

Question

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.

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

@tahoe250

Answers to your question can be found in Vivado folder ...SDK\...\data\embeddedsw\XilinxProcessorIPLib\drivers\canps_

The folloing code makes the trick:

/* The Baud Rate Prescaler Register (BRPR) and Bit Timing Register (BTR) required
 * to be set for the desired baud rate.
 * For more information see the CAN 2.0A, CAN 2.0B, ISO 11898-1 specifications.
 * The CAN clock is 24MHz.
 */
#define TEST_BTR_SYNCJUMPWIDTH        3          // 100, 250 -> 3
#define TEST_BTR_SECOND_TIMESEGMENT   2   // 100, 250 -> 5 500 -> 2
#define TEST_BTR_FIRST_TIMESEGMENT    3       // 100, 250 -> 8 500 -> 3
#define TEST_BRPR_BAUD_PRESCALAR    2          // 100->14  250,500->5 750->3, 1000->2

.....

    XCanPs_SetBaudRatePrescaler(CanInstPtr, TEST_BRPR_BAUD_PRESCALAR);
    XCanPs_SetBitTiming(CanInstPtr, TEST_BTR_SYNCJUMPWIDTH,

......

Shown setting correspond to 1 Mbit/s data rate.

Best of luck!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now