轉自:https://blog.csdn.net/weixin_40528417/article/details/79936476
依照瑞薩公司的《CAN入門書》的組織思路來學習CAN通信的相關知識,並結合網上相關資料以及學習過程中的領悟整理成筆記。好記性不如爛筆頭,加油!
1 位定時
1.1 比特率和波特率
1) . 位速率:又叫做比特率(bit rata)、信息傳輸率,表示的是單位時間內,總線上傳輸的信息量,即每秒能夠傳輸的二進制位的數量,單位是bit per second。
2)波特率:又叫做傳碼率、信號傳輸率,表示的是單位時間內傳輸的碼元的數量,當兩相調製時,一個碼元用一個二進制位表示,此時波特率在數值上和比特率是一樣的,CAN總線正是兩項調製這種情況。
Tips: 比特率和波特率並不是一回事兒,這一定一定要牢記。
1.2 位時間
1.2.1 位時間的概念
位時間:表示的是一個二進制位在總線上傳輸時所需要的時間。
所以:
首先了解以下CAN總線系統中的兩個時鐘:晶振時鐘週期和CAN時鐘週期
- 晶振時鐘週期:是由單片機振盪器的晶振頻率決定的,指的是振盪器每震盪一次所消耗的時間長度,也是整個系統中最小的時間單位。
- CAN時鐘週期:CAN時鐘是由系統時鐘分頻而來的一個時間長度值,實際上就是一個時間份額Tq。可以按照下面的公式計算:
CAN時鍾周期=2×晶振時鍾周期×BRPCAN時鐘週期=2×晶振時鐘週期×BRP
其中BRP叫做波特率預分頻值(baudrate prescaler)。
1.2.2 位時間的分段
如上文所述,在CAN的位定時中,一個CAN時鐘週期稱爲一個時間量子 — Tq。
如下圖所示:位時間分爲四個段:同步段、傳播段、相位緩衝段1、相位緩衝段2,總共8~25個時間量子(Tq)。
1)同步段(Synchronization Segment):
- 長度固定,1個時間量子Tq;
- 一個位的傳輸從同步段開始;
- 同步段用於同步總線上的各個節點,一個位的跳邊沿在此時間段內。
2)傳播段(Propagation Segment):
- 傳播段用於補償報文在總線和節點上傳輸時所產生的時間延遲;
- 傳播段時長 ≥ 2 × 報文在總線和節點上傳輸時產生的時間延遲 ;
- 傳播段時長可編程(1~8個時間量子Tq)。
3)相位緩衝段1(Phase Buffer Segment1):
- 用於補償節點間的晶振誤差;
- 允許通過重同步對該段加長;
- 在這個時間段的末端進行總線狀態的採樣;
- 長度可編程(1~8個時間量子Tq)
4)相位緩衝段2(Phase Buffer Segment2):
- 用於補償節點間的晶振誤差;
- 允許通過重同步對該段縮短;
- 長度可編程(1~8個時間量子Tq)
於是
tBit:位時間
tSS:同步段時間
tPS:傳播段時間
tPBS1:時間段1
tPBS2:時間段2
2 CAN的同步機制
在CAN通信中,有兩種同步機制:硬同步與重同步。
2.1 同步的規則
☆ 一個位時間內只允許一種同步方式,要麼硬同步要麼重同步;
☆ 任何一個從“隱性”到“顯性”的下降沿 都可以用於同步;
☆ 硬同步發生在報文的SOF位,所有接收節點調整各自當前位的同步段,使其位於發送的SOF位內;
☆ 重同步發生在一個報文SOF位之外的其它段,當下降沿落在了同步段之外時發生重同步;
☆ 在SOF到仲裁場發送的時間段內,如果有多個節點同時發送報文,那麼這些發送節點對跳變沿不進行重同步
2.2 硬同步
硬同步發生在SOF位,所有接收節點調整各自當前位的同步段,調整寬度不限
(1)發送節點Node_A在發送SOF位時,SOF位的下降沿在SS段;
(2)這個時候接收節點Node_B發現自己當前位的SS段和發送節點SOF位的SS段不同步。也就是說當Node_A產生SOF位SS段時,Node_B的當前位的SS段已經在5個Tq之前產生了;
(3)於是接收節點Node_B強行將自己當前位的SS段拉到與SOF位的SS段同步。
2.3 重同步
重同步發生在一個報文SOF位之外的其它位場內,當接收節點Node_B當前位的下降沿落在了發送節點Node_A當前位的同步段之外時發生重同步。
重同步會導致相位緩衝段1的延長或者相位緩衝段2的縮短,從而保證採樣點的準確。
2.3.1 PBS1延長
發的晚(慢),收的早(塊),導致PBS1延長。
如上圖所示:
(1)發送節點Node_A比接收節點Node_B的時間慢了,也就是說Node_A當前位的ss段產生的時候,Node_B 當前位的ss段已經在2個Tq之前產生了;
(2)所以這個時候接收節點Node_B就將PBS1延長2個Tq的時間;
(3)於是這個時候Node_A當前位的採樣點就和Node_B的採樣點同步了。
2.3.2 PBS2縮短
發的早(快),收的晚(慢),導致PBS2縮短。
如上圖所示:
(1)發送節點Node_A當前位的SS段誕生2Tq時長之後,接收節點Node_B的當前位才產生SS段;
(2)於是,接收節點Node_B當前位的PBS2段縮短,
(3)這樣就會導致接收節點Node_B的下一位能夠提前2個Tq,從而Node_B的下一位採樣點和Node_A下一位的採樣點能夠同步。
2.3.3 同步跳轉寬度
在重同步時,有個同步跳轉寬度(SJW,Synchro Jump Width)的概念,表示的是PBS1和PBS2重同步時允許跳轉的最大寬度。
同步跳轉寬度必須滿足以下幾個條件:
- SJW必須小於PBS1和PBS2的最小值
- SJW最大值不能超過4
3 位定時參數的確定
位定時的參數主要涉及以下幾個:
(1)位速率:單位爲bps、Kbps、Mbps
NBT 表示的是一個位時間tBit內包含Tq的個數。
(4)傳輸延遲時間tPTS
CAN報文在CAN總線上的傳輸時,物理延遲包含兩個部分:
- 在CAN-BUS上傳輸造成的延遲
- 在節點上傳輸造成延遲
按照CAN通信協議的規定,補償給傳播延遲的時間長度要至少等於實際實際傳播延遲時長的2被,即:
tPTS≥2×tdel=2×(tdel+tBus)tPTS≥2×tdel=2×(tdel+tBus)
需要注意的是:
Tips: 在CAN總線通信系統中是以時間量子Tq來度量時間的,所以如果延遲補償時間tPTS = 3.1Tq,那麼這個時候要取:tPTS = 4Tq。
(5)相位緩衝段
相位緩衝段的時間長度分爲兩種情況:
if (NBT-1-tPTS_Tq)/2==偶數
PBS1_Tq = PBS2_Tq = (NBT-1-tPTS_Tq)/2
else
PBS1_Tq = (NBT-1-tPTS_Tq)/2
PBS2_Tq = PBS1_Tq + 1
- 1
- 2
- 3
- 4
- 5
- 6
(6) 同步跳轉寬度
(7) 驗證晶振誤差Df
CAN總線的晶振誤差必須同時滿足下面三個條件:
- Df<=SJW(2×10×NBT)Df<=SJW(2×10×NBT)
4 例子
以下面的例子來講述位定時參數的確定方法:
MCU晶振16MHz,位速率1Mbps,總線長度20m,單位總線延遲5ns/m,物理接口的發送接收延遲150ns
(1)晶振時鐘週期:T=1s/16MHz = 62.5ns
(2)位時間 :tBit = 1/1Mbps = 1000ns
(3)BPR和NBT:考慮到 T = 125ns,tBit = 1000ns,所以BPR只能取值爲1,才能滿足NBT∈[8,25],於是預分頻數BPR=1;
(4)CAN時鐘週期Tq = 2 × 62.5 × 1 = 125ns
(5)NBT = 8
(6)傳輸延遲時間tPTS
(8)晶振誤差
- Df<=SJW(2×10×NBT)=1(2×10×8)=0.00625Df<=SJW(2×10×NBT)=1(2×10×8)=0.00625