在當(dāng)今的汽車電子和工業(yè)控制等領(lǐng)域,CAN(Controller Area Network)總線的應(yīng)用極為廣泛。由于總線常常部署在電磁環(huán)境復(fù)雜、節(jié)點(diǎn)眾多的場景中,如汽車內(nèi)部和工業(yè)自動化生產(chǎn)線等,錯誤的發(fā)生難以避免。因此,確保 CAN 總線通信的可靠性和魯棒性就顯得至關(guān)重要。CAN 協(xié)議定義了一套完善的錯誤檢測、通知和故障界定機(jī)制,使系統(tǒng)能夠在錯誤發(fā)生時進(jìn)行有效處理,并在必要時隔離故障節(jié)點(diǎn),保障總線的整體可用性。接下來,我們將詳細(xì)解析 CAN 總線的錯誤處理機(jī)制。
CAN 協(xié)議本身內(nèi)置了多種錯誤檢測機(jī)制,這些機(jī)制是保障總線通信可靠性的基礎(chǔ)。具體包括:
- 位錯誤(Bit Error):當(dāng)節(jié)點(diǎn)發(fā)送的位電平與總線實際電平不符時,就會檢測到這種錯誤。這可能是由于電磁干擾、線路故障等原因?qū)е碌摹?/li>
- 填充錯誤(Stuff Error):在幀的起始幀、仲裁場、控制場、數(shù)據(jù)場和 CRC 序列中,CAN 協(xié)議采用位填充規(guī)則,即不允許出現(xiàn)連續(xù) 6 個相同極性的位。如果出現(xiàn)這種情況,就違反了位填充規(guī)則,檢測為填充錯誤。
- CRC 錯誤(CRC Error):接收節(jié)點(diǎn)會對接收到的數(shù)據(jù)計算 CRC 校驗碼,并與接收到的 CRC 序列進(jìn)行比較。如果兩者不符,則判定為 CRC 錯誤,這通常意味著數(shù)據(jù)在傳輸過程中發(fā)生了改變。
- 格式錯誤(Form Error):固定格式位場,如幀結(jié)束 EOF、ACK 界定符等,都有特定的格式要求。如果這些位場中出現(xiàn)非法位值,就會檢測到格式錯誤。
- 應(yīng)答錯誤(Acknowledgment Error):發(fā)送節(jié)點(diǎn)在 ACK 時隙未檢測到顯性位,表示沒有節(jié)點(diǎn)正確接收數(shù)據(jù),此時判定為應(yīng)答錯誤。
當(dāng)節(jié)點(diǎn)檢測到上述任何一種錯誤時,會立即發(fā)送一個錯誤標(biāo)志(Error Flag)來通知總線上的所有其他節(jié)點(diǎn)。需要注意的是,除了應(yīng)答錯誤外,其他錯誤均可以在接收 CAN 單元中發(fā)生;除了 CRC 和格式錯誤外,其他錯誤均會在發(fā)送單元中發(fā)生。通過分析這些錯誤類型,可以縮小出問題的 CAN 節(jié)點(diǎn)范圍。
為了量化節(jié)點(diǎn)的錯誤狀況并界定其狀態(tài),CAN 協(xié)議為每個總線單元配備了兩個關(guān)鍵計數(shù)器:
- 發(fā)送錯誤計數(shù)器(Transmit Error Counter, TEC):用于記錄該節(jié)點(diǎn)在發(fā)送過程中檢測到的錯誤。
- 接收錯誤計數(shù)器(Receive Error Counter, REC):用于記錄該節(jié)點(diǎn)在接收過程中檢測到的錯誤。
計數(shù)規(guī)則如下:
- 接收器檢測到錯誤(位錯誤、填充錯誤、CRC 錯誤、格式錯誤)時,REC = REC + 1。
- 接收器在發(fā)送主動錯誤標(biāo)志后,檢測到的個位為 “顯性”(Dominant)時,REC = REC + 8。這一規(guī)則較為特殊,涉及錯誤標(biāo)志發(fā)送后的位確認(rèn)。
- 發(fā)送器發(fā)送一個錯誤標(biāo)志(無論主動或被動)時,TEC = TEC + 8。
根據(jù) TEC 和 REC 的數(shù)值,總線單元的狀態(tài)被嚴(yán)格劃分為三種,每種狀態(tài)對應(yīng)不同的總線行為權(quán)限,這有助于在 CAN 總線出現(xiàn)異常時進(jìn)行具體排查。
- 主動錯誤狀態(tài)(Error Active):當(dāng) TEC 和 REC 均小于等于 127(0 <= TEC <= 127 且 0 <= REC <= 127)時,節(jié)點(diǎn)處于主動錯誤狀態(tài)。在這種狀態(tài)下,節(jié)點(diǎn)可以正常參與總線通信。當(dāng)它檢測到錯誤時,會發(fā)送一個主動錯誤標(biāo)志(Active Error Flag),即連續(xù) 6 個顯性位。這是一個強(qiáng)力的錯誤通知信號,會強(qiáng)制中斷當(dāng)前幀的傳輸。
- 被動錯誤狀態(tài)(Error Passive):當(dāng) TEC 大于 127 或 REC 大于 127(128 <= TEC <= 255 或 128 <= REC <= 255)時,節(jié)點(diǎn)進(jìn)入被動錯誤狀態(tài)。此時,節(jié)點(diǎn)不允許發(fā)送主動錯誤標(biāo)志,只能發(fā)送一個被動錯誤標(biāo)志(Passive Error Flag),即連續(xù) 6 個隱性位。這個標(biāo)志的強(qiáng)度較弱,不會干擾總線上的顯性位,因此可能無法成功中斷其他節(jié)點(diǎn)的傳輸。此外,處于被動錯誤狀態(tài)的節(jié)點(diǎn)在完成發(fā)送(幀或錯誤標(biāo)志)后,不能立即開始下發(fā)送。它必須在總線空閑期間,在正常的間歇(Intermission)之后,額外插入一段由 8 位隱性位組成的 “掛起傳送(Suspend Transmission)” 時間,然后才能嘗試競爭總線進(jìn)行下發(fā)送。這一限制降低了頻繁出錯的節(jié)點(diǎn)對總線的干擾。
- 總線關(guān)閉狀態(tài)(Bus Off):當(dāng) TEC 大于 255(TEC >= 256)時,節(jié)點(diǎn)進(jìn)入總線關(guān)閉狀態(tài)。在這種狀態(tài)下,節(jié)點(diǎn)被強(qiáng)制斷開與總線的電氣連接,不允許進(jìn)行任何發(fā)送或接收操作,對總線完全無影響。這是一種保護(hù)機(jī)制,防止因節(jié)點(diǎn)硬件或軟件嚴(yán)重故障而持續(xù)破壞總線通信。節(jié)點(diǎn)需要特定的內(nèi)部條件,通常是檢測到總線連續(xù)空閑達(dá)到一定時間或次數(shù),才能嘗試從總線關(guān)閉狀態(tài)恢復(fù)到初始狀態(tài)(通常是錯誤主動狀態(tài)),并重新開始通信。
狀態(tài)轉(zhuǎn)換關(guān)系總結(jié)如下:
- 節(jié)點(diǎn)初始狀態(tài)通常為主動錯誤狀態(tài)。
- 當(dāng) TEC 或 REC 超過 127 時,節(jié)點(diǎn)從主動錯誤狀態(tài)進(jìn)入被動錯誤狀態(tài)。
- 當(dāng) TEC 達(dá)到或超過 256 時,節(jié)點(diǎn)(無論之前是主動還是被動錯誤狀態(tài))進(jìn)入總線關(guān)閉狀態(tài)。
- 當(dāng) TEC 和 REC 都降低到 128 以下時,節(jié)點(diǎn)可以從被動錯誤狀態(tài)恢復(fù)到主動錯誤狀態(tài)。
- 從總線關(guān)閉狀態(tài)恢復(fù)需要滿足特定條件(如總線空閑檢測),并直接回到初始狀態(tài)(通常是主動錯誤狀態(tài))。
CAN 總線的錯誤處理機(jī)制通過發(fā)送錯誤計數(shù)器(TEC)和接收錯誤計數(shù)器(REC),能夠量化節(jié)點(diǎn)的錯誤發(fā)生頻率?;谟嫈?shù)器的值,節(jié)點(diǎn)被動態(tài)地劃分為主動錯誤、被動錯誤和總線關(guān)閉三種狀態(tài),每種狀態(tài)對應(yīng)不同的總線訪問權(quán)限和錯誤響應(yīng)方式(主動 / 被動錯誤標(biāo)志)。特別是被動錯誤狀態(tài)下的 “掛起傳送” 要求和總線關(guān)閉狀態(tài)的強(qiáng)制隔離,有效地限制了故障節(jié)點(diǎn)對總線整體通信的負(fù)面影響,確保了在部分節(jié)點(diǎn)出現(xiàn)問題時,關(guān)鍵通信仍能繼續(xù)進(jìn)行。
關(guān)鍵詞:CAN 總線