CAN總線問題是一類比較普遍的問題,為了方便CAN總線問題的排查,對CAN總線的錯誤處理機制進行總結。
錯誤幀
當節點檢測到錯誤時,節點會向總線上發送錯誤幀,通知其他節點當前總線有錯誤。錯誤幀由錯誤標誌和錯誤界定符組成,如圖1所示。並且分為主動錯誤狀態下的錯誤幀和被動錯誤狀態下的錯誤幀。
圖1 錯誤幀
其中:
主動錯誤狀態下錯誤幀的錯誤標誌為6位連續的顯性位。
被動錯誤狀態下錯誤幀的錯誤標誌為6位連續的隱性位。
錯誤界定符統一為8位連續的隱性位。
錯誤檢測
CAN總線的錯誤類型包括位錯誤、填充錯誤、格式錯誤、ACK錯誤、CRC錯誤五種,錯誤的作用域如圖2所示。其中位錯誤、格式錯誤、ACK錯誤屬於發送節點的錯誤,填充錯誤、格式錯誤、CRC錯誤屬於接收節點的錯誤。
圖2 錯誤的作用域
位錯誤
節點將發送至總線上的電平與從總線回讀的電平進行比較,如果兩者不同,例如發送的是隱性位,回讀到確是顯性位,則節點會檢測出位錯誤,如圖3所示。有以下三種例外情況不屬於位錯誤:
1.仲裁區,節點發送隱性位,回讀為顯性位,這種情況表示仲裁失敗。
2.ACK槽,節點發送隱性位,回讀為顯性位,這種情況表示當前節點發送的報文至少被一個接收節點正確接收。
3.該節點發送被動錯誤標誌位,節點向總線發送被動錯誤標誌,回讀的不是六位連續的隱性位,這種情況是由於CAN總線是線與機制,被動錯誤標誌被其他節點發送的顯性位給覆蓋,所以回讀不是6位連續的隱性位。
圖3 位錯誤
填充錯誤
在使用位填充法(CAN協議中規定,當相同極性的電平持續五位時,則添加一個極性相反的位)進行編碼的信息中,出現了6個連續相同的位電平,則檢測為填充錯誤。
ACK錯誤
節點在發送報文(數據幀或遙控幀)時,如果接收節點成功接收報文,那麼接收節點會在ACK槽對應的時間段內向總線發送一個顯性位,告知發送節點報文已正常接收,如圖4所示。當發送節點在ACK槽時間內沒有回讀到顯性位,則發送節點檢測到ACK錯誤。
圖4 ACK交互
CRC錯誤
發送節點在發送CAN報文(數據幀或遙控幀)時,會對幀起始、仲裁段、控制段、數據段(如圖5所示)進行CRC計算,並將計算的結果放置在CRC段。接收節點在接收報文時對相同的段執行相同的CRC算法,如果計算結果與CRC段的數據不同,則接收節點檢測出CRC錯誤。
圖5 CRC作用域
格式錯誤
報文中,固定形式的位場含有1個或多個非法位,包括數據幀或遙控幀的CRC界定符、ACK界定符、EOF、錯誤幀界定符、過載幀界定符,則節點檢測為格式錯誤。
錯誤通知
總線上節點的狀態機如圖6所示,節點狀態分為三種,分別是主動錯誤、被動錯誤、總線關閉。狀態跳轉依據的是TEC(發送錯誤計數器)和REC(接收錯誤計數器)的值,其中REC和TEC都小於127時為主動錯誤狀態,該狀態下節點能正常進行通信,當錯誤產生時,發送6個連續顯性位組成的主動錯誤標誌;當REC或者TEC大於127時,節點狀態跳轉至被動錯誤狀態,該狀態下節點能正常通信;當錯誤產生時,發送6個連續隱性位組成的被動錯誤標誌;當TEC達到255時,節點進入BusOff狀態,並且不能收發報文,總線上其他節點依然可以正常通信。
圖6 節點狀態機
TEC和REC計數器值的增減是根據表1規定進行的。
表1 錯誤規則
————|往期回顧|————
AUTOSAR CanNm介紹
AUTOSAR BswM介紹
AUTOSAR DCM介紹
點擊以下圖片關注公眾號!