1. 程式人生 > >CAN波特率設定時的引數計算

CAN波特率設定時的引數計算

作者:iamlaosong

CAN(Controller Area Network)匯流排最早由德國 BOSCH公司提出,主要用於汽車內部測量與控制中心之間的資料通訊。由於其良好的效能,在世界範圍內廣泛應用於其他領域當中,如工業自動化、汽車電子、樓宇建築、電梯網路、電力通訊和安防消防等諸多領域,並取逐漸成為這些行業的主要通訊手段。 Can控制器器只需要進行少量的設定就可以進行通訊,其中較難設定的部分就是通訊波特率的計算。CAN匯流排能夠在一定的範圍內容忍總線上CAN節點的通訊波特率的偏差,這種機能使得CAN匯流排有很強的容錯性,同時也降低了對每個節點的振盪器精度。實際上,CAN匯流排的波特率是一個範圍。假設定義的波特率是250KB/S,但是實際上根據對暫存器的設定,實際的波特率可能為200~300KB/S(具體值取決於暫存器的設定)。
CAN波特率設定時需要計算幾個引數,這些引數共同決定波特率大小,由於計算比較複雜,希望有一個簡易步驟,本人經過研究,找到一個簡易辦法,現貼出來分享,不對的地方請留言指正。需要說明的是,本人使用的can控制器是AT89C51CC03微控制器中的can

首先,確定一下各項引數的取值範圍:

引數              範圍      程式設計值   說明
BRP              [1..64]   0-63    定義時間量子(時間份額)的長度tq
Sync_Seg       1 tq                固定長度,匯流排輸入與系統時鐘同步
Prog_Seg      [1..8]tq   0-7     補償物理延時時間
Phase_Seg1  [1..8]tq   0-7     可通過同步暫時延長
Phase_Seg2  [1..8]tq   0-7     可通過同步暫時縮短
TSJW           [1..4]tq   0-3     不能比任何一相位緩衝段長

以上是引數的取值範圍,程式設計值是實際往暫存器裡寫的值,為實際取值減1。下面說一下步驟:

1、首先計算CAN時鐘和波特率的比值;

2、根據比值確定預分頻器的分頻值BRP,計算時間量子的數目,這個數值範圍是8-25;

3、將時間量子數減1(去掉Sync_Seg)後在Prog_Seg Phase_Seg1 Phase_Seg2三個引數中分配;

4、Prog_Seg和整個線路的時延有關,一般不太好確定,可以按下面的原則進行分配:

    Prog_Seg<=Phase_Seg1<=Phase_Seg2 ;

    Phase_Seg1=Phase_Seg2 或者 Phase_Seg1+1=Phase_Seg2; 

5、SJW取Phase_Seg1和4中小的那個。 

估計上面敘說不太好理解,下面舉例說明:

 假定晶振是12M,CAN時鐘為6M(不同單面機,CAN時鐘和晶振的關係不一樣,BRP的取值範圍不同單微控制器也不一定相同,參看微控制器說明)

1、500K波特率

FCAN/CAN baudrate = 6 MHz/500 kHz = 12,在8-25範圍,所以BRP=1,TQ數目=12/1=12

Prog_Seg Phase_Seg1 Phase_Seg2分別等於3、4、4

暫存器程式設計值為(上述值減1):

BRP=0,SJW=3,PRS=2,PHS1=3,PHS2=3

2、100K波特率

FCAN/CAN baudrate = 6 MHz/100 kHz = 60,取BRP=6,TQ數目=60/6=10

Prog_Seg Phase_Seg1 Phase_Seg2分別等於2、3、4

暫存器程式設計值為(上述值減1):

BRP=5,SJW=2,PRS=1,PHS1=2,PHS2=2

3、10K波特率

FCAN/CAN baudrate = 6 MHz/100 kHz = 600,取BRP=60,TQ數目=600/60=10

Prog_Seg Phase_Seg1 Phase_Seg2分別等於2、3、4

暫存器程式設計值為(上述值減1):

BRP=59,SJW=2,PRS=1,PHS1=2,PHS2=2

4、5K波特率

FCAN/CAN baudrate = 6 MHz/5 kHz = 1200,取BRP=60,TQ數目=1200/60=20

Prog_Seg Phase_Seg1 Phase_Seg2分別等於6、6、7

暫存器程式設計值為(上述值減1):

BRP=59,SJW=3,PRS=5,PHS1=5,PHS2=6