## 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.

## Recommended Posts

• 0

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 on other sites
• 0

That did the trick.  I really appreciate  your help!