1. 程式人生 > >CAN匯流排學習記錄之三:匯流排中主動錯誤和被動錯誤的通俗解釋

CAN匯流排學習記錄之三:匯流排中主動錯誤和被動錯誤的通俗解釋

首先建議把廣泛使用的“主動錯誤”和“被動錯誤”概念換成“主動報錯”和“被動報錯”。

1. 主動報錯站點

只要檢查到錯誤,它立即“主動地”發出錯標識。所謂“出錯標識“,它本身就是一個“錯誤的位序列”(連續的6個顯性位,不滿足 CAN 協議的“最多5個連續的同性位”要求),目的是“主動地”告訴大家:即使你們沒有發現“剛才我已發現”的錯誤,現在我“以身作則”出錯啦!你們該看到這個錯誤了吧!

2. 被動報錯站點

如果檢查到錯誤,它只能乾瞪眼“被動地”等別人(主動報錯站點)報錯,等待的時候它可不能去動匯流排,直到識別出由主動報錯站點發出 的“錯誤的位序列”,它才鬆了一口氣:有人正式報錯了!然後他就可以去競爭匯流排,該幹啥幹啥。

3. 出錯標識本身沒有什麼優先順序的問題。

4. 對於通過競爭得到匯流排使用權的傳送站點來說,它在一邊發一邊聽,有可能出現以下幾種情況:

(a) 它自己就發現錯誤,它就乾脆嘩啦嘩啦,亂髮一氣(連續的發六個同性位)。就象你小時候在幼兒園練習寫字,寫錯一個筆畫你自己就不耐煩了,在紙上嘩啦嘩啦亂畫一氣。目的就是告訴別人(別的站點):出錯了!

(b) 它自己沒有發現錯誤,但作為主動報錯的接收站點發現了錯誤(比如因為線路長,干擾大引起的錯誤),這個發現錯誤的站點就會立即嘩啦嘩啦往總線上亂髮一氣(連續的發六個顯性位),就象你小時候在幼兒園練習寫字,寫錯一個筆畫你自己沒發現,可老師(主動報錯站點)發現了就不耐煩了,在你的紙上嘩啦嘩啦亂畫一氣。目的就是告訴你自己以及告訴別人(傳送站點和別的站點):出錯了!

(c) 它自己沒有發現錯誤,但作為被動報錯的接收站點發現了錯誤(比如因為線路長,干擾大引起的錯誤),這個發現錯誤的站點只能慢慢的等待,等待別的主動報錯站點報錯。如果別的主動報錯站點沒發現錯誤,那就繼續等,一直等到該發 ACK 的時候不給傳送站發這個顯性的 ACK 訊號,當然了其他站點可能會發這個 ACK,那說明其他站點沒有發生錯誤,沒辦法,別人能通訊,你不能!然後積攢到一定的時候,你就脫離匯流排吧!再繼續等待一段時間,脫胎換骨,重新回到總線上(這個時候錯誤記錄都清0了,你肯定是主動報錯站了)。就象你小時候在幼兒園練習寫字,寫錯一個筆畫你自己沒發現,但被別的同學(被動報錯站點)發現了,但他不能說,嘿嘿(亂說話,老師要打屁股的),他就只能等,等老師來發現你的錯誤(等待主動報錯站點報錯),或者老師沒眼力,那就等到收作業的時候,不收你的(不發 ACK),不過老師可能主動來收的(給你發 ACK),那你可沒辦法,繼續等吧,等到你也當老師了(脫胎換骨了)...

Devicenet 協議中關於CAN 的出錯管理的規範

一、 錯誤型別

CAN 提供了檢測下列錯誤型別的機制:

1. 位錯誤

當傳送器將自己傳送的電平與總線上的電平相比較,發現兩者不相等時產生。隱性位傳輸時, 顯形位的檢測在仲裁區, ACK 時間段或被動故障標誌傳輸期間不會導致位錯誤。

2. 應答錯誤

當傳送器確定資訊沒有得到應答時發生。在資料幀及遠端幀之間存在一個應答時間段。該時間段內,所有接收的節點,無論是否是預定的接收者都必須對接收的資訊作出應答。

3. 填充錯誤

當節點檢測到 6 個相同電平值的連續位時發生。在正常工作情況下,當傳送器檢測到它已經發送了 5 個數值相同的連續位時,那麼它將在第六位上插入一個取反值(稱之為位填充)。所有接收器在 CRC (迴圈冗餘檢查)計算之前將除去填充位。 這樣,當節點檢測到 6 個連續的具有相同值的位時,即產生一個填充位錯誤。

4. CRC 錯誤

當 CRC (迴圈冗餘檢查)值與傳送器生成值不匹配時發生。每一幀包含一個由傳送器初始化的迴圈冗餘檢查 (CRC) 域。接收器計算出 CRC值,並與傳送器產生的值相比較。如果兩個值不相等,即產生 CRC 錯誤。

5. 格式錯誤

當在一必須傳送預定值的區內檢測到非法位時發生。確定的預定義的位值必須在 CAN 幀內的一個確定點發送,如果在這些區域中的一個內檢測到非法位值,即產生格式錯誤。

二、節點錯誤狀態

為了儘量減小網路上故障節點的負面影響,進而提供故障界定, CAN 定義了一個故障界定狀態機制。一個節點可能處於下列三種錯誤狀態之一:

1. 錯誤主動(Error Active)

當一個錯誤主動節點檢測到錯誤時,它將傳送一個錯誤主動幀,該幀由 6 個連續的顯性位組成。這一發送將覆蓋其他任何同時生成的傳送,並導致其他所有節點都檢測到一個填充錯誤,並依次放棄當前幀。

當處於錯誤主動狀態的節點檢測到一個傳送問題時,它將發出一個活動錯誤幀,以避免所有其他節點接收資訊包。無論檢測到錯誤的節點是否要接收這個資料都要執行這個過程。

2. 錯誤被動 (Error Passive)

當一個錯誤被動節點檢測到錯誤時,它將發出一個錯誤被動幀。該幀由 6 個連續的隱性位組成,這個幀可能會被同時出現的其他傳送所覆蓋,如果其它站點沒有檢測到這一錯誤將不會引起丟棄當前幀。

3. 離線 (Bus Off)

處於離線狀態下的節點不允許對匯流排有任何影響它在邏輯上與網路斷開。

故障界定狀態機制中所含過程簡述如下:

1. 節點保持對傳送和接收錯誤計數器的跟蹤;
2. 節點在開始錯誤主動狀態時錯誤計數器的值等於0。該狀態下的節點假設所有檢測到的錯誤非該節點所為;
3. 錯誤型別以及檢出錯誤的結點被賦予不同的計數值,這些計數值將根據是傳送還是接收錯誤進行累加。有效的接收及傳送使這些計數器遞減,直至最小值0
4. 當這些計數器中的任何一個超出 CAN 定義的閾值時,該節點進入錯誤被動狀態。在此狀態下該節點將被認為是導致錯誤的原因;
5. 當傳送錯誤計數值超出 CAN 定義的另一個閾值時,節點進入離線狀態。本規範定義了從離線到錯誤主動之間的狀態轉換機制;
6. 當錯誤被動的節點的傳送及接收錯誤計數器值都減小至CAN 定義的閾值以下時,節點重新進入錯誤主動狀態。

本篇隨筆轉自:wenku.baidu.com/view/3a4a173904a1b0717ed5dd6b.html