CAN總線的位時間(決定波特率的根本)主要由Seg1Seg2這兩個段決定。可是,還有一個同樣關鍵的段叫做Propagation Segment

所以,一個完整的標準位時間由以下4個段組成:

  1. 同步段
  2. 傳播時間段
  3. 相位緩衝段1
  4. 相位緩衝段2

Sync Jump Width是一個與這些段相關的、非常核心的容錯參數

下面我們來詳細分解:

1. 決定波特率的四個段

位時間許可想象為將一個CAN位的長度(例如,在500kbps下是2微秒)劃分成的幾個部分。其計算公式為:

波特率 = 1 / 位時間

位時間 = (Sync_Seg + Prop_Seg + Seg1 + Seg2) × 時間量子

其中:

  • 同步段(Sync Segment, Sync_Seg)
  • 作用:用於同步總線上的各個節點。期望的邊沿(從隱性到顯性或反之)就發生在該時間段內。
  • 長度:固定為 1個時間量子。您無法更改它。
  • 傳播時間段(Propagation Segment, Prop_Seg)
  • 作用:用於補償信號在物理總線上傳輸的延遲,包括總線上的延遲和節點內部(收發器、PCB走線)的延遲。
  • 長度:可配置,通常為1-8個時間量子。您提到的第三個關鍵段。就是這個段
  • 相位緩衝段1(Phase Buffer Segment 1, Seg1)
  • 作用:用於補償節點的內部時鐘誤差。它可以在再同步時被延長。
  • 長度:可配置,通常為1-8個時間量子。
  • 相位緩衝段2(Phase Buffer Segment 2, Seg2)
  • 作用:同樣用於補償節點的內部時鐘誤差。它許可在再同步時被縮短。
  • 長度:可安裝,通常為1-8個時間量子。

重要關係:
在常見的控制器(如STM32的bxCAN)中,Prop_Seg 和 Seg1 經常被合併成一個參數,稱為 BS1

  • BS1(時間段1) = Prop_Seg + Seg1
  • BS2(時間段2) = Seg2

:就是因此,我們最常見的配置公式
位時間 = (1 + BS1 + BS2) × 時間量子

採樣點 的位置位於 BS1結束之時(即Seg1的末尾)。採樣點是讀取總線電平並決定該位是顯性還是隱性的時刻。通常建議將採樣點設置在位時間的75% - 80%左右。


2. 同步跳轉寬度(Sync Jump Width, SJW)

現在來回答您關於SJW的部分。

  • 作用:SJW不直接決定波特率,但它決定了在一次再同步過程中,位時間行調整的最大限度。它是一個容錯參數,用於適應不同節點之間的時鐘偏差。
  • 工作原理:當CAN控制器檢測到一個邊沿沒有出現在預期的Sync_Seg內時,它會憑藉延長Seg1或縮短Seg2來“重新同步”自己的位時鐘。SJW的值限制了這種調整的最大幅度。
  • 通過SJW決定了Seg1最多能夠被延長多少個時間量子。
  • SJW也決定了Seg2最多可以被縮短多少個時間量子。
  • 配置規則:SJW的值通常設置為1到4之間,並且必須滿足:SJW ≤ Min(BS1, BS2)説,它不能大於BS1和BS2中較小的那個。就是。也就

總結與配置示例

假設我們要配置一個500kbps的CAN總線,使用8MHz的時鐘,目標採樣點為80%。

  1. 計算時間量子: 時間量子 = 1 / 8MHz = 0.125 µs
  2. 計算位時間: 位時間 = 1 / 500kHz = 2 µs
  3. 計算總時間量子數: 總時間量子數 = 2 µs / 0.125 µs = 16
  4. 分配各段
  • Sync_Seg = 1 (固定)
  • 剩餘 16 - 1 = 15 個時間量子分配給 BS1 和 BS2。
  • 為了達到80%的採樣點,採樣點應在 16 * 0.8 = 12.8 -> 約第13個時間量子處。採樣點在BS1末尾,所以:
  • BS1= (Prop_Seg + Seg1) = 12 (包括Sync_Seg的1,所以實際是13-1=12)
  • BS2= Seg2 = 16 - 1 - 12 = 3
  • 檢查:採樣點 = (1 + BS1) / (1 + BS1 + BS2) = (1+12)/16 = 81.25%,符合要求。
  1. 設置SJW
  • Min(BS1, BS2) = Min(12, 3) = 3
  • 我們可能設置SJW = 12以提供足夠的容錯,同時保持穩定。

結論:

  • 直接決定波特率的是:Sync_Seg(固定為1)、Prop_Seg、Seg1 和 Seg2
  • SJW是一個至關重要的輔助和容錯參數,它確保了在存在時鐘偏差時,由上述四個段定義的位時間仍然能夠穩定可靠地工作。