瑞薩公司的《CAN入門書》學習筆記之三

看完瑞薩公司的《CAN入門書》,剛好在CSDN上有這總結,順便轉來看看,以及記記自己與作者的一些不同看法,轉載來自:
https://blog.csdn.net/weixin_40528417/article/details/79771270

依照瑞薩公司的《CAN入門書》的組織思路來學習CAN通信的相關知識,並結合網上相關資料以及學習過程中的領悟整理成筆記。好記性不如爛筆頭,加油!

1 錯誤幀的幀結構

在發送和接收報文時,總線上的節點如果檢測出了錯誤,那麼該節點就會發送錯誤幀,通知總線上的節點,自己出錯了。
錯誤幀由錯誤標誌錯誤界定符兩個部分組成。
錯誤幀

  • 主動錯誤標誌:6個連續的顯性位;
  • 被動錯誤標誌:6個連續的隱性位;
  • 錯誤界定符:8個連續的隱性位。

可以看到在錯誤標誌之後還有0~6位的錯誤標誌重疊,這一段最低有0個位,最多有6個位,關於這一段是怎麼形成的,將在下文中解釋。

2 錯誤檢測

2.1 位填充原則

在瞭解CAN總線中的錯誤檢測之前,首先需要了解什麼是位填充。
CAN協議中規定,當相同極性的電平持續五位時,則添加一個極性相反的位
位填充

  • 對於發送節點而言:
    在發送數據幀遙控幀時,對於SOF~CRC(除去CRC界定符) 之間的位流,相同極性的電平如果持續5位,那麼在下一個位插入一個與之前5位反型的電平;
  • 對於接收節點而言:
    在接收數據幀遙控幀時,對於**SOF~CRC(除去CRC界定符)**之間的位流,相同極性的電平如果持續5位,那麼需要刪除下一位再接收。

位填充作用域

Tips: 注意:填充位的添加和刪除是由發送節點和接收節點完成的,CAN-BUS只負責傳輸,不會操縱信號。

2.2 錯誤的種類

在CAN總線通信中,一共有五種錯誤:

  • 位錯誤
  • ACK錯誤
  • 填充錯誤
  • CRC錯誤
  • 格式錯誤

2.2.1 位錯誤(Bit Check Error)

節點將自己發送到總線上的電平與同時從總線上回讀到的電平進行比較,如果發現二者不一致,那麼這個節點就會檢測出一個位錯誤。

實際上所謂“發出的電平與從總線上回讀的電平不一致”,指的就是節點向總線發出隱性位,卻從總線上回讀到顯性位或者節點向總線發出顯性位,卻從總線上回讀到隱性位這兩種情況。

Tips: 有三種例外情況不屬於位錯誤:

  • 仲裁區,節點向總線發送隱性位卻回讀到顯性位,不認爲是位錯誤,這種情況表示該節點仲裁失敗;
  • ACK槽,節點向總線發送隱性位卻回讀到顯性位,不認爲是位錯誤,這種情況表示,該節點當前發送的這一幀報文至少被一個其它節點正確接收;
  • 該節點發送被動錯誤標誌,節點Node_A向總線發送連續六個隱性位(被動錯誤標誌)卻回讀到顯性位,不認爲是位錯誤。因爲被動錯誤標誌是六個連續的隱性位,所以在總線上按照線與機制,有可能這六個連續隱性位被其它節點發送的顯性電平“喫掉”;

2.2.2 ACK錯誤(Acknowledgment Error)

按照CAN協議的規定,在一幀報文(數據幀或者遙控幀)發出之後,如果接收節點Node_B成功接收了該幀報文,那麼接收節點Node_B就要在該幀報文ACK槽對應的時間段內向總線上發送一個顯性位來應答發送節點Node_A。這樣發送節點Node_A就會在ACK槽時間段內從總線上回讀到一個顯性位。因此:
當發送節點Node_A在ACK槽時間段內沒有回讀到顯性位,那麼發送節點Node_A就會檢測到一個ACK應答錯誤。這表示沒有一個節點成功接收該幀報文。
ACK段工作方式

2.2.3 填充錯誤(Fill Error)

在需要執行位填充原則的幀段(數據幀遙控幀的SOF~CRC序列),檢測到連續六個同性位,則檢測到一個填充錯誤。

2.2.4 CRC錯誤

發送節點Node_A在發送數據幀或者遙控幀時,會計算出該幀報文的CRC序列。接收節點Node_B在接收報文時也會執行相同的CRC算法,如果接收節點Node_B計算出的CRC序列值與發送節點Node_A發來的CRC序列值不一致,那麼接收節點就檢測到一個CRC錯誤。
CRC作用域

2.2.5 格式錯誤

在一幀報文發送時,如果在必鬚髮送預定值的區域內檢測到了非法值,那麼就檢測到一個格式錯誤。
CAN報文中,有預定值的區域包括:

  • 數據幀和遙控幀的CRC界定符、ACK界定符、EOF
  • 錯誤幀界定符
  • 過載幀界定符

3 錯誤通知

上一節中,講到CAN通信中有五種錯誤,並且介紹了在什麼情況下能夠檢測到這幾種錯誤,在檢測到錯誤之後,檢測到錯誤的節點就要發送錯誤幀到總線上來通知總線上的其他節點。
錯誤幀有的帶有主動錯誤標誌,有的帶有被動錯誤標誌,而且錯誤標誌重疊部分的字節數也不一樣,那麼問題就來了:

  • 什麼情況下發送帶有主動錯誤標誌的錯誤幀;
  • 什麼情況下發送帶有被動錯誤標誌的錯誤幀;
  • 在哪個時間點發送錯誤幀;
  • 錯誤標誌重疊部分是怎樣形成的;

3.1 節點錯誤狀態

按照CAN協議的規定,CAN總線上的節點始終處於以下三種狀態之一。

  • 主動錯誤狀態
  • 被動錯誤狀態
  • 總關閉狀態

當滿足一定的條件時,節點可以從一種狀態轉換爲另外一種狀態。

Tips: 需要注意的是:

  • 處於主動錯誤狀態,表示該節點具備發出主動錯誤標誌的能力;
  • 處於被動錯誤狀態,表示節點具備發出被動錯誤標誌的能力。

1)主動錯誤狀態

  • 節點處於主動錯誤狀態可以正常通信
  • 處於主動錯誤狀態的節點(可能是接收節點也可能是發送節點)在檢測出錯誤時,發出主動錯誤標誌

2)被動錯誤狀態

  • 節點處於被動錯誤狀態可以正常通信
  • 處於被動錯誤狀態的節點(可能是接收節點也可能是發送節點)在檢測出錯誤時,發出被動錯誤標誌

Tips: 注意:這裏說處於主動錯誤狀態或被動錯誤狀態的節點仍然可以正常通信,這裏的正常通信指的是:節點仍然能夠從總線上接收報文,也能夠競爭總線獲勝後向總線上發送報文。但是不代表接收的報文一定正確也不代表一定能正確的發送報文。

3)總線關閉狀態

  • 節點處於總線關閉狀態,那麼該節點不能收發報文;
  • 處於總線關閉狀態的節點,只能一直等待,在滿足一定條件的時候,再次進入到主動錯誤狀態

3.2 錯誤狀態的轉換

現在我們知道:

  • 處於主動錯誤狀態的節點在檢測到錯誤時會發送帶有主動錯誤標誌的錯誤幀;
  • 處於被動錯誤狀態的節點在檢測到錯誤時會發送帶有被動錯誤標誌的錯誤幀。

那麼一個CAN節點在什麼情況下處於主動錯誤狀態,什麼情況下處於被動錯誤狀態呢?

根據CAN協議的規定,在CAN節點內,有兩個計數器:發送錯誤計數器(TEC)接收錯誤計數器(REC)

Tips: 需要注意的是:這兩個計數器計得不是收發報文的數量,也不是收發錯誤幀的數量。TEC和RCE計數值的變化,是根據下表的規定來進行的
錯誤狀態變動條件

CAN節點錯誤狀態的轉換,就是基於這兩個計數器來進行的。
錯誤狀態的轉換

可以看出,節點錯誤狀態的轉換就是一個**“量變”“質變”的過程:
####1) 主動錯誤狀態
最開始
TCE和REC都小於127時**,就處於主動錯誤狀態

在這一狀態下,節點檢測到一個錯誤就會發送帶有主動錯誤標誌錯誤幀,因爲主動錯誤標誌是連續六個顯性位,所以這個時候主動錯誤標誌將會“覆蓋”掉總線上其它節點的發送,而之前在CAN總線上傳輸的報文就被這“六個連續顯性位”破壞掉了。

如果發出主動錯誤幀的節點是發送節點,這個情況下就相當於:剛剛發送的那一幀報文我發錯了,現在我破壞掉它(發送主動錯誤幀),你們不管收到什麼都不算數;
如果發出主動錯誤幀的節點是接收節點,這個情況就相當於:剛剛我收報文的時候發現了錯誤,不管你們有沒有發現這個錯誤,我現在主動站出來告訴大家這個錯誤,並把這一幀報文破壞掉(發送主動錯誤幀),剛纔你們收到的東西不管對錯都不算數了。

Tips: 處於主動錯誤狀態,說明這個節點目前是比較可靠的,出現錯誤的原因可能不是它本身的問題,即剛剛檢測到的錯誤可能不僅僅只有它自己遇到,正是因爲這一點,整個總線才相信它報告的錯誤,允許它破壞掉髮送中的報文,也就是將這一次的發送作廢。

2)被動錯誤狀態

如果某個節點發送錯誤幀的次數較多,必將使得TCE>127 或者 REC>127,那麼該節點就處於被動錯誤狀態

在這一狀態下,節點Node_A檢測到一個錯誤就會發送帶有被動錯誤標誌的錯誤幀,因爲被動錯誤標誌是連續六個隱性位,所以這個時候總線上正在傳輸的報文位流不會受到該被動錯誤幀的影響,其它的節點該發送的發送,該接收的接收,沒人搭理這個發送被動錯誤幀的節點Node_A。

如果發出被動錯誤幀的節點Node_A爲報文的發送節點,那麼在發送被動錯誤幀之後,剛剛正在發送的報文被破壞,並且Node_A不能在錯誤幀之後隨着連續發送剛剛發送失敗的那個報文。隨之而來的是幀間隔,並且連帶着8位隱性位的 “延遲傳送” 段;這樣總線電平就呈現出連續11位隱性位,總線上的其它節點就能判定總線處於空閒狀態,就能參與總線競爭。此時如果Node_A能夠競爭成功,那麼它就能接着發送,如果競爭不能成功,那麼就接着等待下一次競爭。這種機制的目的正是爲了讓其它正常節點(處於主動錯誤)優先使用總線。

Tips: 處於被動錯誤狀態,說明這個節點目前是不太可靠的,出現錯誤的原因可能是它本身的問題,即剛剛檢測到的錯誤可能僅僅只有它自己遇到,正是因爲這一點,整個總線纔不信任它報告的錯誤,從而只允許它發送六個連續的隱性位,這樣它纔不會拖累別人。

3)總線關閉狀態

如果一個處於被動錯誤狀態的節點,仍然多次發送被動錯誤幀,那麼勢必導致TEC > 255,這樣就處於總線關閉狀態

在總線關閉狀態下的節點Node_A不能向總線上發送報文,也不能從總線上接收報文,整個節點脫離總線。等到檢測到128次11個連續的隱性位時,TEC和REC置0,重新回到主動錯誤狀態。

按照我的理解這個所謂“檢測到128次11個連續隱性位”其實就是讓這個節點隔離一段時間冷靜下,因爲它一旦處於總線關閉狀態,就不會和總線有任何的聯繫,這個時候只要它計算時間等於達到傳送128次11個連續隱性位所用的時間,就可以重新連到總線上。

Tips: 處於總線關閉狀態說明,這個節點目前掛掉了,總線先把它踢開,這樣它纔不會拖累別人,等到它冷靜一段時間之後再回到總線上。

3.3 錯誤幀的發送

在檢測到錯誤之後,什麼時候發送錯誤幀呢?
按照CAN協議的規定:

  • 位錯誤、填充錯誤、格式錯誤、ACK錯誤。
    在錯誤產生的那一位的下一位開始發送錯誤幀
  • CRC錯誤
    緊隨ACK界定符後的位發送錯誤幀
    例子1:
    錯誤幀發送

(1)發送節點Node_A發送一個顯性位,但是卻從總線上聽到一個隱形位,於是Node_A節點就會檢測到一個位錯誤;
(2)Node_A檢測到位錯誤之後,立即在下一位開始發送主動錯誤幀:6個連續顯性位的主動錯誤標誌+8個連續隱性位的錯誤界定符;
(3)對應Node_A發出的主動錯誤標誌,總線上電平爲6個連續顯性位;
(4)接收節點Node_B和Node_C從總線上聽到連續6個顯性位,那麼就會檢測到一個填充錯誤,於是這兩個節點都會發送主動錯誤幀;
(5)對應Node_B和Node_C發出的主動錯誤標誌,總線電平又有6個連續顯性電平,對應Node_B和Node_C發出的錯誤界定符,總線電平有8個連續的隱性電平。
(6)在間歇場之後,Node_A節點重新發送剛剛出錯的報文。
例子2:
錯誤幀發送
從上圖中可以看出錯誤幀之中,錯誤標誌重疊部分是怎樣形成的,這個例子中,位錯誤的錯誤標誌與填充錯誤的錯誤標誌重疊兩位,剩下的部分還有四位:
錯誤標誌重疊部分

        </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章