關於CAN報文中ACK應答錯誤的檢測原理

2021-08-15 07:39:36 字數 2769 閱讀 1178

can協議裡對ack(應答場)有如下的描述:

應答場長度為2個位,包含應答間隙(ack slot)和應答界定符(ack delimiter)。在應答場裡,傳送站傳送兩個「隱性」位。當接收器正確地接收到有效的報文,接收器就會在應答間隙(ack slot)期間(傳送ack訊號)向傳送器傳送一「顯性」的位以示應答。

應答間隙:所有接收到匹配crc序列(crc sequence)的站會在應答間隙(ack slot)期間用一「顯性」的位寫入傳送器的「隱性」位來作出回答。

ack界定符:ack界定符是ack場的第二個位,並且是乙個必須為「隱性」的位。因此,應答間隙(ack slot)被兩個「隱性」的位所包圍,也就是crc界定符(crc delimiter)和ack界定符(ack delimiter)。

此主題相關如下:

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

位錯誤:站單元在傳送位的同時也對匯流排進行監視。如果所傳送的位值與所監視的位值不相符合,則在此位時間裡檢測到乙個位錯誤(bit error)。但是在仲裁場(arbitration field)的填充位流期間或ack間隙(ack slot)傳送一「隱性」位的情況是例外的——此時,當監視到一「顯性」位時,不會發出位錯誤(bit error)。

應答錯誤:只要在ack間隙(ack slot)期間所監視的位不為「顯性」,則傳送器會檢測到乙個應答錯誤(acknowledgment error)。

從協議所描述的內容來看,我們不難得出乙個結論:can是一種基於廣播的通訊方式,為了保證匯流排上的每乙個節點(處於normal mode)都能正確的接收到報文,報文的傳送者要求每乙個接收節點在報文傳送結束前,也就是ack slot的時間內,作出應答,即要求接收的節點都在這個時間傳送乙個「顯性」位。傳送者在傳送的同時,會監視匯流排上的資料,如果與傳送的婁據不一致,則表示傳送失敗或自己失去仲裁,立即停止傳送或轉入接收模式。如果有乙個節點在ack slot的時間內傳送「顯性」位,則傳送者認為此次傳送報文成功;如果傳送者檢測到ack slot為隱性位,則表示沒有節點填充ack slot,則傳送者會檢測到這個隱性位而知道傳送失敗,此條報文需要重發。所以,當匯流排上只有乙個節點的時候,或是只有乙個節點可以收發資料的時候,這個節點是發不出去資料的,因為它所發出的資料幀中的ack slot沒有另外乙個節點來填充,將永遠是隱性位,這個節點會一直重發資料直到傳送成功或傳送被取消。

(注:一:匯流排上只有乙個節點而且它向外傳送了資料。它確實不會收到任何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)

ack slot只有乙個bit,而接下去的ack delimiter始終為隱性(我們可認為是1),當資料到達ack slot的時候,所有的節點都會傳送顯性位(我們可以認為是0),而傳送者在ack這個時間裡保持隱性位(即傳送者在傳送的時候ack slot為1),這時傳送者會檢測匯流排上的ack時間內的訊號,如果是0,則表示正確,如果是1,表示有錯誤。如果當中有某乙個節點在ack slot填入隱性位,則匯流排上同樣還是顯性位電平,故只要匯流排上有乙個節點正確接收到資料,則ack slot就會被填入顯性電平;那麼,接收錯誤的節點如何來告知傳送者此次傳送不成功呢?這時候就要用到can的錯誤幀,當乙個接收者收到錯誤的資料的時候(怎樣判斷的),它立即開始傳送乙個錯誤幀,則接下去匯流排上的訊號就是這個錯誤幀,其它的節點和傳送者也都會收到這個錯誤幀,那所有的節點都知道出錯了,接收者會丟掉此次訊息,而傳送者會試圖重發此次訊息。這才是ack slot真正的含義。

下面我們通過乙個例項來看看can節點是如何進行ack slot的動作的。我們抓取乙個匯流排上面的訊號波形,此波形已經是通過82c251解碼過後的。

此主題相關如下:

抓取的波形,圖中的四個通道分別表示兩個節點的cantx和canrx,其中通道a,b表示node 1的cantx和canrx,通道c,d表示node 2的cantx和canrx。將其正對座標中軸的部分展開,得到如下的圖形,由上圖我們清楚的看到,node 1的cantx在接收到資料後立即響應,即向外傳送資料,當資料傳送完畢,到了ack的時間內,見下圖中黃色圖示處,node 1的cantx傳送兩個隱性位,而對於node 2,當傳送者node 1的cantx到了報文的ack時間,node2也接收完資料,如果crc校驗通過,則node2的cantx會相應的傳送顯性位,即通道c的紅色圖示處。如果匯流排上存在node 3和node 4或是更多node,則波形相同。圖中的b和d都是canrx,所以都有ack的顯性位出現。

此主題相關如下:

我們認為,傳送者在發資料的時候,cantx在傳送資料,而canrx同時也在接收資料,當傳送者傳送ack為隱性時,接收到的ack slot一定要是顯性才會正確。那麼,當有節點正確接收到了資料,在ack slot填上顯性位後,接收錯誤的節點這時候會如何呢?接收錯誤的節點就會馬上傳送錯誤幀,一般是傳送連續的6個0或1,根據can的位填充原理,當有五個連續的0或1出現時,為了傳送中的同步,必須插入乙個反相位的bit作為填充位,如果連續出現6個或以上的相同訊號,則此次傳送錯誤,資料將被丟棄。故當傳送者收到這個錯誤幀後,便會知道傳送出錯,並試圖重發資料。

CAN報文格式

can協議的報文傳輸過程中有 資料幀 遠端幀 錯誤幀 過載幀和幀間隔。1.資料幀 用於傳送節點向接收節點傳送資料的幀。2.遠端幀 用於接收節點向具有相同id的傳送節點傳送資料的幀。3.錯誤幀 用於當檢測出錯誤時向其他節點通知錯誤的幀。4.過載幀 用於接收節點通知其尚未做好準備的幀。5.幀間隔 用於將...

can整車報文解析

設定初始化,配置管腳,是否進行對映,配置波特率,設定中斷函式等等。下面詳細介紹如何解析整車報文的詳細過程 can1控制器發,can2控制器接收。傳送比較簡單,設定好傳送函式,配置一下id就完事了,接收也同樣簡單,只需濾波一下需要的id就行。但是如果是整車報文的解析就不一樣了。主要是接收方的解析。首先...

CAN匯流排 ACK應答機制分析

應答場長度為 2 個位,包含應答間隙 ack slot 和應答界定符 ack delimiter 在應答場裡,傳送站傳送兩個 隱性 位。當接收器正確地接收到有效的報文,接收器就會在應答間隙 ack slot 期間 傳送 ack 訊號 向傳送器傳送一 顯性 的位以示應答。can的傳送是個雙向互動過程,...