STM32——CAN總線波特率和位時序詳解


本人用的單片機是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總線傳輸的波特率了。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM