LPC2XXX系列ARM帶CAN的波特率計(jì)算
最近正在學(xué)習(xí)ARM的CAN部分,發(fā)現(xiàn)CAN的波特率計(jì)算方法網(wǎng)上竟然查不到,我就自己推到一個(gè)吧,有什么不對(duì)的地方大家指正啊。
當(dāng)VPB時(shí)鐘為4*11059200Hz時(shí),常用波特率與總線時(shí)序器對(duì)照表(周立功給的,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ù)手冊(cè)和資料自己理解的,僅供參考)
一個(gè)數(shù)據(jù)位(bit)分為10段(Tscl),每個(gè)Tscl的時(shí)間就是(BRP+1)/fpclk
一個(gè)數(shù)據(jù)位(bit)包括位同步時(shí)間段(Tsync)、傳播時(shí)間段(Tpseg)、相位緩沖段1(Ttseg1)、相位緩沖段2(Ttseg2),采樣點(diǎn)位于Ttseg1結(jié)束處。
位同步時(shí)間段(Tsync):用于同步總線上不同的節(jié)點(diǎn),這一段內(nèi)要有一個(gè)跳變沿,顯性電平到隱性電平邊沿最好出現(xiàn)在此段中。
傳播時(shí)間段(Tpseg):用于補(bǔ)償網(wǎng)絡(luò)內(nèi)的物理延時(shí)時(shí)間。網(wǎng)絡(luò)的物理延遲指發(fā)送單元的輸出延遲、總線上信號(hào)的傳播延遲、接收單元的輸入延遲。
相位緩沖段1(Ttseg1)、相位緩沖段2(Ttseg2):用于補(bǔ)償邊沿階段的誤差,由于各單元以各自獨(dú)立的時(shí)鐘工作,細(xì)微的時(shí)鐘誤差會(huì)累積起來,該段可用于吸收此誤差。這兩個(gè)段可以通過重新同步(SJW)加長(zhǎng)或縮短。
采樣點(diǎn):讀取總線電平,并將讀到的電平作為位值的點(diǎn)。
.
Tsync的時(shí)間為1個(gè)Tscl,Ttseg1的時(shí)間為TSEG1 + 1個(gè)Tscl,Ttseg2的時(shí)間為TSEG2 + 1個(gè)Tscl。LPC2XXX數(shù)據(jù)手冊(cè)和ZLG的書沒提到Tpseg,我個(gè)人認(rèn)為10個(gè)Tscl段除了Tsync、Ttseg1、Ttseg2外就剩Tpseg了,所以沒必要設(shè)置Tpseg。(或者LPC2XXX的CAN沒有??)
既然如此,Ttseg1和Ttseg2的時(shí)間就可以確定了,ZLG給的規(guī)則是:Ttseg2>=2Tscl,Ttseg2>=2Tsjw,Ttseg1>=Ttseg2,每個(gè)Tscl的時(shí)間就是(BRP+1)/fpclk