車載網絡CAN(三):“幀”的結構、用法和錯誤處理方法
摘要
該專題連載共分為“五”篇,這是第三篇。在本系列的第二篇“CAN通信的數據傳輸機制”中,我們介紹了“數據幀”和“遠程幀”,作為CAN(控制器局域網)中數據傳輸方式的主題。
這一次,剩下的兩幀
·過載幀
·誤差幀
本文詳細介紹了這些組件的結構、用法和錯誤處理方法。
點擊閱讀:車載網絡CAN(一):CAN協議基礎知識
點擊閱讀:車載網絡CAN(二):CAN通信的數據傳輸機制
過載幀
當 CAN 控制器尚未完成處理前一幀時,可以使用“過載幀”來延遲下一幀的開始。
CAN協議最初開發時,微控制器芯片和CAN控制器的處理能力有限,有時會導致處理不正常。為了避免這種情況,設計了過載幀。例如,如果在前一個數據幀處理完成之前接收到下一個數據幀,就可能導致數據接收錯誤。過載幀正是為了避免此類問題而使用的。

圖1、過載幀
現代 CAN 控制器很少生成過載幀,但它們確實具備根據 CAN 規范處理過載幀的功能。過載幀由以下部分組成: “過載標志”和“過載分隔符”。
過載標志
過載標志由 6 位組成。傳輸在間斷期 (ITM) 的前 2 位內開始。接收到過載標志的節點會立即發送一個過載標志。這會導致第一個過載標志與其發送的過載標志重疊,最終使過載標志的長度為 7 位。
順便提一下,如果所有節點同時發送過載標志,則過載標志的位長度為 6 位。
重載分隔符
過載分隔符是一個 8 位隱性位,用于指示過載幀的結束。通過發送過載幀,可以延遲總線空閑期的開始,從而允許無法跟上處理速度的節點完成其處理。
過載標志不會影響錯誤計數器的值。
誤差幀
接下來,我們將介紹“誤差幀”。
錯誤幀是指在發生如下所述的各種錯誤時發送的幀,它由“錯誤標志”和“錯誤分隔符”組成。這些錯誤會通過違反比特填充規則或破壞固定格式部分來中斷最近的傳輸。

圖2、誤差幀
錯誤標志和錯誤分隔符概述如下:
錯誤標志
錯誤標志用于通知其他節點發生了錯誤。錯誤標志通常由 6 個顯性位組成,會導致違反位填充規則。違反位填充規則會導致其他節點也發送錯誤標志。因此,總線上會出現總共 6 到 12 個顯性位(主位和次位)作為錯誤標志。
主長度從 6 位變為 12 位的原因是,主備部分可能會重疊,具體取決于另一個節點何時檢測到錯誤,導致備部分被視為 0 到 6 位。這將在后面關于檢測到錯誤時的操作部分進行詳細解釋。
所有CAN控制器都會根據錯誤發生情況增加或減少其內部錯誤計數器的值。這使得我們可以了解節點的當前狀態,并提供了一種機制來防止因節點處于嚴重狀態(例如硬件故障)而持續發送錯誤標志導致的通信故障。
錯誤分隔符
錯誤定界符是一個 8 位隱性序列,用于終止錯誤幀。它由 8 個連續的隱性位組成,與數據幀或遠程幀末尾的 1 位 ACK 定界符和 7 位 EOF 相同。
錯誤檢測
接下來,我們來看看如何檢測網絡上發生的錯誤。

圖3、錯誤檢測
首先,下面將介紹發送節點的監控。
1. 位監控
檢查發送數據與總線上采樣數據之間的差異。如果存在差異,則將其視為比特錯誤。但是,仲裁字段和確認時隙中不進行任何判斷。
2. 確認檢查
如果在確認時隙內,對應點的總線狀態仍為隱性,則視為確認錯誤。這種情況發生在所有接收節點均未返回顯性狀態時(即所有接收節點均收到錯誤消息),或者網絡中沒有其他節點連接時。
接下來,接收節點的監控情況如下所示。
3. CRC校驗
如果接收節點計算出的 CRC 值與幀中包含的 CRC 值不匹配,則視為 CRC 錯誤。
4. 表格檢查
CRC分隔符、確認分隔符或EOF通常是隱性的。如果在該固定的隱性位置檢測到顯性序列,則視為形式錯誤。
5.填充檢查
它會監控比特填充規則是否得到遵守。如果在比特填充區域內,同一級別的錯誤連續出現 6 位或更多,則視為填充錯誤。
這五種錯誤檢測機制能夠檢測網絡中發生的錯誤。當檢測到任何一種錯誤時,都會立即發送一個錯誤標志(6 位顯性)。但是,如果是 CRC 錯誤,則要等到文件結束符 (EOF) 的第一個比特出現時才會發送錯誤標志。
錯誤原因
通常情況下,外部噪聲引起的問題可能會影響車載網絡,但由于 CAN使用“兩線差分電壓法”進行數據傳輸,因此它不太容易受到外部噪聲的影響。
現在,讓我們考慮一下出現這個問題的其他原因。
全網錯誤
可能會出現影響整個網絡的問題,例如線路故障。
網絡某些節點出現錯誤
如果網絡中的節點在不同的時間同步,它們的顯性/隱性信號識別可能會有所不同,從而導致錯誤。
當網絡中節點的顯性電壓和隱性電壓不同時,電子控制單元 (ECU) 內組件的變化以及溫度特性的差異會導致信號表現不同。
總線特性誤差
總線的特性會導致傳播的電信號發生變化。
檢測到錯誤時的操作<1>
圖 4 顯示了發送節點在傳輸過程中檢測到錯誤時發生的情況。

圖4、檢測到錯誤時的操作<1>
當發送節點檢測到數據字段中的比特錯誤時,它會立即發送一個 6 位主導錯誤標志(主標志)。然后,其他 ECU 檢測到這個 6 位主導錯誤標志,認為違反了比特填充規則,并發送一個 6 位主導錯誤標志(次標志)。
這違反了比特填充規則,但如果錯誤標志(主標志)發送之前的狀態占主導地位,則錯誤標志(次標志)的發送時間會提前,導致錯誤標志(主標志)和錯誤標志(次標志)重疊。這將改變上述次標志部分的長度。
之后,會發送一個錯誤分隔符,發送節點會在 ITM 完成后重傳。在這種情況下,錯誤幀包含 ITM 信息,共 20 位,重傳發生在 23 位之后。順便一提,除 CRC 錯誤之外的其他錯誤的檢測操作也類似。
檢測到錯誤時的操作<2>
圖 5 顯示了接收節點在接收過程中發現 CRC 錯誤時將采取的處理過程。

圖5、檢測到錯誤時的操作 <2>
如果接收節點檢測到 CRC 字段中的 CRC 錯誤,則不會發送錯誤標志,也不會在 ACK 時隙中發送顯性信號(否定 ACK:隱性信號)。
但是,如果其他接收節點比較 CRC 并正常接收到數據,它們會發送一個 ACK(主導),發送節點繼續發送,如圖 5 所示。此過程旨在避免因某個節點出現 CRC 錯誤而導致無法確定 ACK 時隙狀態的情況,從而使發送節點能夠知道是否所有節點都未能接收到數據。
接收節點如果在檢測到 CRC 錯誤后無法立即發送錯誤標志,則會在文件末尾 (EOF) 的開頭發送一個錯誤標志(主錯誤標志)(比正常情況晚 3 位)。由于此 EOF 中的錯誤標志的第一位是顯性錯誤,其他節點(包括發送節點)會檢測到格式錯誤并發送一個錯誤標志(次錯誤標志)。在這種情況下,錯誤幀的長度將為 15 位(包括 ITM),重傳將在 18 位之后進行。
接收錯誤計數器
每個節點的 CAN 控制器都有自己的接收錯誤計數器(圖 6)。

圖6、接收錯誤計數器
此錯誤計數器的工作原理如下:
·如果接收節點發送錯誤標志(主標志),則將“8”加到接收錯誤計數器中。
·如果接收節點發送錯誤標志(輔助),則將“1”加到接收錯誤計數器。
·如果接收節點完成接收而沒有任何錯誤,則從接收錯誤計數器中減去“1”。
此外,每個 CAN 控制器的狀態由其各自的接收錯誤計數器的值定義。
接收錯誤計數器值
·0 到 127:編號為“127”的節點處于“活動”狀態。
·96:錯誤計數器值為“96”表示警告限值,表明總線發生嚴重故障。
·127:如果超過此值,節點將轉換為“被動”狀態。
傳輸錯誤計數器
每個節點的 CAN 控制器都有自己的傳輸錯誤計數器(圖 7)。

圖7、傳輸錯誤計數器
此錯誤計數器的工作原理如下:
·如果發送節點發送錯誤標志(在比特錯誤或確認錯誤的情況下),則將“8”加到傳輸錯誤計數器中。
·如果幀已從發送節點成功發送,則從傳輸錯誤計數器中減去“1”。
·對于例外情況
→即使 CAN 控制器狀態為“被動”的發送節點檢測到確認錯誤,傳輸錯誤計數器也不會增加。
此外,每個 CAN 控制器的狀態由其各自的傳輸錯誤計數器的值定義。
傳輸錯誤計數器值
·0 到 96:低于警告限值時處于“活動”狀態。當錯誤計數器值超過“96”時,CAN 控制器發出警告(設置錯誤標志,生成中斷)。
·97-127:節點處于“活動”狀態。如果錯誤計數器值在此范圍內,則總線存在嚴重問題。
·128-255:節點處于“被動”狀態(大多數 CAN 控制器不會向微控制器報告此字段的變化),并且正在等待發送。
·255:當錯誤計數器達到此值時,節點將“總線關閉”,并與總線斷開連接(總線傳輸訪問權限被禁用)。微控制器可以檢測到此狀態的轉換。
等待傳輸并在“被動”狀態節點中發送錯誤標志
當錯誤計數器變為“被動”狀態時,表示節點中出現了某種問題。如果處于此狀態的節點反復發送錯誤標志并占用總線,則其他節點將無法正常通信。
為了防止這種情況發生,處于“被動”狀態的節點會等待傳輸(圖 8)。

圖8、被動節點等待傳輸
這是通過以下機制實現的:
通常情況下,ITM結束后總線被視為空閑,節點可以開始發送數據。但是,處于“被動”狀態的節點只有在ITM結束后接收到8個隱性比特后才會變為總線空閑。這使得其他正常節點可以訪問總線,而不會受到處于“被動”狀態節點發送數據的干擾。
在“被動”狀態節點中發送錯誤標志
為防止處于“被動”狀態的節點以及等待發送數據的節點發出錯誤標志而導致通信中斷,提供了以下機制:
來自“被動”節點的錯誤標志發送的是6個隱性位,而不是6個顯性位。這意味著即使“被動”節點在接收過程中檢測到錯誤,它也會發送6個隱性位作為錯誤標志,這不會影響當前的通信。

圖9、被動狀態節點中的錯誤標志傳輸(接收時)
但是,如果一個“被動”節點在傳輸過程中檢測到錯誤,由于沒有其他節點同時傳輸,其他節點可以將傳輸的 6 個隱性比特解釋為 6 個連續的隱性比特,并識別出它們收到了異常數據。

圖10、被動狀態節點中的錯誤標志傳輸(發送時)
最后,我們將總結 CAN 控制器在發生錯誤時的行為。
1.節點檢測到錯誤。
2.發送一個錯誤標志(主要)。但是,如果出現 CRC 錯誤,該錯誤標志實際上會延遲 3 位,并從文件末尾 (EOF) 的開頭發送。此外,如果節點處于“活動”狀態,則該錯誤標志為 6 位顯性;如果節點處于“被動”狀態,則該錯誤標志為 6 位隱性。
3.正常發送或接收的其他節點會將此錯誤標志(主標志)識別為數據錯誤或表單錯誤,并發送錯誤標志(次標志)。
4.當發送錯誤幀時,數據幀(或遠程幀)無法正常發送,直到到達文件末尾 (EOF) 才會中斷。此外,由于所有節點都出現錯誤,接收到的信息將被丟棄。
5.錯誤計數器值按規定遞增。
6.發送節點重新發送。
在前面文章中,我們概述了CAN協議,但這些細節通常由 CAN 協議控制器控制。在某些情況下,即使不了解本文解釋的細節,您也可以處理 CAN。但是,如果您對 CAN 通信的工作原理有深入的了解,不僅在開發過程中會很有幫助,而且在出現問題時也能助您一臂之力。
下一篇文章,我們將解釋CAN控制器的分類和工作原理。更多內容,關注牛喀網,學習更多汽車科技。有興趣的朋友,可以添加牛小喀微信:NewCarRen,加入專家社群參與討論。

(添加微信號NewCarRen咨詢)
