CAN為什么會發(fā)送失敗
CAN總線調(diào)試過程中出現(xiàn)報文發(fā)送失敗,很多工程師都對此只知其一不知其二,這里就CAN報文發(fā)送失敗的問題我們來做一次探討。
本文引用地址:http://butianyuan.cn/article/201707/361999.htm在了解CAN報文為什么會發(fā)送失敗之前我們先看看一條正確的CAN報文到底應(yīng)該是怎么樣的,表1是一個正常標(biāo)準(zhǔn)數(shù)據(jù)幀的報文組成。
表 1 標(biāo)準(zhǔn)數(shù)據(jù)幀報文格式組成
圖 1 標(biāo)準(zhǔn)數(shù)據(jù)幀格式
CAN總線是一種基于廣播的通訊方式,為了保證總線上的每一個正常節(jié)點(diǎn)都能正確的接收到報文,報文的發(fā)送者要求每一個接收節(jié)點(diǎn)在報文發(fā)送結(jié)束前要作出應(yīng)答,這也是報文里ACK存在的原因。
一幀CAN報文中ACK段長度為2個位,包含應(yīng)答間隙(ACK Slot)和應(yīng)答界定符(ACK Delimter)。在應(yīng)答場里,發(fā)送站發(fā)送兩個隱性位。當(dāng)接收器正確地接收到有效的報文,接收器就會在應(yīng)答間隙(ACK Slot)期間(發(fā)送ACK信號)向發(fā)送器發(fā)送一“顯性”的位以示應(yīng)答。
應(yīng)答間隙:所有接收到匹配CRC序列(CRC SEQUENCE)的站會在應(yīng)答間隙(ACK Slot)期間用一顯性的位寫入發(fā)送器的隱性位來作出回答。
應(yīng)答界定符:ACK界定符是ACK場的第二個位,并且是一個必須為隱性的位。因此,應(yīng)答間隙(ACK Slot)被兩個隱性的位所包圍,也就是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。
圖 2 正常ACK段報文
而如果總線上沒有ACK應(yīng)答(即應(yīng)答間隙為隱性),發(fā)送器就會發(fā)送一個錯誤標(biāo)志,并且發(fā)送錯誤計數(shù)器值加8,節(jié)點(diǎn)就會對報文進(jìn)行自動重發(fā),若自動重發(fā)依然收不到ACK,則在發(fā)送錯誤計數(shù)器計數(shù)滿128后(即出現(xiàn)16幀錯誤幀),由錯誤主動轉(zhuǎn)為錯誤被動狀態(tài),如圖3所示。
那導(dǎo)致ACK段出錯的原因有哪些呢?
總線上只有一個有效節(jié)點(diǎn):發(fā)送報文的節(jié)點(diǎn)在發(fā)送出一幀報文后會檢測總線上應(yīng)答間隙的狀態(tài),如果檢測到應(yīng)答間隙為隱性位,則表示該幀報文沒有得到ACK,發(fā)送失敗,需要重發(fā),而由于發(fā)送錯誤計數(shù)器會在發(fā)送失敗后累加,直到該節(jié)點(diǎn)關(guān)閉。所以,當(dāng)總線上只有一個有效節(jié)點(diǎn)時,這個節(jié)點(diǎn)是發(fā)不出去數(shù)據(jù)的,因?yàn)樗l(fā)出的數(shù)據(jù)幀中的ACK Slot沒有另外一個節(jié)點(diǎn)來填充,將永遠(yuǎn)是隱性位,這個節(jié)點(diǎn)會一直重發(fā)數(shù)據(jù)直到發(fā)送成功或發(fā)送被取消。
波特率不匹配或者節(jié)點(diǎn)沒有初始化,導(dǎo)致沒有ACK;
總線線纜短路,斷路,接反;
高速CAN總線上接的節(jié)點(diǎn)不是高速CAN,而是容錯低速CAN,導(dǎo)致不匹配。
圖 3 應(yīng)答界定符錯誤幀
圖 4 沒有ACK的報文
當(dāng)你在調(diào)試CAN總線時出現(xiàn)節(jié)點(diǎn)發(fā)送報文失敗的情況時,一定要檢查是不是以上幾點(diǎn)疏漏導(dǎo)致你的總線上ACK異常。而借助恰當(dāng)?shù)膬x器,可以在查找CAN總線錯誤時事半功倍。圖4即采用致遠(yuǎn)電子的CANScope來對錯誤幀進(jìn)行標(biāo)記,同時找到錯誤幀對應(yīng)的波形來查找出錯誤情況。CANScope還可以對CAN總線物理層、數(shù)據(jù)鏈路層、應(yīng)用層做一系列的測試,為CAN工程師解決測試難題。
圖 5 CANScope測試項目
評論