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