CAN總線數據鏈路層分析(四)

在SPI通信中,片選、時鐘信號、數據輸入及數據輸出這四個信號都有單獨的信號線。而CAN使用的是兩條差分信號線,只能表達一個信號。簡潔的物理層決定了CAN必然要配上一套更爲複雜的協議。如何用一個信號通道實現同樣甚至更強大的功能,答案就是對數據或操作命令進行打包。

一、通信機制

1.1 多主機(Multi-Master)

安全敏感的應用(如汽車動力)對通信系統的可靠性要求很高。將總線能否正常工作歸結到單一節點是非常危險的,比較合理的方案是對總線接入的去中心化,即每個節點都有接入總線的能力。這也是CAN總線採用多主控(Multi-Master)線性拓撲結構的原因。

在CAN總線上,每個節點都有往總線上發送消息的能力,而消息的發送不必遵從任何預先設定的時序,通信是事件驅動的。只有當有新的信息傳遞時,CAN總線才處於忙碌的狀態,這使得節點接入總線速度非常快。CAN總線理論最高數據傳輸速率爲1Mbps,對於異步事件反應迅速,基本對於ms級別的實時應用沒有任何問題。

1.2 尋址機制

不同於其它類型的總線,CAN總線不設定節點的地址,而是通過消息的標識符(Identifier)來區別消息。這種機制雖然會增加消息的複雜度(增加標識符),但是節點在此情況下可以無需瞭解其他節點的狀況,而相互間獨立工作。在總線上增加節點時僅需關注消息類型,而非系統上其他節點的狀況。這種以消息標識符尋址的方式,讓總線上增加節點變得更加靈活。

1.3 總線訪問CSMA/CD+AMP

CAN總線通信原理可簡單描述爲多路載波偵聽+基於消息優先級的衝突檢測和非破壞性的仲裁機制(CSMA/CD+AMP)。

CSMA(Carrie Sense Multiple Access)指的是所有節點必須都等到總線處於空閒狀態時才能往總線上發送消息;

CD+AMP(Collision Detection + Arbitration on Message Priority)指的是如果多個節點往總線上發送消息時,具備最高優先級的消息獲得總線。

多路載波偵聽

網絡上所有節點以多點接入的方式連接在同一根總線上,且發送數據是廣播式的。網絡上各個節點在發送數據前都要檢測總線上是否有數據傳輸:若網絡上有數據,暫時不發送數據,等待網絡空閒時再發;若網絡上無數據,立即發送已經準備好的數據。

衝突檢測

節點在發送數據時,要不停的檢測發送的數據,確定是否與其他節點數據發送衝突,如果有衝突,則保證優先級高的報文先發送。

發送低優先級報文的節點退出仲裁後,在下次總線空閒時自動重發報文

非破壞性仲裁機制

通過ID仲裁,ID數值越小,報文優先級越高。

高優先級的報文不能中斷低優先級報文的發送

1.4 報文接收過濾(硬件過濾&軟件過濾)

CAN控制器大多具有根據ID過濾報文的功能,即只接收某些ID的報文。節點對接收到的報文進行過濾:比較消息ID與選擇器(Accepter)中和接受過濾相關位是否相同。如果相同,接收;如果不相同,則過濾。

二、CAN的報文種類及結構

在原始數據段的前面加上傳輸起始標籤、片選(識別)標籤、控制標籤,在數據的尾段加上CRC校驗標籤、應答標籤和傳輸結束標籤。把這些內容按特定的格式打包好,就可以用一個通道表達各種信號了。各種各樣的標籤,起到了協同傳輸的作用。當整個數據包被傳輸到其他設備時,只要這些設備按格式去解讀,就能還原出原始數據。類似這樣的數據包就被稱爲CAN的數據幀。

爲了更有效的控制通信,CAN一共規定了5中類型的幀,幀也稱爲報文。

2.1 數據幀

數據幀在CAN通信中最主要,也最複雜。數據幀以一個顯性位(邏輯0)開始,以7個連續的隱性位(邏輯1)結束。CAN總線的數據幀有標準格式(Standard Format)和擴展格式(Extended Format)的區分。

數據幀可以分爲七段:

幀起始(SOF)

標識一個數據幀的開始,固定一個顯性位。 ​ 用於同步,總線空閒期間的任何隱性到顯性的跳變都將引起節點進行硬同步。只有總線在空閒期間節點才能夠發送SOF。

仲裁段(Arbitration Field)

仲裁段的內容主要爲本數據幀的ID信息。數據幀分爲標準格式和擴展格式兩種,區別就在於ID信息的長度:標準格式的ID爲11位;擴展格式爲29位。在CAN協議中,ID決定着數據幀發送的優先級,也決定着其他設備是否會接收這個數據幀。 仲裁段除了報文ID外,還有RTR, IDE, SRR位。

控制段

在控制段,r1(reserved1)和r0(reserved0)爲保留位,默認設置爲顯性位。最主要的是DLC(Data Length Code)段,它是用二進制編碼表示本報文中的數據段包含多少個字節。DLC段由4位組成,DLC3−DLC0,表示的數字爲0-8. ​

數據段

數據幀的核心內容,有0-8個字節長度,由DLC確定。

CRC段

 

爲了保證報文的正確傳輸,CAN的報文包含了一段15位的CRC校驗碼,一旦接收端計算出的CRC碼跟接收到的CRC碼不同,就會向發送端反饋出錯信息以及重新發送。CRC部分的計算和出錯處理一般由CAN控制器硬件完成,或由軟件控制最大重發數。

在CRC校驗碼之後,有一個CRC界定符,它爲隱性位,主要作用是把CRC校驗碼與後面的ACK段隔開。

ACK段

包含確認位(ACK slot)和界定符(Delimiter, DEL)。ACK在發送節點發送時,爲隱性位。當接收節點正確接收到報文時,對其用顯性位覆蓋。DEL界定符同樣爲隱性位,用於隔開。

幀結束段(End-of-Frame, EOF)

幀結束段由發送端發送7個隱性位表示結束。

2.2 遠程幀

(暫略)

2.3 錯誤幀

CAN網絡具有嚴格的錯誤診斷功能,該功能已固化在硅片之中,一旦錯誤被檢測,正在傳送的數據幀將會立即停止而待總線空閒時再次重發直至發送成功,該過程並不需要CPU的干涉除非錯誤累計該發送器進入總線關閉( Bus Off )。經過計算,正常使用的CAN總線約一千年纔會漏檢出一個錯誤!

錯誤檢測

可檢測的錯誤有:位錯誤(Bit Error)、填充錯誤(Stuff Error)、ACK錯誤(ACK Error)、格式錯誤(Form Error)、CRC錯誤(CRC Error)。

位檢測->位錯誤

節點檢測到的位與自身送出的位數值不同。

Exception:口仲裁或ACK位期間送出“隱性”位,而檢測到“顯性”位不導致位錯誤

填充檢測->填充錯誤

在使用位填充編碼的幀場(幀起始至CRC序列)中,不允許出現六個或更多連續相同的電平位。

CRC檢測->CRC錯誤

接收節點計算的CRC序列與接收到的CRC序列不同。

格式檢測->格式錯誤

固定格式位場(CRC界定符、ACK界定符、幀結束)檢測到一個或更多顯性位。

ACK檢測->ACK錯誤

發送節點在ACK位期間未檢測到“顯性”位。

錯誤通知

錯誤管理的重要概念( ISO11898 )

 1. Fault confinement(錯誤界定)

CAN nodes shall be able to distinguish short disturbances from permanent failures.Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.
CAN節點可以區分常規錯誤和永久故障。有故障的發送節點將切換到離線狀態。離線意味着在邏輯上與總線斷開,既不能發送也不能接收。

2. Error-active(主動錯誤)

An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .

處於主動錯誤狀態的節點能正常參與總線通信的收發和當檢測到錯誤時將發送動錯誤標誌, 錯誤標誌由6個連續的顯示位組成(這種連續的6個顯示位與常規的填充位和其它幀固定格式不相同,正因爲如此,硬件才容易區別)。

3. Error-passive (被動錯誤)
An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent.The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .
處於被動錯誤狀態的節點不能發送主動錯誤標誌。它能參與正常通信,但當檢測到錯誤時發送的是被動錯誤標誌。被動錯誤標誌由6個連續的隱性位組成。當發送結束後,處於被動錯誤狀態的節點在下一次再次發送時之前需要等待一些額外時間。

4. Bus-off (離線)
A bus-off state shall not have any influence on the bus. It shall neither send any frames nor send ACK, error frames, overload frames. Whether such a node receives frames from the bus depends on the implementation.
Bus off 狀態下節點不允許對總線產生任何影響,此時節點既不會發送任何報文或是發送ACK應答、錯誤幀、過載幀。節點是否能夠接收總線報文取決於實際應用情況。

5. TEC&REC (發送錯誤計數器&接收錯誤計數器)
CAN協議描述的出錯管理,完全由硬件通過發送錯誤計數器(CAN_ ESR寄存器裏的TEC域),軟件可以讀出它們的值來判斷CAN網絡的穩定性。

  • 每個節點都含有REC和TEC
  • 當接收錯誤產生時,REC增加;
  • 正確接收到數據幀,REC減少
  • 當發送錯誤產生時,TEC增加;
  • 正確發送一幀數據幀,TEC減少;
  • REC、TEC的數值會引發節點狀態改變

6. 節點的三種狀態

  • Error Active

正常的進行總線通信錯誤產生時,發送主動錯誤幀

  • Error Passive

能夠進行總線通信錯誤產生時,發送被動錯誤幀

  • Bus Off

不能收發任何報文

特例:如果總線上只有一 個節點,該節點發送數據幀後得不到應答,TEC最大隻能計到128,即節點只會進入被動錯誤狀態而不會進入總線關閉狀態

錯誤通知

總線通信錯誤以向總線上發送錯誤幀作爲標誌。

  • 檢測錯誤->發送錯誤幀->通知報文錯誤
  • 錯誤幀的發送

位錯誤、填充錯誤、格式錯誤或ACK錯誤產生後>當前發送的下一-位發送錯誤幀
CRC錯誤->緊隨ACK界定符後的位發送錯誤幀

  • 錯誤幀發送後->總線空閒時自動重發出錯的數據幀!

錯誤幀的格式(包括錯誤標誌與錯誤界定符)

  • 錯誤標誌

主動錯誤標誌: 6個連續顯性位;

被動錯誤標誌: 6個連續隱性位;

  • 錯誤界定符

8個連續隱性位

錯誤標誌的疊加

  • 主動錯誤
  • 錯誤標誌: 6個連續顯性位

破壞填充規則,誘發其它節點發送錯誤標誌;
破壞固定位場(CRC界定符、ACK界定符及EOF)的固定格式,誘發其它節點發送錯誤標誌;

  • 0~6個錯誤標誌疊加
  • 錯誤標誌發送後,每個站都送出隱性位,並監視總線,直到檢測到隱性位,此後開始發送剩餘的7個隱性位。

  • 被動錯誤
  • 錯誤標誌: 6個連續隱性位
  • 由發送節點發送的被動錯誤標誌,會誘發接收節點發送錯誤標誌,特例:

仲裁期間發送,如果有其它節點發送報文
ACK位發送

  • 由接收節點引起的被動錯誤標誌不會誘發總線上的任何活動
  • 被動錯誤節點必須檢測到總線上6個連續相同的極性位後,才認爲錯誤標誌被送出

錯誤幀的發送

  • 位錯誤

  • 格式錯誤

  • CRC錯誤

錯誤恢復

錯誤狀態的轉換關係

錯誤計數值得變動條件

Bus Off 問題現象分析

(暫略)

2.4 超載幀

(暫略)

2.5 幀間隔

(暫略)

三、位時序

 

四、同步

 

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