CAN Protocol 介紹
CAN 全名為控制器區域網路 (Controller Area Network) ,由德國BOSCH公司開發目前也是應用最廣泛的現場匯流排。CAN的兩個國際標準分別是ISO11898與11519-2,ISO11898為高速ISO 11519-2為低速,兩者主要差異如下表:
|
ISO11898(高速) |
ISO11519-2(低速) |
通訊速度 |
最高可達 1Mbps |
最高可達 125kbps |
BUS長度 |
最大 40m |
最大 1km |
Max Unit |
30 |
20 |
Bus 型態 |
閉環 |
開環 |
阻抗 |
120Ω |
120Ω |
終端電阻 |
120Ω (Min 85Ω Max 130Ω) |
2.2kΩ (Min 2.09kΩ Max 2.31Ω) |
閉環Bus: 兩端需要接上120Ω的終端電阻
開環Bus : 由於是開環兩Bus是獨立的,每個Bus要串聯一個2.2kΩ的電阻
CAN的應用範圍很廣,最常見的為應用在車輛產業與嵌入式工業等等,而在汽車產業當中也定義了一個以CAN為底層的SAE J1939協定。為什麼CAN會應用的這麼廣泛,主要是因為它有很高的可靠性、錯誤檢測能力、擴充容易與低成本,同時雙絞線的設計可以降低訊號的干擾。
為何要加上終端電阻?
最主要目的就是為了穩定通訊,避免信號反射的問題導致資料在傳輸的過程當中出現錯誤!
- 提高放電速度:使Bus總線快速進入隱性狀態提高抗干擾之能力
- 終端電阻過小:CAN-Bus於採樣時無法辨別高低電位導致資料混亂。
- 終端電阻過大: 訊號出現下降沿過緩且時間過長,導致總線錯誤。
CAN 特性:
CAN Bus按傳輸速度來區分的話可以分為:
- 高速 (HSCAN) :應用於安全性需求較高的設備 Ex: ABS 、操作相關
- 中速 (MSCAN) :車載音響
- 低速 (LSCAN) : 應用於較無關的輔助設備
CAN Bus 主要特點 :
- 單筆傳輸最大可傳送 8 bytes 資料
- CAN是以訊息做傳輸而不是地址
- ID資料定義在訊息當中,而不是在節點上。所以在擴充or移除時可透過軟體直接執行
- CAN又分為2.0A與2.0B,2.0A最大可以支援2^11 Node ; 2.0 B最大可支援2^29 Node
- CSMA/CD-CR Protocol
- 在整個通訊系統當中,每個Node都可以作為一個Master,且無須Host。
- 優秀的抗干擾與除錯能力
介紹一下第5點CSMA/CD-CR
- CSMA(Carrier Sense Multiple Access) : 在訊息要傳送之前需要對Bus進行檢查,當確認為空閒狀態時才可以進行傳送,同時可讓多個設備同時存取Bus,一個設備傳送的資料可以被多個設備接收,可以想成是廣播既然是廣播就會發生碰撞,所以必須先檢查有沒有其他設備正在使用。
- CD-CR (Collisions Detection & Collisions Resolution) : 分別為碰撞偵測與碰撞處理機制,像上方說的既然是廣播方式那必定會有碰撞,這時候就需要碰撞偵測與碰撞處理,來解決衝突的問題。
CAN的碰撞機制透過仲裁來處理,每筆訊息都會有定義ID來決定優先權。可以看到下方圖以CAN2.0A為例,仲裁碼(ID)為9 bit 當發生碰撞時會比較兩節點ID較小,較小者優先發送,另一設備則須等待。
CAN Bus 訊息框架介紹
- 標準資料框架 : 最多可支援2^11個節點,單一訊息可傳送8 Bytes資料
- 擴展資料框架 :最多可支援2^29個節點,單一訊息可傳送8Bytes資料
接下來一一來介紹每一個位元所代表的意義~
- SOF : 開始時送出一位元的Dominant (0) 用來作為同步用途。
- Arbitration Field : 就是前面所提到的仲裁碼,用來判斷優先權。當多節點同時重送時會一個一個判斷。這邊分為CAN 2.0A與CAN 2.0B分別為 11bits 與 29bits。
- RTR : 判斷要傳送還是接收,RTR = 0表示要傳送 RTR = 1表示要接收
- Control Field : 資料長度也就是DLC的部分,有4個bit對應如下表:
DLC |
DLC3 |
DLC2 |
DLC1 |
DLC0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
2 |
0 |
0 |
1 |
0 |
3 |
0 |
0 |
1 |
1 |
4 |
0 |
1 |
0 |
0 |
5 |
0 |
1 |
0 |
1 |
6 |
0 |
1 |
1 |
0 |
7 |
0 |
1 |
1 |
1 |
8 |
1 |
0/1 |
0/1 |
0/1 |
- IDE: 決定是標準格式為IDE = 0;擴展格式為 IDE = 1。
- R0 : 保留 未用
- Data Field : 寫入要發發送的資料or存入要接收的資料 0~ 8Bytes
- CRC Field : 錯誤檢查用途
- ACK Field : 確認應答機制,傳送端送出一個1後當接收正確該接收設備會傳送 0
- EOF : 通訊結束欄位,每筆資料都是由7個bit的1當作結束的判斷
- 遠端通訊格式 (Remote Frame) : 用途為請求遠端節點(設備)傳送資料,與第一二點類似只是資料長度0,並依照2.0A or B來選擇。當A設備要B設備給資料時,A送出遠端格式同時將B的ID寫入開頭的仲裁位,並且在RTR當中填1後續接上3bit的間歇時間。
- 錯誤通訊格式(Error Frame) : 當接收到的訊息錯誤時,接收到的設備會發送錯誤格式告訴其他節點。發現錯誤資料時一定會接上6bit的錯誤旗標最長可以到12bit,後續再接上8bit區隔位元。
Error bit 則依照設備的狀態做選擇(主動、被動、關閉),主動為6個0被動為6個1。
- 超載通訊格式(Overload Frame) : 假如設備需要更多時間處理時,可以使用超仔通訊格式來延遲下一筆資料的時間,接再遠端通訊格式or資料通訊格式之後。
CAN-Bus錯誤偵測
- CRC Error (CRC錯誤) : 主要用來檢查數據傳送後可能出現的錯誤。產生的數字在傳送之前會計算出來並且附加到資料後面,也就是上方的CRC Field,然後接收方進行檢驗確定資料是否發生變化。
- ACK Error (ACK錯誤) : 傳送端會傳出2個bit的1為ACK Field,前者為ACK Slot後者為ACK 區隔位元。當傳送端在ACK Slot送出1的時候,接收端要回傳0。如果不是的話那就會在ACK 區隔位元後面傳送error frame。
- Format Error (格式錯誤) : CRC與ACK都有區隔位元(delimiter),這些bit都為1如果在這些bit上讀到0,那從下一個bit開始就傳送Error Frame。
- Stuff Error (填充錯誤) : 接收端和傳送端共同說好傳送幾個相同的bits就要傳送一個相反的bit,用來跟delimiter 做區隔。當訊息中連續偵測到6個相同的bit的時候,就會從下一個bit開始傳送Error Frame。
- Bit Error (位元錯誤) : 處於發送資料中的設備會比較發送的資料和匯流排中的電位變化是否一致,如果不一致則直接在位傳完的訊息後面接著傳送一個Error Frame。
CAN-Bus 硬體
CAN-Bus在接收or傳送資料時,主要須設定三個部分來判斷CAN是否優先傳送or正確接收資料。
- 節點仲裁碼(Arbitrary / ID)→傳送
- 訊息遮罩 (Mask)→接收 : 當Mask都為0時,不管ID與Filter是多少都能通過。當Mask為1時,需檢查Filter與ID位元是否相等,相等才能通過。
- 訊息過濾器 (Filter)→接收
Mask |
Filter |
ID |
通過? |
0 |
n(皆可) |
n(皆可) |
Y |
1 |
0 |
0 |
Y |
1 |
0 |
1 |
N |
1 |
1 |
0 |
N |
1 |
1 |
1 |
Y |
舉例來說可以看到下方圖
- 正確設置 可以通過
- 錯誤設置 無法通過
CAN 訊息位元結構
CAN訊息位元結構會由以下4個區段所組成
- 同步段 (Synchronization Segment)
- 傳播段 (Propagation Segment)
- 相位緩衝段1 (Phase Buffer Segment 1)
- 相位緩衝段2 (Phase Buffer Segment 2)
每個位元區段由數個單位時間組成(TQ),最少8個最多25個。
計算方式 :
Tpclk = CAN時鐘的週期(CAN使用APB1時鐘)
- 正常的位時間(Tnbt) = (1+Tbs1 + Tbs2)x Tq
- Tq = (BRP+1) x Tpclk
設CAN時鐘頻率為Fpclk
- Tq = (BRP+1)/Fpclk
- Tnbt =(1+Tbs1 + Tbs2)x (BRP+1) / Fpclk
由4可以知道CAN輸出波特率(Fcan = 1 / Tnbt )為:
Fcan = Fpclk / ( (1+Tbs1 + Tbs2)x (BRP[9:0]+1) )
上圖來源: 手冊