1. 程式人生 > >飛思卡爾s12系列CAN波特率計算

飛思卡爾s12系列CAN波特率計算

最近在看飛思卡爾s12系列CAN部分,發現波特率計算這塊沒有一個講的詳細的,在資料手冊裡也沒有詳細說明。

經過仔細研究,特將CAN部分波特率計算總結出來。

引用部分CAN波特率計算資料如下:

簡單介紹一個波特率的計算,在CAN的底層協議裡將CAN資料的每一位時間(TBit)分為許多的時間段(Tscl),這些時間段包括:
A. 位同步時間(Tsync)
B. 時間段1(Tseg1)
C. 時間段2(Tseg2)
其中位同步時間佔用1個Tscl;時間段2佔用(Tseg1+1)個Tscl;時間段2佔用(Tseg2+1)個Tscl,所以CAN控制器的位時間(TBit)就是:TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,那麼CAN的波特率 (CANbps)就是1/TBit。
但是這樣計算出的值是一個理論值。在實際的網路通訊中由於存在傳輸的延時、不同節點的晶體的誤差等因素,使得網路CAN的波特率的計算變得複雜起來。CAN在技術上便引入了重同步的概念,以更好的解決這些問題。這樣重同步帶來的結果就是要麼時間段1(Tseg1)增加TSJW(同步跳轉寬度SJW+1),要麼時間段減少TSJW,因此CAN的波特率實際上有一個範圍:1/(Tbit+Tsjw) ≤CANbps≤1/(Tbit-Tsjw)
CAN有波特率的值四以下幾個元素決定:
A. 最小時間段Tscl;
B. 時間段1 TSEG1;
C. 時間段2 TSEG2;
D. 同步跳轉寬度 SJW
那麼Tscl又是怎麼計算的呢?這是總匯流排時序暫存器中的預分頻暫存器BRP派上了用場,Tscl=(BRP+1)/FVBP。FVBP為微處理器的外設時鐘。

下面用一個例子來舉例說明。

注:本例中時鐘使用匯流排時鐘,若選擇外設時鐘,則外設時鐘=晶振頻率/2

比如,匯流排時鐘fbus=16M,準備設定的波特率 CANbps=250K,則

(1)位時間TBit=1/250k=4us.

同時,

(2)TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,

一般 (TSEG1+TSEG2+3)的值取16(8~25之間),則

Tscl=4us/16=250ns

而同時(3)Tscl=(BRP+1)/fbus

fbus為微處理器的匯流排時鐘。則

250ns=(BRP+1)/16M,

計算之後BRP=3;

假設我們先不考慮BTR0中的SJW位和BTR1中的SAM位。那麼,BTR0和BTR1就是2個分頻係數暫存器;它們的乘積是一個擴充套件的分頻係數。即:

    BTR0×BTR1=fbus/CANbps   (4)

此例中,BTR0*BTR1=16M/250K=64. 

此例中,BRP=3,其作為BTR0的組成部分,表示預分頻值為4,則BTR1的預分頻值為

(5)64/4=16;

(CAN規範中規定其取值在8~25之間)

TSEG1和TESG2的值(TSEG1+TSEG2+3)=16,而根據CIA推薦:

75%     when 波特率 > 800K
80%     when 波特率 > 500K
87.5%   when 波特率 <= 500K

CiA計算方式:

sample =(1+(TSEG1+1))/(1+(TSEG1+1)+(TSEG2+1))               (6)

sample = ( 1 +  CAN_BS1) /  (1 +  CAN_BS1 +  CAN_BS2)        (6)

在這裡,CAN_BS1=TSEG1+1,CAN_BS2=TSEG2+1;

則CAN_BS1和CAN_BS2的取值要符合要求。

此處令CAN_BS1取13,CAN_BS2取2, 取樣率=(1+13)/(1+13+2)=87.5%    BTR1=0001 1100B

則CANBTR1的值為0x1c;

 其實,用一個公式總結則為

CANbps = fbus/( (BRP+1) * (CAN_BS1+CAN_BS2+1))

本例中 250K=16M/(3+1)*(13+2+1)=16M/64;

總之,BRP(BTR0的值)和CAN_BS1,CAN_BS2的值可以自定,但是要符合(CAN_BS1+CAN_BS2)=15,且符合CIA推薦的標準。

總體配置保持CAN_BS1>=CAN_BS2 , CAN_BS1>=1個CAN時鐘週期 ,CAN_BS2>=2SJW ,

本例中,CAN_BS2=2,則SJW=1;即BRT0的bit7和bit6均為0

SAM的確定:低頻時,選SAM=1,即取樣3次。高頻100K以上時,取SAM=0,即取樣1次。

總結:

BTR0:  SJW和CAN_BS2有關,CAN_BS2>=2SJW 

BTR1:  SAM的確定:低頻時,選SAM=1,即取樣3次。高頻100K以上時,取SAM=0,即取樣1次。

CANbps = fbus/( (BRP+1) * (CAN_BS1+CAN_BS2+1))    最重要的公式

CANbps為要設定的CAN波特率;

fbus為匯流排時鐘頻率,若採用外部時鐘時,則外部時鐘=晶振時鐘/2;

BRP為BTR0的低6位值;

CAN_BS1為BTR1的bit0~bit3的值-1;

CAN_BS2為BTR1的bit4~bit6的值-1;