CAN總線是一種常用的總線,對于剛開始接觸CAN總線的,面對著各式各樣的資料,可能不知道從何看起,今天科普一下CAN總線的基礎知識。CAN2.0協議分為A版本和B版本,A版本協議為11位標識符(標準幀),B版本在兼容11位ID標識符的同時,向上擴展到29位ID標識符。
CAN總線的物理電平
對 CAN 總線的協議了解之前,先介紹一下 CAN總線的電平,CAN總線的基本狀態有兩種,分別為“顯性”和“隱性”,也就是“邏輯 0”和“邏輯 1”,如圖 1:
圖中兩個 CAN 總線節點分別接在 CAN 總線上,兩個終端為什么要接兩個 120Ω的終端電阻?首先解釋一下“終端電阻”這個名詞,終端電阻是一種信號在傳輸過程中遇到的阻礙,高頻信號傳輸時,信號波長相對傳輸線較短,信號在傳輸線終端會形成反射波,干擾原信號,所以需要在傳輸線末端加終端電阻,使信號到達傳輸線末端后不反射。對于低頻信號則不用。在長線信號傳輸時,一般為了避免信號的反射和回波,也需要在接收端接入終端匹配電阻。 終端匹配電阻值取決于電纜的阻抗特性,特別注意的是與電纜的長度無關。RS-485/RS-422 /CAN 總線一般采用雙絞線(屏蔽或非屏蔽)連接,終端電阻一般介于100至140Ω之間,典型值為120Ω。在實際配置時,在電纜的兩個終端節點上,即最近端和最遠端,各接入一個終端電阻,而處于中間部分的節點則不能接入終端電阻,否則將導致通訊出錯。
現在繼續介紹 CAN 總線的邏輯,CAN 總線傳輸數據時,依靠的是差分電平,因為 CAN 總線是雙絞線,所以在沒有數據傳輸時,兩條線的電壓相同,均為2.5V,差值為 0,所以為“隱形”,若是有數據傳輸時,兩條線就會出現電壓不通的情況,CAN_H 為 3.5V、CAN_L 為 1.5V,電壓差為 2V,所以為“顯性”。 現在用兩個等式來對 CAN 的電平做一個總結,那就是: CAN 總線為隱性 = 無電壓差 = 邏輯 1 CAN 總線為顯性 = 有電壓差 = 邏輯0
CAN報文幀詳解
在了解 CAN 硬件之后,知道了邏輯“0”和邏輯“1”,CAN 報文幀就是由這些0和1組成。由圖可以看出,CAN-bus 的通信幀共分為五種幀:數據幀、遠程幀、錯誤幀、過載幀和幀間隔,數據幀又有標準幀和擴展幀兩種。
數據幀和遙控幀
在 CAN 協議中,數據幀和遙控幀有著諸多相同之處,將數據幀和遙控幀放在一起來講。數據幀是指包含了要傳輸的數據的幀,作用是承載發送節點要傳遞給接收節點的數據。遙控幀的作用:請求其它節點發出與本遙控幀具有相同 ID 號的數據幀。發起方發起特定ID的遙控幀,并且只發送ID部分,那么與其 ID相符的終端設備就有義務在后半段的數據部分接管總線控制權并發送自己的數據。 例如中控機需要定時獲取某個節點的數據(例如轉速計的實時轉速、油量計的實時油量等),可以向總線發送遠程幀;相應節點在接收判斷幀 ID與自己相符、并且是遠程幀的情況下,就可以將自己的實時數據發送到總線上;這樣中控機就獲取到了相關節點的實時數據。遠程幀最大的好處就是只需要一幀的時間就能完成一次雙向交互。兩種幀格式由幀起始、仲裁幀、控制端、數據段、CPC 段、ACK 段、幀結束, 不同的段有不同的用途。
起始段
幀的最開始的一位是幀起始,也叫 SOF(Start Of Frame),SOF 恒為顯性位,即邏輯0。幀起始表示CAN_H和CAN_L上有了電位差,也就是說,一旦總線上有了 SOF 就表示總線上開始有報文了。
仲裁段
CAN 總線有一個特點,就是所有節點均可以獲得總線的控制權并且向 CAN 總線發送數據,當同時有 2 個或 2 個以上的設備要求發送數據時,就會產生總線沖突,這時就需要判斷一個先后順序,而仲裁段就是判斷先后順序的裁判員,仲裁段會對 CAN 數據進行比較,ID 碼值越小的數據越具有優先權,從而使具有高優先級的數據不受任何損壞地傳輸。
仲裁段是如何仲裁的?各節點在向總線發送電平的同時,也對總線上的電平讀取,并與自身發送的電平進行比較,如果電平相同繼續發送下一位,不同則停止發送退出總線競爭。剩余的節點繼續上述過程,直到總線上只剩下1個節點發送的電平,總線競爭結束,優先級高的節點獲得總線的控制權。 假設 CAN 總線上有兩個節點,節點A和節點 B,節點A 的 ID為 10101000000,節點 B 的ID為 101100000,當節點 A 和節點 B 同時向CAN 總線發送數據時,如下圖,當發送到 ID7 時,節點 A 仲裁成功,從而獲得 CAN 總線的控制權,繼而發送全部消息。
總線中的信號持續跟蹤最后獲得總線控制權發出的報文,在這里值得注意的是,CAN 總線的這種仲裁方式優點在于,無論是總線的控制權在哪個節點,CAN 總線傳輸的報文已經在總線上傳輸了。 因此,CAN 總線具有高優先級的節點的數據在傳輸時,沒有任何延遲,在獲得總線控制權的節點發送數據過程中,其他節點成為報文的接收節點,并且不會在總線再次空閑之前發送報文。仲裁段是用來判定一幀報文優先級的依據,仲裁段中的 ID 號也是實現報文過濾機制的基礎。那么不同幀的優先級是怎么體現的呢?
RTR 位:Tranmission Request Bit (遠程發送請求位),RTR 用來區分該幀是數據幀還是遠程幀。當 RTR為邏輯 0 時,代表該幀為數據幀;當 RTR 為邏輯 1 時,代表該幀為遠程幀。 由圖可以看出,當四種傳輸幀時,由于標準數據幀和擴展數據幀的RTR 都為 0,可以看出數據幀的優先級大于遠程幀的優先級。RTR 的作用是在前 11 位 ID 號相同的情況下,保證數據幀優先級高于遠程幀。SRR 位:Substitutes for Remote Requests Bit(替代遠程請求位) 在擴展幀(數據幀或遙控幀)中,SRR 恒為隱性位 1,并且可以發現,擴展幀的隱性 SRR 位正好對應標準數據幀的顯性 RTR 位,可以看出標準幀的優先級高于擴展幀。SRR 位的作用,在前 11 位 ID 號相同的情況下,標準數據幀的優先級高于擴展數據幀。IDE 位:Identifier Extension Bit(標識符擴展位),IDE 用來區分該幀是標準幀幀還是擴展幀。當 IDE 為邏輯 0 時,代表該幀為標準幀;當 IDE 為邏輯 1 時,代表該幀為擴展幀。擴展幀 IDE 位和標準幀 IDE 位位置對應,可以看出,標準遙控幀的優先級一定高于擴展遙控幀。IDE 位的作用,在前 11 位相同的情況下,標準數據幀的優先級高于擴展數據幀。在 ID 號前 11 位相同的情況下:RTR :保證數據幀優先級高于遠程幀; SRR :保證標準數據幀的優先級高于擴展數據幀。 IDE :保證標準遙控幀的優先級高于擴展遠程幀。
控制段
控制段由6個位組成,標準格式和擴展格式的控制場格式不同。
標準格式里的幀包括:數據長度代碼、IDE 位(為顯性位)及保留位 RB0。 擴展格式里的幀包括:數據長度代碼、兩個保留位 RB0 和 RB1。其保留位必須發送為顯性,但是接收器認可“顯性”和“隱性”位的任何組合,其結構如圖所示:
數據幀長度代碼(DLC),指示了數據場里的字節數量。其中:d—“顯性”, r—“隱性”, 數據幀允許的數據字節數為{0,1,...,7,8}。其他的數值不允許使用。
數據段
數據段由數據幀里的發送數據組成。它可以為 0~8 個字節,每字節包含了 8 個位,首先發送最高有效位(MSB)。
CRC校驗段
CRC 包含 CRC 校驗序列和 CRC 界定符(恒為隱形,即邏輯 1),通過多項式生成 CRC 值,比較發送節點與接受節點 CRC 是否一致,來確保幀的有效性,計算范圍包括發送節點【幀起始、仲裁場、控制場、數據場】是否與接收節點【幀起始、仲裁場、控制場、數據場】是否一致。
傳統 CAN 使用的是 CRC15 的算法,這個通過 CAN 的數據結構也可以看出,CRC段的長度就是 15 位。CAN FD 之所以有兩種是因為 CAN FD 的數據長度是可變的, 針對不同的數據長度使用的方法不同,低于 16 字節的使用的是 CRC17,高于 16 字節的使用的是 CRC21。
ACK段
ACK段包含 ACK 槽和 ACK 界定符兩個位。
發送節點在 ACK 段發送兩個隱性位,即發送方發出的報文中 ACK 槽為隱性 1;接收節點在接收到正確的報文之后會在 ACK 槽發送顯性位 0,通知發送節點正常接收結束。所謂接收到正確的報文指的是接收到的報文沒有填充錯誤、格式錯誤、CRC 錯誤。 以標準數據幀為例來分析 ACK 段的工作方式,Node_A 為發送節點, Node_B 為接收節點。Node_A 在 ACK 段發送兩個隱性位 1。Node_B 正確接收到這一報文后,在 ACK 段的 ACK 槽中填充了一個顯性位 0。注意,這個時候 Node_A 回讀到的總線上的額電平為顯性 0,于是這個時候,Node_A 就知道自己發出去的報文至少有一個節點正確接收了。
結束段(EOF)
每一個數據幀或遠程幀均由 7 個連續的隱性位 1 組成。幀結束強制不遵守位填充特性,表達出明顯的結束標識。這樣接收節點可以正確檢測到一個幀的傳輸結束。 我們在《詳解常用的CAN總線(上):報文幀》一文中詳細了解了CAN總線的報文幀,今天一起來看看常遇到的錯誤幀。
錯誤幀種類
錯誤幀種類分為5種,分別是:位發送錯誤、ACK錯誤、位填充錯誤、CRC錯誤、格式錯誤。
位發送錯誤
節點將自己發送到總線上的電平與同時從總線上回讀到的電平進行比較,如果發現二者不一致,那么這個節點就會檢測出一個位錯誤。 實際上所謂“發出的電平與從總線上回讀的電平不一致”,指的就是節點向總線發出隱性位,卻從總線上回讀到顯性位或者節點向總線發出顯性位,卻從總線上回讀到隱性位這兩種情況。
ACK錯誤
ACK在ACK段中講解過,按照CAN協議的規定,發送節點Node_A在一幀報文(數據幀或者遙控幀)發出之后,如果接收節點Node_B成功接收了該幀報文,那么接收節點Node_B就要在該幀報文ACK槽對應的時間段內向總線上發送一個顯性位來應答發送節點Node_A。 這樣發送節點Node_A就會在ACK槽時間段內從總線上回讀到一個顯性位。因此:當發送節點Node_A在ACK槽時間段內沒有回讀到顯性位,那么發送節點Node_A就會檢測到一個ACK應答錯誤。這表示沒有一個節點成功接收該幀報文,此時CAN總線認為是ACK應答錯誤
位填充錯誤
幀起始到CRC校驗之前的物理上電平不允許有6個連續的相同電平,發送器只要檢測到位流中有5個連續相同邏輯的位,便會自動在下一位插入一個相反的電平。
從幀起始到CRC之間,接收節點檢測到有6個連續相同的位電平時,也就是違反5位相同位插入1位相反位的“位填充”原則;因為ACK域和幀結束域電平固定,也無需填充;幀起始、仲裁域、控制域、數據域以及CRC校驗和域,均通過位填充方法編碼。 位填充是指:無論何時,發送器只要檢測到位流中有5個連續相同邏輯的位,便會自動在位流中插入一個補碼位。舉例來說,如果連續5個顯性位,則在5個顯性位之后自動插入1個隱性位,接收器會自動刪除這個插入的填充位。 數據幀或遠程幀的剩余位域(CRC界定符、應答域和幀結尾域)形式固定,不填充;錯誤幀和過載幀也不填充。那么位填充規則的作用是什么呢?原因有兩點:1.CAN網絡同步需要足夠多的上升沿,這是CAN協議規定位填充的目的之一。 2.確保數據幀不會被當作錯誤幀(由6個連續的顯性或隱性位組成)、確保正確識別幀結束標志(7個連續隱性位)。
CRC錯誤
發送端送出的CRC序列由發送器算出,接收器執行同樣的CRC算法,若計算結果與接收到的CRC序列不符,則認為CRC錯誤。
幀格式錯誤
主動錯誤狀態:處于主動錯誤狀態的節點(可能是接收節點也可能是發送節點)在檢測出錯誤時,發出主動錯誤標志。 如果發出主動錯誤幀的節點是發送節點,這個情況下就相當于:剛剛發送的那一幀報文發錯了,現在破壞掉它(發送主動錯誤幀),你們不管收到什么都不算數; 如果發出主動錯誤幀的節點是接收節點,這個情況就相當于:剛剛收報文的時候發現了錯誤,不管你們有沒有發現這個錯誤,現在主動站出來告訴大家這個錯誤,并把這一幀報文破壞掉(發送主動錯誤幀),剛才你們收到的東西不管對錯都不算數了。 處于主動錯誤狀態,說明這個節點目前是比較可靠的,出現錯誤的原因可能不是它本身的問題,即剛剛檢測到的錯誤可能不僅僅只有它自己遇到,正是因為這一點,整個總線才相信它報告的錯誤,允許它破壞掉發送中的報文,也就是將這一次的發送作廢。被動錯誤狀態:錯誤比較多,很可能錯誤是人為導致的,通知其他節點有錯但是不干擾他們正常收發數據,也不要求重發,同時不能連續發送了,得再插入8位隱性位的“延遲傳送”段;這樣是為了讓其他正常節點(處于主動錯誤)優先使用總線。 被動錯誤的節點很可能存在硬件故障,不能讓它拖累整個網絡; 過載幀:接收節點向總線上其它節點報告自身接收能力達到極限的,可以這樣理解:接收節點Node_A接收報文的能力達到極限了,于是Node_A就會發出過載幀來告訴總線上的其它節點(包括發送節點),接收節點Node_A已經沒有能力處理你們發來的報文了。 過載幀包括:過載標志和過載界定符兩個部分。 過載標志:連續6個顯性位。 過載界定符:連續8個隱性位。 與錯誤幀類似,過載幀中有過載幀重疊部分,且形成過載重疊標志的原因與形成錯誤幀中的錯誤重疊標志的原因是相同的。那么怎么通俗的理解過載幀呢?接收節點Node_A達到接收極限時,就會發出過載幀到總線上,顯然,過載標志的6個連續顯性位會屏蔽掉總線上其它節點的發送,也就是說這個時候Node_A通過發送過載幀的方式來破壞其它節點的發送,這樣在Node_A發送過載幀期間,其它節點就不能成功發送報文,于是就相當于把其它節點的發送推遲了,也就是說Node_A在其發送過載幀的這段時間得以“休息”。幀間隔:用于將數據幀或遠程幀和他們之前的幀分離開,但過載幀和錯誤幀前面不會插入幀間隔。也就是說數據幀(或者遠程幀)通過插入幀間隔可以將本幀與先行幀(數據幀、遠程幀、錯誤幀、過載幀)分隔開來。
-
CAN總線
+關注
關注
145文章
1956瀏覽量
131137 -
CAN
+關注
關注
57文章
2773瀏覽量
464465 -
crc
+關注
關注
0文章
199瀏覽量
29592
原文標題:CAN總線這么常用,看這篇就夠了!
文章出處:【微信號:雷達通信電子戰,微信公眾號:雷達通信電子戰】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【CAN總線知識】為何總線“鐮刀”波形頻頻發生?
![【<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>知識</b>】為何<b class='flag-5'>總線</b>“鐮刀”波形頻頻發生?](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
如何使用Arduino實現CAN總線通信
![](https://file1.elecfans.com/web2/M00/0B/0D/wKgZomcse3WAMCkFAAHZ5kcfkGo538.jpg)
![](https://file1.elecfans.com/web2/M00/0B/AF/wKgaomcoXPyAd0BeAAHVXcPTtkk237.jpg)
![](https://file1.elecfans.com/web2/M00/0B/56/wKgaomcgYsCAXo3oAAI0Tzg84-Q157.jpg)
【CAN總線知識】全面了解CAN總線協議
![【<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>知識</b>】全面了解<b class='flag-5'>CAN</b><b class='flag-5'>總線</b>協議](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
![](https://file1.elecfans.com/web2/M00/09/6E/wKgaomb4rj2AWt3OAAxBUmL4rrw100.jpg)
【CAN總線知識】如何接好CAN的“地”
![【<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>知識</b>】如何接好<b class='flag-5'>CAN</b>的“地”](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
評論