CAN通訊的錯誤幀到底是如何被界定的?本文帶你輕松了解!
?錯誤標定
檢測到錯誤條件的站通過發送錯誤標志指示錯誤。對于“錯誤主動”的節點,錯誤信息為“主動錯誤標志”,對于“錯誤被動”的節點,錯誤信息為“被動錯誤標志”。站檢測到無論是位錯誤、填充錯誤、形式錯誤,還是應答錯誤,這個站會在下一位時發出錯誤標志信息。
只要檢測到的錯誤的條件是CRC錯誤,錯誤標志的發送開始于ACK界定符之后的位(其他的錯誤條件除外)。如圖1所示:
圖1 CRC錯誤幀
?故障界定
至于故障界定,單元的狀態可能為以下三種之一:“錯誤主動”、“錯誤被動”、“總線關閉”。
1. “錯誤主動”的單元可以正常地參與總線通訊并在錯誤被檢測到時發出主動錯誤標志。
2. “錯誤被動”的單元不允許發送主動錯誤標志。“錯誤被動”的單元參與總線通訊,在錯誤被檢測到時只發出被動錯誤標志。而且,發送以后,“錯誤被動”單元將在初始化下一個發送之前處于等待狀態(見“掛起發送”)。
3. “總線關閉”的單元不允許在總線上有任何的影響(比如,關閉輸出驅動器)。
三個狀態的轉換方式如圖2所示:
圖2 CAN狀態轉換圖
在每一總線單元里使用兩種計數以便故障界定:發送錯誤計數、接收錯誤計數。
這些計數按以下規則改變(注意,在給定的報文發送期間,可能要用到的規則不只一個):1. 當接收器檢測到一個錯誤,接收錯誤計數就加1。在發送主動錯誤標志或過載標志期間所檢測到的錯誤為位錯誤時,接收錯誤計數器值不加1。2. 當錯誤標志發送以后,接收器檢測到的第一個位為“顯性”時,接收錯誤計數值加8。3. 當發送器發送一錯誤標志時,發送錯誤計數器值加8。
- 例外情況1:發送器為“錯誤被動”,并檢測到一應答錯誤(注:此應答錯誤由檢測不到一“顯性”ACK 以及當發送被動錯誤標志時檢測不到一“顯性”位而引起)。
- 例外情況2:發送器因為填充錯誤而發送錯誤標志(注:此填充錯誤發生于仲裁期間。引起填充錯誤是由于:填充位〈填充位〉位于RTR位之前,并已作為“隱性”發送,但是卻被監視為“顯性”)。
例外情況1和例外情況2時,發送錯誤計數器值不改變。
4. 發送主動錯誤標志或過載標志時,如果發送器檢測到位錯誤,則發送錯誤計數器值加8。
5.當發送主動錯誤標志或過載標志時,如果接受器檢測到位錯誤(位錯誤),則接收錯誤計數器值加8。6. 在發送主動錯誤標志、被動錯誤標志或過載標志以后,任何節點最多容許7個連續的 “顯性”位。以下的情況,每一發送器將它們的發送錯誤計數值加8,及每一接收器的接收錯誤計數值加8:
- 當檢測到第14個連續的“顯性”位后;
- 在檢測到第8個跟隨著被動錯誤標志的連續的“顯性”位以后;
- 在每一附加的8個連續“顯性”位順序之后。
7. 報文成功傳送后(得到ACK及直到幀末尾結束沒有錯誤),發送錯誤計數器值減1,除非已經是0。
8. 如果接收錯誤計數值介于1和127之間,在成功地接收到報文后(直到應答間隙接收沒有錯誤,并成功地發送了ACK位),接收錯誤計數器值減1。如果接收錯誤計數器值是0,則它保持0,如果大于127,則它會設置一個介于119到127之間值。9. 當發送錯誤計數器值等于或超過128時,或當接收錯誤計數器值等于或超過128時,節點為“錯誤被動”。讓節點成為“錯誤被動”的錯誤條件致使節點發出主動錯誤標志。10. 當發送錯誤計數器值大于或等于256時,節點為“總線關閉”。11. 當發送錯誤計數器值和接收錯誤計數器值都小于或等于127時,“錯誤被動”的節點重新變為“錯誤主動”。12. 在總線監視到128次出現11個連續“隱性”位之后,“總線關閉”的節點可以變成“錯誤主動”(不再是“總線關閉”),它的錯誤計數值也被設置為0。
備注1:
一個大約大于96的錯誤計數值顯示總線被嚴重干擾。最好能夠預先采取措施測試這個條件。
備注2:
起動/睡眠:如果起動期間內只有1個節點在線,以及如果這個節點發送一些報文,則將不會有應答,并檢測到錯誤和重復報文。由此,節點會變為“錯誤被動”,而不是“總線關閉”。
-
控制器
+關注
關注
112文章
16464瀏覽量
179613 -
CAN
+關注
關注
57文章
2773瀏覽量
464462 -
檢測
+關注
關注
5文章
4515瀏覽量
91786
發布評論請先 登錄
相關推薦
CAN控制器總線錯誤分析之CAN節點BusOff恢復過程分析與測試
![<b class='flag-5'>CAN</b><b class='flag-5'>控制器</b>總線<b class='flag-5'>錯誤</b>分析之<b class='flag-5'>CAN</b>節點BusOff恢復過程分析與測試](https://file.elecfans.com/web1/M00/C3/52/o4YBAF8o3aeAaMrwAACj8njOo5o307.png)
一文讀懂Can總線錯誤處理
一文讀懂CAN總線錯誤處理
![<b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b><b class='flag-5'>CAN</b>總線<b class='flag-5'>錯誤處理</b>](https://file1.elecfans.com/web2/M00/8A/78/wKgaomSSv86Abwq8AAAqt5zkm1U750.png)
Rust語言中錯誤處理的機制
一文讀懂CAN通訊錯誤幀
![<b class='flag-5'>一</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)
評論