1. 程式人生 > >CAN匯流排的遠端、錯誤幀的作用!

CAN匯流排的遠端、錯誤幀的作用!

轉自:http://m.blog.csdn.net/blog/whw8007/38351721#

CAN 遠端幀是一個空資料場的幀, 關鍵是在它的ID場和遠端幀標誌位,當遠端幀標誌位為1時他就是遠端幀,資料場必須為空,被請求節點通過ID場的辨識來響應,傳送被請求的幀到總線上,具體舉例,我隨便舉一個,BCM需要知道車門的狀態,一個遠端幀過去,車門把自己的狀態發回來

 ---------------------------------------------------------------------------------------------------------------------------------------

錯誤幀分為主動錯誤幀和被動錯誤幀
主動錯誤幀是6-12個顯性位(主動錯誤標誌)+8個隱性位(錯誤界定符)
被動錯誤幀是6個隱性(被動錯誤標誌,可被其他節點顯性位覆蓋)+8個隱性位(錯誤界定符)

錯誤幀的工作原理:是打破CAN的位填充規則,從而導致接收資料的節點產生錯誤。

節點的錯誤模式:
主動錯誤模式:是可以正常收發資料的模式(收發錯誤計數器均小於128),可以傳送主動錯誤幀
被動錯誤模式:是節點本身受干擾或錯誤比較多時的工作模式(收或發錯誤計數器大於127,小於256),該模式下節點只能傳送被動錯誤幀,其實就是不允許它阻塞別的正常節點的通訊
匯流排關閉模式:節點錯誤很多時進入的模式(收或發錯誤計數器等於256),收發都被禁止。


三種模式由收/發錯誤計數器的值自動進行管理

----------------------------------------------------------------------------------------------------------------------------------------

主動報錯"和"被動報錯",

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

錯誤了吧!
2.被動報錯站點:如果檢查到錯誤,它只能乾瞪眼"被動地"等別人(主動報錯點)報錯,等待的時候它可不能去動匯流排,直到識別出由主動報錯站點發出的"錯誤的位序列",它才鬆了一口氣:有人正式報錯了!然後他就可以去競爭匯流排,該幹啥幹啥
3.出錯標識本身沒有什麼優先順序的問題.
4.對於通過競爭得到匯流排使用權的傳送站點來說,它在一邊發一邊聽,有可能
  (a).它自己就發現錯誤,它就乾脆嘩啦嘩啦,亂髮一氣(連續的發六個同性位).   就象你小時候在幼兒園練習寫字,寫錯一個筆畫你自己就不耐煩了,在紙上嘩啦嘩啦,亂畫一氣.目的就是告訴別人(別的站點),出錯了!
  (b).它自己沒有發現錯誤,但作為主動報錯的接收站點發現了錯誤(比如因為線路長,干擾大引起的錯誤),這個發現錯誤的站點就會立即嘩啦嘩啦往總線上亂髮一氣(連續的發六個顯性位),就象你小時候在幼兒園練習寫字,   寫錯一個筆畫你自己沒發現,可老師(主動報錯站點)發現了就不耐煩了,  在你的紙上嘩啦嘩啦,亂畫一氣.目的就是你自己以及告訴別人(傳送站點和別的站點),出錯了!
  (c).它自己沒有發現錯誤,但作為被動報錯的接收站點發現了錯誤(比如因為線路長,干擾大引起的錯誤),這個發現錯誤的站點只能慢慢的等待,等待別的主動報錯站點報錯,如果別的主動報錯站點沒發現錯誤,那就繼續等,一直等到該發ACK的時候不給傳送站發這個顯性的ACK訊號,當然了其他站點可能會發這個ACK,那說明其他站點沒有發生錯誤,沒辦法,別人能通訊,  你不能!然後積攢到一定的時候,你就脫離匯流排吧!再繼續等待一段時間,  脫胎換骨,重新回到總線上(這個時候錯誤記錄都清0了,你肯定是主動報錯站了).就象你小時候在幼兒園練習寫字,寫錯一個筆畫你自己沒發現,  別的同學(被動報錯站點)發現了但他不能說,嘿嘿(亂說話,老師要打屁股的),他就只能等,等老師來發現你的錯誤(等待主動報錯站點報錯),或者老師沒眼力,那就等到收作業的時候,不收你的(不發ACK),不過老師可能主動來收的(給你發ACK),那你可沒辦法,繼續等吧,等到你也當老師了(脫胎換骨了),.........

-----------------------------------------------------------------------------------------------------------------------------------------

位仲裁

CAN匯流排以報文為單位進行資料傳送,報文的優先順序結合在11位識別符號中,具有最低二進位制數的識別符號有最高的優先順序。這種優先順序一旦在系統設計時被確立後就不能再被更改。匯流排讀取中的衝突可通過位仲裁解決。如圖2

所示,當幾個站同時傳送報文時,站1的報文識別符號為011111;站2的報文識別符號為0100110;站3的報文識別符號為0100111。所有識別符號都有相同的兩位01,直到第3位進行比較時,站1的報文被丟掉,因為它的第3位為高,而其它兩個站的報文第3位為低。站2和站3報文的4、5、6位相同,直到第7位時,站3的報文才被丟失。注意,匯流排中的訊號持續跟蹤最後獲得匯流排讀取權的站的報文。在此例中,站2的報文被跟蹤。這種非破壞性位仲裁方法的優點在於,在網路最終確定哪一個站的報文被傳送以前,報文的起始部分已經在網路上傳送了。所有未獲得匯流排讀取權的站都成為具有最高優先權報文的接收站,並且不會在匯流排再次空閒前傳送報文。

資料錯誤檢測
CAN協議可使用五種檢查錯誤的方法,其中前三種為基於報文內容檢查。
1,迴圈冗餘檢查(CRC)
在一幀報文中加入冗餘檢查位可保證報文正確。接收站通過CRC可判斷報文是否有錯。
2 ,幀檢查
這種方法通過位場檢查幀的格式和大小來確定報文的正確性,用於檢查格式上的錯誤。
3 ,應答錯誤
如前所述,被接收到的幀由接收站通過明確的應答來確認。如果傳送站未收到應答,那麼表明接收站發現幀中有錯誤,也就是說,ACK場已損壞或網路中的報文無站接收。CAN協議也可通過位檢查的方法探測錯誤。
4,匯流排檢測
有時,CAN中的一個節點可監測自己發出的訊號。因此,傳送報文的站可以觀測匯流排電平並探測傳送位和接收位的差異
5,位填充
一幀報文中的每一位都由不歸零碼表示,可保證位編碼的最大效率。然而,如果在一幀報文中有太多相同電平的位,就有可能失去同步。為保證同步,同步沿用位填充產生。在五個連續相等位後,傳送站自動插入一個與之互補的補碼位;接收時,這個填充位被自動丟掉。例如,五個連續的低電平位後,CAN自動插入一個高電平位。CAN通過這種編碼規則檢查錯誤,如果在一幀報文中有6個相同位,CAN就知道發生了錯誤。


如果至少有一個站通過以上方法探測到 一個或多個錯誤,它將傳送出錯標誌終止當前的傳送。這可以阻止其它

站接收錯誤的報文,並保證網路上報文的一致性。當大量傳送資料被終止後,傳送站會自動地重新發送資料。作為規則,在探測到錯誤後23個位週期內重新開始傳送。在特殊場合,系統的恢復時間為31個位週期。
但這種方法存在一個問題,即一個發生錯誤的站將導致所有資料被終止,其中也包括正確的資料。因此,如果不採取自監測措施,匯流排系統應採用模組化設計。為此,CAN協議提供一種將偶然錯誤從永久錯誤和區域性站失敗中區別出來的辦法。這種方法可以通過對出錯站統計評估來確定一個站本身的錯誤並進入一種不會對其它站產生不良影響的執行方法來實現,即站可以通過關閉自己來阻止正常資料因被錯誤地當成不正確的資料而被終止。

----------------------------------------------------------------------------------------------------------------------------------------

錯誤處理

在CAN匯流排中存在5種錯誤型別,它們互相併不排斥,下面簡單介紹一下它們的區別、產生的原因及處理方法。
位錯誤:向匯流排送出一位的某個節點同時也在監視匯流排,當監視到匯流排位的電平和送出的電平不同時,則在該位時刻檢測到一個位錯誤。但是在仲裁區的填充位流期間或應答間隙送出隱性位而檢測到顯性位時,不認為是錯誤位。送出認可錯誤標註的傳送器,在檢測到顯性位時也不認為是錯誤位。
填充錯誤:在使用位填充方法進行編碼的報文中,出現了第6個連續相同的位電平時,將檢 測出一個填充錯誤。
CRC錯誤:CRC序列是由傳送器CRC計算的結果組成的。接收器以和傳送器相同的方法計算CRC。如果計算的結果和接收到的CRC序列不同,則檢測出一個CRC錯誤。
形式錯誤: 當固定形式的位區中出現一個或多個非法位時,則檢測到一個形式錯誤。
應答錯誤:在應答間隙,傳送器未檢測到顯性位時,則由它檢測出一個應答錯誤。
檢測到出錯條件的節點通過傳送錯誤標誌進行標定。當任何節點檢測出位錯誤、填充錯誤、形式錯誤或應答錯誤時,由該節點在下一位開始傳送出錯誤標誌。

當檢測到CRC錯誤時。出錯標誌在應答界定符後面那一位開始傳送.除非其他出錯條件的錯誤標誌已經開始傳送。
在CAN匯流排中,任何一個單元可能處於下列3種故障狀態之一:錯誤啟用狀態(Error Active 主動報錯)、錯誤認可狀態(Error Passitive 被動報錯)和匯流排關閉狀態(Bus off)。
主動報錯單元可以照常參與匯流排通訊,並且當檢測到錯誤時,送出一個活動錯誤標誌。被動報錯節點可參和匯流排通訊,但是不允許送出活動錯誤標誌。當其檢測到錯誤時,只能送出被動報錯標誌,並且傳送後仍為被動報錯狀態,直到下一次傳送初始化。匯流排關閉狀態不允許單元對匯流排有任何影響。
為了界定故障,在每個匯流排單元中都設有2個計數:傳送出錯計數和接收出錯計數。這些 計數按照下列規則進行。
(1)接收器檢查出錯誤時,接收器錯誤計數器加1,除非所有檢測錯誤是傳送主動報錯標誌或超載標誌期間的位錯誤。
(2)接收器在送出錯誤標誌後的第一位檢查出顯性位時,錯誤計數器加8。
(3)傳送器送出一個錯誤標誌時,傳送器錯誤計數器加8。有兩種情況例外:其一是如果傳送器為被動報錯,由於未檢測到顯性位應答或檢測到應答錯誤,並且在送出其被動報錯標誌時,未檢測到顯性位;另外一種情況是如果仲裁器件產生填充錯誤,傳送器送出一個隱性位錯誤標誌,而檢測到的是顯性位。除以上兩種情況外,傳送器錯誤計數器計數不改

變。
(4)傳送器送出一個主動報錯標誌或超載標誌時,檢測到位錯誤,則傳送器錯誤計數器加8。
(5)在送出主動報錯標誌、被動報錯標誌或超載錯誤標誌後,任何節點都最多允許連續7個顯性位。在檢測到第11個連續顯性位後,或緊隨被動報錯標誌檢測到第8個連續的顯性位,以及附加的8個連續的顯性位的每個序列後,每個傳送器的傳送錯誤計數都加8,並且每個接收器的接收錯誤計數也加8。
(6)報文成功傳送後,傳送錯誤計數減1,除非計數值已經為0。
(7)報文成功傳送後,如果接收錯誤計數處於1~197之間,則其值減1;如果接收錯誤計數為0,則仍保持為0;如果大於127,則將其值記為119~127之間的某個數值。
(8)當傳送錯誤計數等於或大於128,或接收錯誤汁數等於或大於128時,節點進人被動報錯狀態,節點送出一個活動錯誤標誌。
(9)當傳送錯誤計數器大於或等於256時,節點進人匯流排關閉狀態。
(1O)當傳送錯誤計數和接收錯誤計數均小於或等於127時,被動報錯節點再次變為主動報錯節點。
(11)在檢測到總線上11個連續的隱性位傳送128次後,匯流排關閉節點將變為2個錯誤計數器均為0的主動報錯節點。
(12)當錯誤計數器數值大於96時,說明匯流排被嚴重干擾。
如果系統啟動期間僅有1個節點掛在總線上,此節點發出報文後,將得不到應答,檢查出錯誤並重復該報文,此時該節點可以變為被動報錯節點,但不會因此關閉匯流排。

 ----------------------------------------------------------------------------------------------------------------------------------------

CAN協議的錯誤檢測機制:

•所有的單元都可以檢測錯誤(錯誤檢測功能)。

•檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能)。 

•正在傳送訊息的單元一旦檢測出錯誤,會強制結束當前的傳送。強制結束髮送的單元會不斷反覆地重新發送

•此訊息直到成功傳送為止(錯誤恢復功能)。 

•單元始終處於 3 種狀態之一:

主動錯誤狀態、被動錯誤狀態、匯流排關閉態

•位填充機制:在一幀的幀起始、仲裁段、控制段、資料段、CRC段中,如果出現5個連續的相同數值的位時,將在這5個連續位後插入一個補碼位。傳送節點自動新增此位,接收節點在接收時自動去除此位。此方法可避免同步錯誤,同時為錯誤幀的啟動提供了機制。