CAN總線調(diào)試過(guò)程中出現(xiàn)報(bào)文發(fā)送失敗。很多工程師都對(duì)此只知其一不知其二,今天我們就以CAN報(bào)文發(fā)送失敗的問(wèn)題來(lái)做一次探討。
在了解CAN報(bào)文為什么會(huì)發(fā)送失敗之前我們先看看一幀標(biāo)準(zhǔn)的CAN報(bào)文到底應(yīng)該是怎么樣的。表1是一幀正常標(biāo)準(zhǔn)數(shù)據(jù)幀的報(bào)文組成。
表1 標(biāo)準(zhǔn)數(shù)據(jù)幀報(bào)文格式組成

圖1 標(biāo)準(zhǔn)數(shù)據(jù)幀格式CAN總線是一種基于廣播的通訊方式,為了保證總線上的每一個(gè)正常節(jié)點(diǎn)都能正確的接收到報(bào)文,報(bào)文的發(fā)送者要求至少一個(gè)接收節(jié)點(diǎn)在報(bào)文發(fā)送結(jié)束前要作出應(yīng)答,這也是報(bào)文里ACK存在的原因。
一幀CAN報(bào)文中ACK段長(zhǎng)度為2個(gè)位,包含應(yīng)答間隙(ACK Slot)和應(yīng)答界定符(ACK Delimter)。在應(yīng)答場(chǎng)里,發(fā)送器發(fā)送兩個(gè)隱性位。當(dāng)接收器正確地接收到有效的報(bào)文,接收器就會(huì)在應(yīng)答間隙(ACK Slot)期間(發(fā)送ACK信號(hào))向發(fā)送器發(fā)送一“顯性”的位以示應(yīng)答。
應(yīng)答間隙:所有接收到匹配CRC序列(CRC SEQUENCE)的站會(huì)在應(yīng)答間隙(ACK Slot)期間用一顯性的位寫入發(fā)送器的隱性位來(lái)作出回答。
應(yīng)答界定符:ACK界定符是ACK場(chǎng)的第二個(gè)位,并且是一個(gè)必須為隱性的位。因此,應(yīng)答間隙(ACK Slot)被兩個(gè)隱性的位所包圍,也就是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。

圖2 正常ACK段報(bào)文
而如果總線上沒(méi)有ACK應(yīng)答(即應(yīng)答間隙為隱性),發(fā)送器就會(huì)發(fā)送一個(gè)錯(cuò)誤標(biāo)志,并且發(fā)送錯(cuò)誤計(jì)數(shù)器值加8,節(jié)點(diǎn)就會(huì)對(duì)報(bào)文進(jìn)行自動(dòng)重發(fā),若自動(dòng)重發(fā)依然收不到ACK,則在發(fā)送錯(cuò)誤計(jì)數(shù)器計(jì)數(shù)滿128后(即出現(xiàn)16幀錯(cuò)誤幀),由錯(cuò)誤主動(dòng)轉(zhuǎn)為錯(cuò)誤被動(dòng)狀態(tài),如圖3所示。那導(dǎo)致ACK段出錯(cuò)的原因有哪些呢?下面小編總結(jié)了一些。
- 總線上只有一個(gè)有效節(jié)點(diǎn):發(fā)送報(bào)文的節(jié)點(diǎn)在發(fā)送出一幀報(bào)文后會(huì)檢測(cè)總線上應(yīng)答間隙的狀態(tài),如果檢測(cè)到應(yīng)答間隙為隱性位,則表示該幀報(bào)文沒(méi)有得到ACK,發(fā)送失敗,需要重發(fā),而由于發(fā)送錯(cuò)誤計(jì)數(shù)器會(huì)在發(fā)送失敗后累加,直到該節(jié)點(diǎn)關(guān)閉。所以,當(dāng)總線上只有一個(gè)有效節(jié)點(diǎn)時(shí),這個(gè)節(jié)點(diǎn)是發(fā)不出去數(shù)據(jù)的,因?yàn)樗l(fā)出的數(shù)據(jù)幀中的ACK Slot沒(méi)有另外一個(gè)節(jié)點(diǎn)來(lái)填充,將永遠(yuǎn)是隱性位,這個(gè)節(jié)點(diǎn)會(huì)一直重發(fā)數(shù)據(jù)直到發(fā)送成功或發(fā)送被取消。
- 波特率不匹配或者節(jié)點(diǎn)沒(méi)有初始化,導(dǎo)致沒(méi)有ACK;
- 總線線纜短路,斷路,接反;
- 高速CAN總線上接的節(jié)點(diǎn)不是高速CAN,而是容錯(cuò)低速CAN,導(dǎo)致不匹配。

圖3 應(yīng)答界定符錯(cuò)誤幀
圖4 沒(méi)有ACK的報(bào)文
當(dāng)你在調(diào)試CAN總線時(shí)出現(xiàn)節(jié)點(diǎn)發(fā)送報(bào)文失敗的情況時(shí),一定要檢查是不是以上幾點(diǎn)疏漏導(dǎo)致你的總線上ACK異常。而借助恰當(dāng)?shù)膬x器,可以在查找CAN總線錯(cuò)誤時(shí)事半功倍。圖4即采用致遠(yuǎn)電子的CANScope來(lái)對(duì)錯(cuò)誤幀進(jìn)行標(biāo)記,同時(shí)找到錯(cuò)誤幀對(duì)應(yīng)的波形來(lái)查找出錯(cuò)誤情況。CANScope還可以對(duì)CAN總線物理層、數(shù)據(jù)鏈路層、應(yīng)用層做一系列的測(cè)試,為CAN工程師解決測(cè)試難題。

圖5 CANScope測(cè)試項(xiàng)目
-
CAN總線
+關(guān)注
關(guān)注
146文章
2050瀏覽量
135472 -
數(shù)據(jù)幀
+關(guān)注
關(guān)注
0文章
49瀏覽量
7135 -
can報(bào)文
+關(guān)注
關(guān)注
0文章
4瀏覽量
2442
發(fā)布評(píng)論請(qǐng)先 登錄
AT32各版本CAN控制器差異與代碼移植
CAN總線報(bào)錯(cuò)看不懂?5種錯(cuò)誤幀+5步排查法一次講清
中科芯CKS32F107XX系列MCU的bxCAN介紹
使用 g430 的 CAN 功能進(jìn)行組網(wǎng)
AT32F系列 CAN通訊模式使用
CAN盒通訊失敗的常見(jiàn)原因
廣成科技藍(lán)牙轉(zhuǎn)CAN模塊的作用和應(yīng)用場(chǎng)景
如何同時(shí)指定can硬件濾波器的只接收id為0 和id為3的報(bào)文呢?
CAN發(fā)送只能使用中斷或者DMA,為什么?
移植CANfestival,發(fā)現(xiàn)can無(wú)法接收數(shù)據(jù),為什么?
ProfiNet轉(zhuǎn)CAN/CANopen網(wǎng)關(guān)技術(shù)詳解
【中科昊芯Core_DSC280025C開(kāi)發(fā)板試用體驗(yàn)】+4. CAN外設(shè)調(diào)試(含源碼)
車載 CAN-Bus 數(shù)據(jù)記錄儀
如何解決CAN通訊故障?原因分析與解決方法全攻略
ATS失效請(qǐng)求報(bào)文問(wèn)題的故障排除步驟
CAN報(bào)文為什么會(huì)發(fā)送失敗?
評(píng)論