CAN通訊的總結

1.CAN通訊有2套國際標準,2套協議版本,3種故障狀態,4種數據幀類型,5種總線錯誤類型。

2.CAN的國際標準有兩種ISO11898ISO11519

3.CAN2.0協議分爲A版和B版兩種,A版協議僅支持11位標識符(稱爲標準幀),B版協議兼容11位,向上擴展到19位標識符(稱爲擴展幀)。

4.CAN總線中,任何一個節點發生了錯誤,那麼這個節點可能處於3種故障狀態:錯誤主動狀態,錯誤被動狀態,離線狀態。錯誤主動狀態:可以正常參加總線通訊,檢測出錯誤時,輸出主動錯誤標誌。錯誤被動狀態:是易引起錯誤的狀態,雖然能參加總線通訊,但爲不妨礙其他節點通訊,接收時不能積極的發送錯誤通知,處於被動錯誤狀態的節點即時檢測出錯誤,而其它處於主動錯誤狀態的節點如果沒有發現錯誤,整個總線也被認爲沒有錯誤。離線狀態:不能參加總線通訊的狀態。

4.CAN總線中有5類錯誤,這5類錯誤並不具有排他性,可以同時發生。CAN總線在任意時刻,只有一個節點在發送數據,其他所有節點都是在接收,只有對應的ID報文節點對接收的報文做出應答反應。

5.位錯誤(Bit Error):節點是邊發送邊檢聽對應的位,發送的位和檢測的位如果不一致,則檢測到一個位錯誤。

6.填充錯誤(Stuff Error)監聽到6個連續相同的爲電平時,則檢測到一個位填充錯誤。

7.CRC錯誤(CRC Error)發送節點會對報文的幀起始,仲裁場,數據場進行CRC計算,求出CRC校驗碼,並將其也發送出去。接收節點在接收到數據後,會根據CRC校驗碼來判斷接收到的數據在傳送過程中是否出錯。

8.形式錯誤()一個固定形式的位場中含有非法位時,則檢測到一個形式錯誤。

9.應答錯誤()只要在應答期間所監聽的位不爲顯性,則發送器檢測到一個應答錯誤。

應答場包括應答位和應答分隔符,發送節點發送的這兩位均爲隱性電平,這時只有正確接收報文的接收節點發送顯性電平來覆蓋它。

11.串口通信是一對一的通信,SPI的通信是一對多的通信。CAN的一大特點,多主機串行通信:也就是在總線空閒時,所有單元都可以發送消息,最先訪問的節點可以獲得發送權,若多個節點認爲自己獲得發送權同時開始發送數據時,根據ID的優先級來競爭總線的發送權。總線上的節點沒有類似於MAC物理地址的信息,所以在總線上增減單元時,連接在總線上的其他單元的軟硬件及應用層都不需要改變。單元根據報文ID決定接收或者屏蔽該報文,報文ID在一定程度上也決定了此幀數據的優先級,發送的信息遭到破壞後,可自動重發;節點在錯誤嚴重的情況下具有自動退出總線的功能。

12.CAN總線上所有的節點都可以檢測錯誤,檢測出錯誤的單元會立刻通知其他所有單元。正常發送的節點一旦檢測出錯誤,會強制結束當前的發送,強制結束髮送的節點會不斷反覆的發送此信息直到成功發送爲止,或進入總線關閉狀態。

13.CAN總線上的信號使用差分電壓進行傳送,兩條信號線被稱爲CAN_H CAN_L,靜態時均是2.5v左右,這時的狀態表示邏輯1,也稱爲隱性電平,通常CAN_H3.5CAN_L1.5時,表示爲邏輯0,稱爲顯性電平。

14.DSP的CAN模塊的引腳在發送數據的同時,其接受引腳也在監聽所發送的數據,也就是,發送數據的時候,接受引腳上也會有相應的波形可以在示波器上顯示。如果CAN總線上只有發送節點,卻沒有接受節點,那麼這個發送節點會一直髮送數據直到發送成功爲止,也就是收到有效的應答信號。

15.CAN協議裏對ACK(應答場)有如下的描述:

應答場長度爲2 個位,包含應答間隙(ACK SLOT)和應答界定符(ACK DELIMITER)。在應答場裏,發送站發送兩個“隱性”位。當接收器正確地接收到有效的報文,接收器就會在應答間隙(ACK SLOT)期間(發送ACK 信號)向發送器發送一“顯性”的位以示應答。

15.應答間隙:所有接收到匹配CRC 序列(CRC SEQUENCE)的站會在應答間隙(ACK SLOT)期間用一“顯性”的位寫入發送器的“隱性”位來作出回答。ACK 界定符:ACK 界定符是ACK 場的第二個位,並且是一個必須爲“隱性”的位。因此,應答間隙(ACK SLOT)被兩個“隱性”的位所包圍,也就是CRC 界定符(CRC DELIMITER)和ACK 界定符(ACK DELIMITER)。

16.在CAN協議的錯誤檢測部分有這樣的描述:

位錯誤:站單元在發送位的同時也對總線進行監視。如果所發送的位值與所監視的位值不相符合,則在此位時間裏檢測到一個位錯誤(BIT ERROR)。但是在仲裁場(ARBITRATION FIELD)的填充位流期間或ACK間隙(ACK SLOT)發送一“隱性”位的情況是例外的—— 此時,當監視到一“顯性”位時,不會發出位錯誤(BIT ERROR)。應答錯誤:只要在ACK 間隙(ACK SLOT)期間所監視的位不爲“顯性”,則發送器會檢測到一個應答錯誤(ACKNOWLEDGMENT ERROR)。

17.發送者在發送的同時,會監視總線上的數據,如果與發送的婁據不一致,則表示發送失敗或自己失去仲裁,立即停止發送或轉入接收模式。如果有一個節點在ACK SLOT的時間內發送“顯性”位,則發送者認爲此次發送報文成功;如果發送者檢測到ACK SLOT爲隱性位,則表示沒有節點填充ACK SLOT,則發送者會檢測到這個隱性位而知道發送失敗,此條報文需要重發。所以,當總線上只有一個節點的時候,或是隻有一個節點可以收發數據的時候,這個節點是發不出去數據的,因爲它所發出的數據幀中的ACK SLOT沒有另外一個節點來填充,將永遠是隱性位,這個節點會一直重發數據直到發送成功或發送被取消。

18.(注:一:總線上只有一個節點而且它向外發送了數據。它確實不會收到任何ACK,它會變成“error passive”但是它不會變成BUS off。why?請參考CAN specificaton 2.0-partB-Fault_Confinement--rule3--exception1 二:其它檢測到CRC錯誤的節點不會馬上發送錯誤幀,而是在ACK delimiter之後才發送。請參考CAN specificaton 2.0-partB-Error_Signalling)

19.ACK SLOT只有一個BIT,而接下去的ACK delimiter始終爲隱性(我們可認爲是1),當數據到達ACK SLOT的時候,所有的節點都會發送顯性位(我們可以認爲是0),而發送者在ACK這個時間裏保持隱性位(即發送者在發送的時候ACK SLOT 爲1),這時發送者會檢測總線上的ACK時間內的信號,如果是0,則表示正確,如果是1,表示有錯誤。如果當中有某一個節點在ACK SLOT填入隱性位,則總線上同樣還是顯性位電平,故只要總線上有一個節點正確接收到數據,則ACK SLOT就會被填入顯性電平;那麼,接收錯誤的節點如何來告知發送者此次發送不成功呢?這時候就要用到CAN的錯誤幀,當一個接收者收到錯誤的數據的時候,它立即開始發送一個錯誤幀,則接下去總線上的信號就是這個錯誤幀,其它的節點和發送者也都會收到這個錯誤幀,那所有的節點都知道出錯了,接收者會丟掉此次消息,而發送者會試圖重發此次消息。這纔是ACK SLOT真正的含義。

20.我們認爲,發送者在發數據的時候,CANTX在發送數據,而CANRX同時也在接收數據,當發送者發送ACK爲隱性時,接收到的ACK SLOT一定要是顯性纔會正確。那麼,當有節點正確接收到了數據,在ACK SLOT填上顯性位後,接收錯誤的節點這時候會如何呢?接收錯誤的節點就會馬上發送錯誤幀,一般是發送連續的601,根據CAN的位填充原理,當有五個連續的01出現時,爲了傳送中的同步,必須插入一個反相位的BIT作爲填充位,如果連續出現6個或以上的相同信號,則此次傳送錯誤,數據將被丟棄。故當發送者收到這個錯誤幀後,便會知道發送出錯,並試圖重發數據。

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