CAN協議和CANOpen協議是兩套不同的協議。從軟硬體層次來劃分,CAN協議屬於硬體協議,而CANOpen屬於軟體協議。
本文將概述CAN網路,讓大家對CAN匯流排協議有一個全域性的概念,再到底層的CAN匯流排協議知識。
CAN網路可以理解為多臺CAN裝置連線在同一條CAN匯流排上組合成的網路,其中的CAN裝置我們稱之為節點。CAN網路拓撲結構如下圖:
如上圖,一個CAN節點主要包含三類:MCU應用程式、CAN控制器、CAN收發器。
1. MCU應用程式
MCU應用程式我將其分為三塊:業務邏輯程式碼、協議層程式碼、底層驅動程式碼。
A.業務邏輯程式碼:是根據專案需求而定,也很好理解。比如我讀取一個感測器資料,並對其做出相應邏輯處理。
B.協議層程式碼:比如後續要講述的CANOpen。
C.底層驅動程式碼:配置CAN匯流排相應引數、控制收發的程式碼。
2.CAN控制器
CAN控制器內部結構還是挺複雜的,一般現在CAN控制器都是與處理器整合在一起。
其實對於程式設計的人來說,無非也就是包含一些控制、狀態、配置等暫存器。
比如我們看到有些STM32晶片帶有CAN,也就是說CAN控制器已經整合在STM32晶片中了,我們只需要程式設計操作其中的暫存器即可。
3.CAN收發器
CAN收發器:將CAN收發引腳(CAN_TX和CAN_RX)的TTL訊號轉換成CAN匯流排的電平訊號。
PS:你可以把CAN匯流排通訊認為是UART透過485進行通訊:CAN控制器就如UART的控制器,而CAN收發器就如485轉換晶片。
如圖1所示是一個CAN節點的示意圖,整體包括了CAN收發器、CAN控制器和MCU。我們以節點傳送報文為例,當我們使用上位機軟體傳送一段報文時,報文會透過MCU傳送給CAN控制器。CAN控制器將這段報文解析成邏輯訊號後,再傳送給CAN收發器。CAN收發器根據CAN-bus標準將接收到的邏輯訊號轉換成電訊號,再透過CAN_H和CAN_L兩根匯流排將電訊號傳到匯流排上的其他節點上。
簡單說就是MCU將報文傳送給控制器,控制器將報文轉換成符合規範的CAN報文後,透過CAN收發器以電訊號的形式在匯流排上進行傳輸。
ISO標準化的CAN協議
瞭解CAN匯流排位於OSI所在層次。
1.ISO/OSI基本參照模型
【注】
ISO:International Standardization Organization國際標準化組織;
OSI:Open Systems Interconnection開放式系統間互聯;
2.CAN在OSI模型中的定義
【注】
LLC:Logical Link Control邏輯鏈路控制;
MAC:Medium Access Control媒介訪問控制;
從上圖可以知道CAN匯流排底層硬體的內容(CAN控制器、收發器)主要位於OSI的第1層和第2層。
概述CAN匯流排協議
CAN匯流排協議:就是為了保證通訊(收發)資料在CAN匯流排上能穩定傳輸而制訂的一套協議。
CAN匯流排協議的內容很多,為方便初學者理解,本文先大概描述一下CAN匯流排協議,後續文章詳細講述CAN匯流排協議的內容。
1.匯流排訊號
CAN匯流排為「兩線」「差分」訊號,用隱形代表邏輯1,顯性代表邏輯0。如下圖:
2.優先順序
假如某一時刻,一個裝置(節點)往匯流排發0,一個裝置往匯流排發1。那麼匯流排會呈現什麼現象?
答案:最後匯流排呈現為顯性,也就是0。
3.位時序
位時序邏輯將監視序列匯流排,執行取樣並調整取樣點,在調整取樣點時,需要在起始位邊沿進行同步並後續的邊沿進行再同步。
簡單的說就是對一個bit位分幾段進行取樣,目的就是提高資料傳輸穩定性。在STM32中底層驅動程式碼就需要進行位時序程式設計,在STM32參考手冊中也會發現如下位時序圖:
4.幀的種類和格式
幀的種類有多種:
資料幀:用於傳送單元向接收單元傳送資料的幀。
遙控幀:用於接收單元向具有相同 ID 的傳送單元請求資料的幀。
錯誤幀:用於當檢測出錯誤時向其它單元通知錯誤的幀。
過載幀:用於接收單元通知其尚未做好接收準備的幀。
幀間隔:用於將資料幀及遙控幀與前面的幀分離開來的幀。
資料幀和遙控幀有標準格式和擴充套件格式兩種格式。標準格式有11個位的識別符號ID,擴充套件格式有29個位的ID。
邏輯訊號如何轉換成報文?
CAN控制器是CAN-bus裝置的核心元件,整合了CAN規範中資料鏈路層的全部功能,能夠自動完成CAN-bus協議的解析。
當CAN收發器將邏輯訊號傳送給CAN控制器後,CAN控制器會將邏輯訊號轉換成符合CAN規範的CAN幀。而CAN幀的型別包括了資料幀、遠端幀、幀間空間、錯誤幀和超載幀。
5.位填充
位填充是為防止突發錯誤而設定的功能。當同樣的電平持續 5 位時則新增一個位的反型資料。如下圖:
6.錯誤的種類
CAN匯流排的軟體報文
在上面這組報文中:
仲裁域,每組報文開頭內容,前11位字元為識別符號,定義了報文的優先順序,這種報文格式稱為面向內容的編址方案。在同一系統中識別符號是唯一的,不可能有兩個站傳送具有相同識別符號的報文。當幾個站同時競爭匯流排讀取時,這種配置十分重要。
在仲裁域的最後一位是遠端傳輸請求位(RTR),代表資訊幀是資料幀還是不包含任何資料的遠地請求幀
控制域,前兩位是保留位,作為擴充套件位,DLC表示一幀中資料位元組的數目。
資料域,包含0~8位元組的資料。
校驗域,檢驗位錯用的迴圈冗餘校驗域,共15位。
結束域,由七位隱性電平組成。
CAN匯流排是可靠性很高的匯流排,共有五種錯誤:
CRC錯誤:傳送與接收的CRC值不同發生該錯誤;
格式錯誤:幀格式不合法發生該錯誤;
應答錯誤:傳送節點在ACK階段沒有收到應答資訊發生該錯誤;
位傳送錯誤:傳送節點在傳送資訊時發現匯流排電平與傳送電平不符發生該錯誤;
位填充錯誤:通訊線纜上違反通訊規則時發生該錯誤。
當發生這五種錯誤之一時,傳送節點或接受節點將傳送錯誤幀。
CAN節點計數器如何計數:
參考:https://blog.csdn.net/ybhuangfugui/article/details/122852410
https://cloud.tencent.com/developer/article/1635247
https://blog.csdn.net/cai88453626/article/details/131877267
https://www.yoojia.com/ask/17-11637129403634925760.html