can總線波特率參數(shù)調(diào)整
位時序就是說的can波特率.











第一步:
查看單片機(jī)中參數(shù)取值的范圍.
stm32單片機(jī)中包含一下要設(shè)置的參數(shù):
BRP:預(yù)分頻值.??????(范圍: 1-1024)
Ts1:包括Tps和Tpbs1.??(范圍: 1-16)
Ts2:包括Tpbs2.???????(范圍: 1-8)
Sjw:用于設(shè)置Tpbs1和Tpbs2可以調(diào)節(jié)的節(jié)拍數(shù).??(范圍: 1-4)

第二步:
首先看一個例子.如果要把can配置成500K波特率.
首先計(jì)算Q,它代表了一個位可以分成幾個節(jié)拍,當(dāng)然是越大越好.這樣可以把節(jié)拍分的更細(xì)致一些.有個公式可以進(jìn)行計(jì)算:
BRP=Fclk/(Q*Baudrate)
已知: ?Fclk就是stm32的APB上時鐘 已知是42M=42 000 000
已知: 上面公式中Baudrate=500K=500 000
未知: ?BRP是分頻系數(shù),用于將APB的時鐘分頻到CAN時鐘.
未知: ?Q,一個位分成Q份.
?
通過這已知的兩個數(shù),可以推出很多Q和BRP的組合,BRP=84/Q
所以,
84*1 ??(Q是84,最大,但是Q超過了stm32的設(shè)定范圍)
42*2 ??(Q是84,最大,但是Q超過了stm32的設(shè)定范圍)
21*4 ??(可以用, 即Q為21 ?BRP為4)
14*6
?
但是要求Q盡可能的大,所以BRP取值為4.
Q取值得到最大,為21.
波特率是500k,則每個位耗時2000ns,因?yàn)镼是21,所以被分成了21份.
每份耗時2000/21耗時95.2ns.
?
Q的參數(shù)就是越大越好.(但是不能超過stm32的設(shè)定范圍)
Q就是一個bit,一個位所被分成的節(jié)拍數(shù).
Q是總的節(jié)拍數(shù),要分給各個段.
Q=Tss+Tps+Tpbs1+Tpbs2
Tss通常占一拍;
Tps和Tpbs1相加構(gòu)成stm32單片機(jī)中的Ts1;
Tpbs2是stm32單片機(jī)中的Ts2;

第三步:
進(jìn)行計(jì)算
Q是21,所以1位數(shù)據(jù)時長可以分成21份.
Q又由4個部分:
Q=Tss+Tps+Tps1+Tps2??(其中,在stm32中Tps和Tps1合并為一個參數(shù)了)
Tss:其值一般為1份;
Tps:是有設(shè)備性能和總線長度決定,通常情況下總線延遲可以按照5.5ns/m計(jì)算.
單個節(jié)點(diǎn)的收發(fā)延遲,可以按75ns計(jì)算.加入有線長1m,則Tps=2*(1*5.5+75)ns=161ns.
?
傳播段時長Tps:信號在總線上來回傳輸所消耗的時間.
設(shè)一次單向傳輸?shù)难訒r為Tdelay,包括:
1.發(fā)送節(jié)點(diǎn)從生產(chǎn)信號到把信號發(fā)送到總線上,Td1.
2.信號在總線上傳輸?shù)臅r間Tbus.
3.接收節(jié)點(diǎn)從總線獲取信號的時間Td2.
Tps>=2Tdelay=2*(Td1+Tbus+Td2)
?
?根據(jù)Q的值,可以知道每個節(jié)拍耗時,然后用Tps除以每個節(jié)拍的時間,就知道Tps包含幾個節(jié)拍了.(161/95.2約1.69個節(jié)拍,按2個計(jì))
?
Tps1:一個位被分成Q個,Tss已知,Tps已知,那么剩下的個數(shù)被Tps1和Tps2瓜分.如果是奇數(shù)個,則Tps1比Tps2少1個. (21-1-2)/2=9 ?所以Tps1=9;Tps2=9;
?
SJW:它的值要取(Ts2-1)和4兩個數(shù)小的那個.所以SJW=4.

第四步:
進(jìn)行數(shù)據(jù)的分析
BRP=4; ??????????預(yù)分頻值.???????????????????????(在取值范圍:1-1024內(nèi))
Ts1=2+9=11; ??????包括Tps和Tpbs1.??????????????????(在取值范圍:1-16內(nèi))
Ts2=9; ???????????包括Tpbs2.???????????????????????(在取值范圍:1-8內(nèi))
Sjw=4; ???????????設(shè)Tpbs1和Tpbs2可以調(diào)節(jié)的節(jié)拍數(shù).??(在取值范圍:1-4內(nèi))
?
然后判斷一下,是否符合采樣點(diǎn)規(guī)則:

?


BS1=Tps+Tpbs1
BS2=Tpbs2
(11+1)/(1+11+9)=12/21=57% 不太符合推薦值.
?
進(jìn)行調(diào)整:
(16+1)/(1+16+4)=17/21=80.0%?還是不太符合.
?
繼續(xù)調(diào)整:
(18+1)/(1+18+2)=17/21=85.7% 勉強(qiáng)符合,但會超出stm32范圍Ts1>16了.所以選擇上面的取值.
?
所以,最終定值為:
BRP=4; ??????????預(yù)分頻值.????????(1-1024)
Ts1=16; ??????????包括Tps和Tpbs1.??(1-16)
Ts2=4; ???????????包括Tpbs2.????????(1-8)
Sjw=4; ???????????設(shè)Tpbs1和Tpbs2可以調(diào)節(jié)的節(jié)拍數(shù).??(1-4)
?
程序中:

?
然后用500k的波特率,就可以接收:

?
?

最后放一個stm32手冊上的圖:
