- Advertisement -
首頁 技術頻道 CAN網路設計有撇步(下) ACK確保CAN訊息正常發送

CAN網路設計有撇步(下) ACK確保CAN訊息正常發送

- Advertisement -

CAN匯流排調試過程中出現封包發送失敗,很多工程師都對此只知其一不知其二,今天我們就CAN封包發送失敗的問題來做一次探討。在瞭解CAN封包為什麼會發送失敗之前,我們先看看一條正確的CAN封包到底應該是怎麼樣的,表1是一個正常標準資料幀的封包組成。

ACK為CAN通訊關鍵要素

CAN匯流排是一種基於廣播的通訊方式,為了保證匯流排上的每一個正常節點都能正確的接收到封包,封包的發送者要求每一個接收節點在封包發送結束前要作出應答,這也是封包裡ACK存在的原因。

一幀CAN封包中ACK段長度為2個位,包含應答間隙(ACK Slot)和應答界定符(ACK Delimter)。在應答場裡,發送站發送兩個隱性位。當接收器正確地接收到有效的封包,接收器就會在應答間隙(ACK Slot)期間(發送ACK訊號)向發送器發送一「顯性」的位以示應答。

.應答間隙:

所有接收到匹配CRC序列(CRC SEQUENCE)的站會在應答間隙期間用一顯性的位寫入發送器的隱性位來作出回答。

.應答界定符:

ACK界定符是ACK場的第二個位,並且是一個必須為隱性的位。因此,應答間隙(ACK Slot)被兩個隱性的位所包圍,也就是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。

 ACK出錯之原因

而如果匯流排上沒有ACK應答(即應答間隙為隱性),發送器就會發送一個錯誤標誌,並且發送錯誤計數器值加8,節點就會對封包進行自動重發。

若是自動重發依然收不到ACK,則會在發送錯誤計數器計數滿128後(即出現16幀錯誤幀),由錯誤主動轉為錯誤被動狀態,如圖1所示。

圖1 應答界定符錯誤幀

那麼,導致ACK段出錯的原因有哪些呢?下文總結了數個原因。

首先是匯流排上只有一個有效節點。發送封包的節點在發送出一幀封包後會檢測匯流排上應答間隙的狀態,如果檢測到應答間隙為隱性位,則表示該幀封包沒有得到ACK,發送失敗,需要重發,而由於發送錯誤計數器會在發送失敗後累加,直到該節點關閉。

所以,當匯流排上只有一個有效節點時,這個節點是發不出去資料的,因為它所發出的資料幀中的ACK Slot沒有另外一個節點來填充,將永遠是隱性位,這個節點會一直重發資料直到發送成功或發送被取消。

至於其他的原因還包括:串列傳輸速率不匹配或者節點沒有初始化,導致沒有ACK;匯流排線纜短路、斷路、接反;高速CAN匯流排上接的節點不是高速CAN,而是容錯低速CAN,導致不匹配。

當調試CAN匯流排時出現節點發送封包失敗的情況時,一定要檢查是不是以上幾點疏漏導致匯流排上ACK異常。而借助恰當的儀器,可以在查找CAN匯流排錯誤時事半功倍。圖2即採用致遠電子的CANScope來對錯誤幀進行標記,同時找到錯誤幀對應的波形來查找出錯誤情況。CANScope還可以對CAN匯流排實體層、資料連結層、應用層做一系列的測試,為CAN工程師解決測試難題。

圖2 沒有ACK的封包。

CAN封包位元解析

CAN-bus匯流排是應用最廣泛的現場匯流排之一,而很多非常熟練的CAN工程師,面對一條CAN封包到底有多少位的問題時,卻不能非常準確地回答。對此,本文就從最基本的框架格式來解惑一條CAN封包的到底有多少位。

CAN封包幀分為幾種呢?CAN-bus通訊幀共分為資料幀、遠端幀、錯誤幀、超載幀和幀間隔;而資料幀和遠端幀又有標準幀和擴展幀兩種,其框架類型以及用途如表2所示。

數據幀

資料幀從結構上看分為7段,分別為起始段、仲裁段、控制段、資料段、CRC校驗段、ACK應答段、幀結束段。

.幀起始段:

該段由單個顯性位元構成,在匯流排空閒時才允許發送,所有節點必須同步於開始發送的資料幀的起始位元。

.標準幀仲裁段:

標準幀的仲裁段由11位ID碼和一個顯性位RTR碼組成,RTR碼為遠端幀標識位元。

.擴展幀仲裁段:

擴展幀的仲裁段由29位ID碼、一位顯性的SRR碼、一位隱性的IDE碼和一位顯性的RTR碼組成。

.標準幀控制段:

標準幀的控制段由單位顯性的IDE、保留位r0和4位元資料長度代碼DLC組成,DLC資料段採用BCD編碼。

.擴展幀控制段:

擴展幀的控制段由兩個保留位r1和r0和4位的DLC資料段組成,r1和r0都為顯性填充,接收時無論保留位是顯性還是隱性都沒有影響。

.資料段:

一個資料段為8個位元組。

.CRC校驗段:

CRC校驗段由15位的校驗碼和1個隱性位填充的CRC界定符組成,CRC校驗範圍為幀起始、仲裁段、控制段和資料段。

.ACK段:

ACK段由ACK碼和一個隱性位ACK界定符組成,發送節點在ACK段發送兩個隱性位,接收節點在收到的封包ACK前面的框架格式沒有錯誤時,將發出ACK碼為顯性位的封包。

.幀結束段:

由7個連續的隱性位組成。

遠程幀

遠端幀框架格式跟資料幀類似,也分為標準幀跟擴展幀,但是遠端幀屬於被請求發送節點發送的封包,而資料幀是發送節點的封包,如圖3,遠端幀沒有資料幀。參照資料幀可瞭解遠端幀的結構,但是兩者之間也有不同。

圖3 標準遠程幀和擴展遠程幀的結構圖

.SRR段和RTR段:

資料幀是顯性電平,遠端幀是隱性電平。

.節點性質:

資料幀是發送節點發出的封包格式,遠端幀是被請求發送的節點發送的封包格式。

.CRC校驗範圍:

資料幀是幀起始、仲裁段、控制段和資料段,而遠程幀則是幀起始、仲裁段和控制段。

瞭解了資料幀跟遠端幀的標準封包格式後,有些使用者可能會詢問,有時看到的封包為什麼跟標準格式的位數不一樣?下文便詳細說明。

CAN-bus位元填充規則

CAN-bus屬於非同步串列通訊,這種通訊方式沒有時鐘線,所以各個收發器的時鐘不可能完全一致,時鐘不一致就會造成偏差。所以為了解決這個問題,CAN匯流排採用同步的方式來校準時鐘。

CAN-bus規定訊號的跳變沿為同步訊號,只要訊號發生變化,節點時鐘就被同步一次;CAN-bus還規定同步的最大週期為5個位。

但是問題來了,要是出現連續性的5個位甚至更長時間沒有邊沿跳變(例如資料段全為0×56),那該如何解決呢?CAN-bus對這種情況又進行了規範,如果傳輸的位元訊號連續5個位是相同的,就要插入一個電平相反的位,這個就是CAN-bus的「位元填充」規則。

 0×00和0×55封包解析

由於位元填充規則的存在,所以就存在著即使兩個幀都是標準資料幀,但是發送不同ID,或者是資料段的時候封包時間會不同。

圖4為1M串列傳輸速率下ID跟資料都為0×00的標準資料幀封包,原本108個位的標準資料幀的真實封包時間為123us。

圖4 標準資料幀0×00封包

而0×55的標準資料幀封包格式則如圖5。ID為555H,資料段為55H,封包沒有出現連續的相同位,所以填充位最少,8位的資料段位時間為標準的8us,全封包時間為108us。

圖5 標準資料幀0×55封包

表3給出了標準資料幀、擴展資料幀、標準遠端幀,以及擴展遠端幀四種框架類型在發送不同ID和資料時位元時間的差別。

總而言之,通過CAN-Scope匯流排分析儀的封包接收和示波器,可以將每一幀封包跟波形做對應,快速分析匯流排上的封包時間和波形情況,實現CAN匯流排的快速故障定位和干擾排除。

(本文作者任職於致遠電子)

相關文章

- Advertisement -
- Advertisement -

最新文章

- Advertisement -

熱門文章

- Advertisement -

編輯推薦

- Advertisement -