本人用的單片機是STM32F407,其它型號的單片機類似,可做參考!
一、標准CAN協議位時序概念
由於CAN屬於異步通訊,沒有時鍾信號線,連接在同一個總線網絡中的各個節點會像串口異步通訊那樣,節點間使用約定好的波特率進行通訊。
同時,CAN還使用“位同步”的方式來抗干擾、吸收誤差,實現對總線電平信號進行正確的采樣,確保通訊正常。
為了實現這個位同步,CAN協議將每個位的時序分解為四段:SS段、PTS段、PSB1段、PBS2段。同時定義最小的時間單位:Tq,四個段的長度用x個Tq表示,加起來就是一個位的時序。
用一個圖來表示可能會形象一點,如圖一個位的時序就是19Tq。
以上就是CAN標准協議定義的位時序,而STM32的外設簡化了這個標准。
二、STM32中CAN總線位時序概念
STM32的CAN外設位時序中只包含3段:同步段SYNC_SEG、位段BS1(合並了PTS段和PSB1段)和位段BS2。
其中SYNC_SEG的長度固定為1Tq,其它兩段的長度可在CAN_BTR中設置。
這里我們要注意一個細節,BS1段的時間長度其實是等於我們寫入的值+1的,同樣BS2段也是。
三、波特率的計算
在設定了BS1段和BS2段的長度后,我們就可以確定每個CAN數據位的長度了。
BS1段時間:Ts1 = Tq * (TSI1[3:0] + 1)
BS2段時間:Ts1 = Tq * (TSI2[2:0] + 1)
一個數據位的時間:T1bit = 1Tq + Ts1 + Ts2
根據一個數據位的時間可知:波特率 = 1/T1bit
這個式子還有Tq一個未知數了。
在CAN外設配置中還有一個與波特率有關的參數是BRP(波特率預分頻器)
我使用的STM32F407的CAN1外設是掛載在APB1總線上的,它的默認時鍾頻率為45M,Tpclk=1/45M。
根據BRP參數的定義:Tq = BRP[9:0] * Tpclk
這樣Tq的值就算出來了,帶入上面波特率的計算公式就可以求得CAN總線傳輸的波特率了。