LPC2XXX系列ARM帶CAN的波特率計算
最近正在學(xué)習(xí)ARM的CAN部分,發(fā)現(xiàn)CAN的波特率計算方法網(wǎng)上竟然查不到,我就自己推到一個吧,有什么不對的地方大家指正啊。
當(dāng)VPB時鐘為4*11059200Hz時,常用波特率與總線時序器對照表(周立功給的,11059200kHz的波特率都是近似的,有誤差)
BPS = (SAM << 23)|(TSEG2 << 20)|(TSEG1 << 16)|(SJW << 14)| BRP
#define BPS_5K (1 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 879
#define BPS_10K (1 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 439
#define BPS_20K (1 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 219
#define BPS_40K (1 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 109
#define BPS_50K (1 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 87
#define BPS_80K (1 << 23)|(1 << 20)|(4 << 16)|(0 << 14)| 68
#define BPS_100K(1 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 43
#define BPS_125K(0 << 23)|(1 << 20)|(4 << 16)|(0 << 14)| 43
#define BPS_200K(0 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 21
#define BPS_250K(0 << 23)|(1 << 20)|(4 << 16)|(0 << 14)| 21
#define BPS_400K(0 << 23)|(1 << 20)|(6 << 16)|(0 << 14)| 10
#define BPS_500K(0 << 23)|(1 << 20)|(4 << 16)|(0 << 14)| 10
#define BPS_666K(0 << 23)|(1 << 20)|(2 << 16)|(0 << 14)| 10
#define BPS_800K(0 << 23)|(1 << 20)|(1 << 16)|(0 << 14)| 10
#define BPS_1000K(0 << 23)|(1 << 20)|(1 << 16)|(0 << 14)| 8
以下是我自己推導(dǎo)的(僅供參考)
CANBTR(0xE00xx014)
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
SAM
TSEG2
TSEG1
SJW
0
0
0
0
BRP
波特率BPS=
SAM 0:125K及以上波特率
1:100K及以下波特率
.
.
下面再詳細(xì)說一下(看數(shù)據(jù)手冊和資料自己理解的,僅供參考)
一個數(shù)據(jù)位(bit)分為10段(Tscl),每個Tscl的時間就是(BRP+1)/fpclk
一個數(shù)據(jù)位(bit)包括位同步時間段(Tsync)、傳播時間段(Tpseg)、相位緩沖段1(Ttseg1)、相位緩沖段2(Ttseg2),采樣點(diǎn)位于Ttseg1結(jié)束處。
位同步時間段(Tsync):用于同步總線上不同的節(jié)點(diǎn),這一段內(nèi)要有一個跳變沿,顯性電平到隱性電平邊沿最好出現(xiàn)在此段中。
傳播時間段(Tpseg):用于補(bǔ)償網(wǎng)絡(luò)內(nèi)的物理延時時間。網(wǎng)絡(luò)的物理延遲指發(fā)送單元的輸出延遲、總線上信號的傳播延遲、接收單元的輸入延遲。
相位緩沖段1(Ttseg1)、相位緩沖段2(Ttseg2):用于補(bǔ)償邊沿階段的誤差,由于各單元以各自獨(dú)立的時鐘工作,細(xì)微的時鐘誤差會累積起來,該段可用于吸收此誤差。這兩個段可以通過重新同步(SJW)加長或縮短。
采樣點(diǎn):讀取總線電平,并將讀到的電平作為位值的點(diǎn)。
.
Tsync的時間為1個Tscl,Ttseg1的時間為TSEG1 + 1個Tscl,Ttseg2的時間為TSEG2 + 1個Tscl。LPC2XXX數(shù)據(jù)手冊和ZLG的書沒提到Tpseg,我個人認(rèn)為10個Tscl段除了Tsync、Ttseg1、Ttseg2外就剩Tpseg了,所以沒必要設(shè)置Tpseg。(或者LPC2XXX的CAN沒有??)
既然如此,Ttseg1和Ttseg2的時間就可以確定了,ZLG給的規(guī)則是:Ttseg2>=2Tscl,Ttseg2>=2Tsjw,Ttseg1>=Ttseg2,每個Tscl的時間就是(BRP+1)/fpclk