轉:CAN總線學習筆記(4)- CAN協議過載幀和幀間隔

轉自:https://blog.csdn.net/weixin_40528417/article/details/79871311

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

1 過載幀

過載幀是接收節點向總線上其它節點報告自身接收能力達到極限的幀。
上面這句話可以這樣理解:接收節點Node_A接收報文的能力達到極限了,於是Node_A就會發出過載幀來告訴總線上的其它節點(包括髮送節點),我接收節點Node_A已經沒有能力處理你們發來的報文了。

過載幀包括:過載標誌過載界定符兩個部分

  • 過載標誌:連續6個顯性位;
  • 過載界定符:連續8個隱性位。
  • 與錯誤幀類似,過載幀中有過載幀重疊部分,且形成過載重疊標誌的原因與形成錯誤幀中的錯誤重疊標誌的原因是相同的

過載幀
對於過載幀的幀結構我們可以這樣理解:接收節點Node_A達到接收極限時,就會發出過載幀到總線上,顯然,過載標誌的6個連續顯性位會屏蔽掉總線上其它節點的發送,也就是說這個時候Node_A通過發送過載幀的方式來破壞其它節點的發送,這樣在Node_A發送過載幀期間,其它節點就不能成功發送報文,於是就相當於把其它節點的發送推遲了,也就是說Node_A在其發送過載幀的這段時間得以“休息”。

有三種情況會引起過載幀:

  • 接收節點自身原因。接收節點由於某種原因需要延遲接收下一個數據幀或者遙控幀。
  • 在幀間隔的間歇段的第一位和第二位檢測到一個顯性位(正常的間歇段都是隱性位)
    幀間隔的間隔段本應是三個連續的隱性位,如果接收節點Node_A在間隔段檢測到顯性位,那麼就意味着此時有報文發向接收節點Node_A,但這個時候是不應該有報文發來的,於是Node_A發送過載幀。
  • CAN節點在錯誤界定符過載界定符的第八位(最後一位)聽到一個顯性位0,節點會發送一個過載幀,且錯誤計數器不會增加。
    接收節點Node_A在錯誤界定符和過載界定符的最後一位聽到顯性位,也意味着有報文發向Node_A,但這個時候是不應該有報文發來的,於是Node_A發送過載幀。

2 幀間隔

幀間隔是用來隔離數據幀(或者遙控幀)的,也就是說,數據幀(或者遙控幀)通過插入幀間隔可以將本幀與先行幀(數據幀、遙控幀、錯誤幀、過載幀)分隔開來。

Tips: 過載幀和錯誤幀的前面不能插入幀間隔。

幀間隔有兩種不同的形式:
主動錯誤狀態的幀間隔:
主動幀間隔
被動錯誤狀態的幀間隔:
被動幀間隔

間隔段:連續三個隱性位;間隔段期間,所有節點不允許發送數據這或遙控幀,只要在這期間監聽到顯性位,接收節點就會發送過載幀。
空閒段:連續隱性位,個數不一定,0個或者多個都可以。總線空閒的時間是任意長的,只要總線空閒,節點就可以競爭總線。
暫停段:只有處於被動錯誤狀態的節點在發送幀間隔的時候,纔會在幀間隔中插入8個連續隱性位的暫停段。
暫停段,又叫做延遲傳送段,爲什麼節點處於被動狀態時會有這樣一段呢。原因如下:首先,考慮主動錯誤狀態的節點Node_A,發送主動錯誤標誌之後,隨之就要重新發送剛剛發送失敗的報文,但是爲了間隔開與前面剛剛發送的錯誤幀,總線在錯誤幀之後就會插入3個隱形位的幀間隔,在這3個隱形位期間,其它的節點不足以判定總線空閒(需要連續11個隱性位才能判定),所以Node_A仍然佔據着總線的控制權,於是在幀間隔之後,Node_A能夠接着發送報文。現在Node_A轉入到被動錯誤狀態了,說明它已經不是很可靠了,這個時候如果沒有延遲傳送段,在Node_A發出被動錯誤標誌之後,它仍然能夠在3位的幀間隔之後立即重新發送報文,這是不符合我們對被動錯誤狀態的處理要求的當然也是不符合CAN協議的,於是乎對於發送出被動錯誤標誌的節點,總線在幀間隔中加入了8個連續隱性位的延遲傳送段,這樣的3+8=11個連續隱性位。就能讓Node_A在這個幀間隔期間失去對總線的控制權,從而優先保證其它正常(處於主動錯誤狀態)節點能夠使用總線,而不必等着一個已經不可靠的Node_A佔據總線。

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