I 'm programming a PIC18F4585 with MPLAB. I want to use the CAN option
and I have made the basic C and H files with the aplication maestro of
I 'm working on a clock frequency of 40MHz.
These are the settings I have calculated for a baudrate of 125k.
#define BAUD_RATE_PRESC 16
#define SJW_TIME 1
#define SAMPLES 1
#define PROP_TIME 2
#define PH_SEG_1 4
#define PH_SEG_2 3
Can someone help me to find the right configuration?
Reply by Neil●August 2, 20072007-08-02
> I 'm programming a PIC18F4585 with MPLAB. I want to use the CAN option
> and I have made the basic C and H files with the aplication maestro of
> I 'm working on a clock frequency of 40MHz.
> These are the settings I have calculated for a baudrate of 125k.
> #define BAUD_RATE_PRESC 16
> #define SJW_TIME 1
> #define SAMPLES 1
> #define PROP_TIME 2
> #define PH_SEG_1 4
> #define PH_SEG_2 3
> Can someone help me to find the right configuration?
"Neil" <NeilKurzm@worldnet.att.net> wrote in message
> Mich wrote:
>> I 'm programming a PIC18F4585 with MPLAB. I want to use the CAN option
>> and I have made the basic C and H files with the aplication maestro of
>> I 'm working on a clock frequency of 40MHz.
>> These are the settings I have calculated for a baudrate of 125k.
>> #define BAUD_RATE_PRESC 16
>> #define SJW_TIME 1
>> #define SAMPLES 1
>> #define PROP_TIME 2
>> #define PH_SEG_1 4
>> #define PH_SEG_2 3
>> Can someone help me to find the right configuration?
> Go to http://intrepidcs.com and download "MB Time"
> Part of this is like RS-232. You need to set it to match who you are
> talking to.
Tools are OK for finding settings but it's better to go back and understand
what all the numbers mean, the datasheet for the PIC is quite good for this,
sec. 23.9. There are some examples in 23.9.2 as well.
You don't specify the sample time but this is normally around 80% of the bit
time so I'll use that. You say you have a clock frequency of 40MHz, again I
will assume that this is the internal frequency and not just the external
crystal you are using. (BTW always use a crystal, I had a very very very bad
experience with a resonator, they are just not accurate enough over life and
temperature range for CAN applications.)
The easiest bit first is the SJW_TIME, to make the most robust system make
this as big as possible, usually 3. I'm not quite sure why you would
normally want to set this lower, if anybody has reasons then that would be
useful to know. [SJW_TIME=3]
125k means a bit time of 8us, each bit duration is made up of a number of
time quanta (Tq), these are the smallest units of time in the setup, so if
we can make the Tq = 0.5us then we need 16 of them in total to get the 8us.
It is generally better to have as many time quanta as possible as this
improves the control of when things actually happen during the bit time,
e.g. the sample point.
The length of Tq is determined by the baud rate prescaler, see equ 23-3. At
40 MHz, the oscillator period is 25ns. 0.5us/25ns = 20, but the BRP always
has 1 added by the micro and is then doubled as you can see in the equ, so
we need to divide by 2 and subtract 1 first, then [BAUD_RATE_PRESC=9]
To sample at 80%, then calculate 80%*16 Tq = 12.8. We must have an integer
so use 13 which will mean sampling at 81.25%, this should be acceptable (if
not then the number of Tq will need to be changed. e.g. if you use 20 then
you can sample at exactly 80%). You can see from the bit time partitioning
in the data sheet that only Phase Segment 2 is after the sample point so
this must be 16-13=3, however again the micro always adds 1, so we must
subtract 1 so [PH_SEG_2=2]
The remaining 13 Tq are split up between the sync segment, propagation and
phase segment 1. The Sync segment is always 1 Tq leaving 12. Both the
propagation and phase seg 1 have a maximum value of 8, so lets make phase
seg 1 = 8 and than the propagation can be 4. However again similarly to the
previous settings the micro adds 1 to the values so we must subtract 1,
therefore [PH_SEG_1=7] [PROP_TIME=3]
I'm not sure what the benefit of separating the time before the sample point
into propagation and phase seg 1 is, micro's I used before only had phase
seg 1 and no propagation register, but this was a 16bit part so this may be
the reason, i.e. the PIC18 can't go above 7/8!
Finally I'd like to add that all my calculations may be wrong!! It's worth
spending the time to understand it as it makes life easier if you get a
problem later. I would worry about the settings you have given because it
looks to me like this gives a baud rate around 90.5 kbit/s and a sample
point at 69%. BUT it may be that as these are #defines, then the point in
the initialisation at which the settings are actually written to the
registers, the various -1's are taken account of, I am assuming this part of
the code is generated by the application maestro, is this correct? I would
be surprised if it made this kind of error, but you would never know if you
don't do your own calculation first!
Any comments from anyone else on this would be appreciated as I am also
looking at this part for CAN.