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