?來(lái)源:車(chē)端?初光??
1 CAN總線(xiàn)錯(cuò)誤類(lèi)型
為了防止故障節(jié)點(diǎn)干擾甚至阻塞整個(gè)CAN網(wǎng)絡(luò)系統(tǒng),CAN協(xié)議實(shí)現(xiàn)了復(fù)雜的故障限制機(jī)制。為了保證通信的正常,CAN 2.0 總線(xiàn)協(xié)議總線(xiàn)中各節(jié)點(diǎn)需要采取以下措施進(jìn)行錯(cuò)誤檢測(cè):
監(jiān)視(對(duì)發(fā)送位的電平與被監(jiān)控的總線(xiàn)電平進(jìn)行比較)
循環(huán)冗余檢查
位填充
報(bào)文格式檢查
CAN協(xié)議具有檢測(cè)錯(cuò)誤的能力。但是如果發(fā)生錯(cuò)誤,它無(wú)法糾正錯(cuò)誤。因此,如果發(fā)生錯(cuò)誤,檢測(cè)到的節(jié)點(diǎn)或ECU將向CAN網(wǎng)絡(luò)發(fā)送錯(cuò)誤幀。與之相對(duì)應(yīng)的CAN 2.0 總線(xiàn)協(xié)議定義參與通信的CAN節(jié)點(diǎn)錯(cuò)誤類(lèi)型如下:
位錯(cuò)誤(Bit Error) 發(fā)送的位值和總線(xiàn)監(jiān)視的位值不相符合時(shí),檢測(cè)到一個(gè)位錯(cuò)誤(除仲裁場(chǎng)、應(yīng)答場(chǎng)外);
填充錯(cuò)誤(Stuff Error)
如果在使用位填充編碼的位流中,出現(xiàn)了第六個(gè)連續(xù)相同的位電平,將檢測(cè)到一個(gè)位填充錯(cuò)誤;
形式錯(cuò)誤 (Form Error)
當(dāng)一個(gè)固定形式的位場(chǎng)含有一個(gè)或多個(gè)非法位時(shí),將檢測(cè)到一個(gè)形式錯(cuò)誤;
應(yīng)答錯(cuò)誤 (Acknowledgment Error)
在應(yīng)答間隙(ACK SLOT)所監(jiān)視的位不為“顯性”,則會(huì)檢測(cè)到一個(gè)應(yīng)答錯(cuò)誤;
CRC 錯(cuò)誤(CRC Error)
如果接收器的CRC結(jié)果和發(fā)送器的CRC結(jié)果不同,將檢測(cè)到一個(gè)CRC錯(cuò)誤。
2 CAN總線(xiàn)錯(cuò)誤處理機(jī)制
每個(gè)CAN控制器都有自己的CAN總線(xiàn)錯(cuò)誤處理程序。為了處理這個(gè)問(wèn)題,每個(gè)CAN控制器有兩個(gè)計(jì)數(shù)器寄存器(0 – 255),即:發(fā)送錯(cuò)誤計(jì)數(shù)器 (TEC) 和接收錯(cuò)誤計(jì)數(shù)器 (REC) 。如果5個(gè)錯(cuò)誤中發(fā)生任何一個(gè)發(fā)生錯(cuò)誤,它將根據(jù)錯(cuò)誤類(lèi)型增加 TEC 或 REC。Tips:一個(gè)特例:如果CAN總線(xiàn)上只有一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)發(fā)送數(shù)據(jù)幀后得不到響應(yīng)(ACK),其發(fā)送計(jì)數(shù)器TEC最大只能計(jì)到128,即該節(jié)點(diǎn)只能進(jìn)入錯(cuò)誤被動(dòng)狀態(tài),而不會(huì)進(jìn)入總線(xiàn)關(guān)閉狀態(tài),這就是為什么當(dāng)您沒(méi)有將任何設(shè)備連接到網(wǎng)絡(luò)時(shí),您的ECU將持續(xù)發(fā)送幀,但不會(huì)檢測(cè)到總線(xiàn)關(guān)閉并保持錯(cuò)誤被動(dòng)狀態(tài)。
錯(cuò)誤計(jì)數(shù)器的遞增和遞減操作是不對(duì)稱(chēng)的。在成功傳輸或接收消息時(shí),如果相應(yīng)的錯(cuò)誤計(jì)數(shù)器未為零,則相應(yīng)的錯(cuò)誤計(jì)數(shù)器將遞減。在傳輸或接收錯(cuò)誤的情況下,計(jì)數(shù)器將遞增,但遞增值大于遞減值。具體錯(cuò)誤限制管理規(guī)則如下:
a) 當(dāng)接收器檢測(cè)到錯(cuò)誤時(shí),接收錯(cuò)誤計(jì)數(shù)器REC+ 1。例外:發(fā)送活動(dòng)錯(cuò)誤標(biāo)志、過(guò)載標(biāo)志期間的位錯(cuò)誤。
b) 當(dāng)接收器在發(fā)送錯(cuò)誤標(biāo)志后檢測(cè)到顯性位作為第一位時(shí),接收錯(cuò)誤計(jì)數(shù)器REC+8。
c) 當(dāng)發(fā)送器發(fā)送錯(cuò)誤標(biāo)志時(shí),發(fā)送錯(cuò)誤計(jì)數(shù)器REC+8。
?
1) 例外 1:如果發(fā)送器是錯(cuò)誤被動(dòng)狀態(tài),并且由于未檢測(cè)到顯性 ACK 而檢測(cè)到 ACK 錯(cuò)誤,并且在發(fā)送其被動(dòng)錯(cuò)誤標(biāo)志時(shí)未檢測(cè)到顯性位。 2) 例外 2:如果發(fā)送方因?yàn)橹俨闷陂g發(fā)生填充錯(cuò)誤而發(fā)送錯(cuò)誤標(biāo)志,因此,填充位應(yīng)該是隱性的,并且已作為隱性發(fā)送但被監(jiān)視為主導(dǎo)的。 在這兩種例外情況下,傳輸錯(cuò)誤計(jì)數(shù)器保持不變。
?
d) 如果發(fā)送器在發(fā)送活動(dòng)錯(cuò)誤標(biāo)志或過(guò)載標(biāo)志時(shí)檢測(cè)到位錯(cuò)誤,則發(fā)送錯(cuò)誤計(jì)數(shù)器TEC+8。
e) 如果接收器在發(fā)送活動(dòng)錯(cuò)誤標(biāo)志或過(guò)載標(biāo)志時(shí)檢測(cè)到位錯(cuò)誤,則接收錯(cuò)誤計(jì)數(shù)器TEC+8。
f) 在發(fā)送活動(dòng)錯(cuò)誤標(biāo)志、被動(dòng)錯(cuò)誤標(biāo)志或過(guò)載標(biāo)志后,任何節(jié)點(diǎn)都應(yīng)容忍最多7 個(gè)連續(xù)顯性位。在檢測(cè)到第14個(gè)連續(xù)顯性位后(在活動(dòng)錯(cuò)誤標(biāo)志或過(guò)載標(biāo)志的情況下)或在被動(dòng)錯(cuò)誤標(biāo)志后檢測(cè)到第 8 個(gè)連續(xù)顯性位之后,并且每當(dāng)在出現(xiàn)額外的8個(gè)連續(xù)顯性位序列之后,REC和TEC都需要+8。
g) 成功傳輸一個(gè)幀后(收到 ACK 并且沒(méi)有檢測(cè)到錯(cuò)誤,直到 EOF 被檢測(cè)到完成),傳輸錯(cuò)誤計(jì)數(shù)器應(yīng)減1,直到為0。
h) 成功接收一個(gè)幀后(接收到 ACK 時(shí)隙沒(méi)有錯(cuò)誤并且成功ACK 位的發(fā)送),接收錯(cuò)誤計(jì)數(shù)器應(yīng)減 1,如果它介于1和127。如果接收錯(cuò)誤計(jì)數(shù)器為0,則應(yīng)保持為零 (0),如果它大于127,則應(yīng)將其設(shè)置為介于119和127。
3 什么是CAN協(xié)議中的故障限制
故障限制是一種檢查機(jī)制,可以區(qū)分短時(shí)干擾(例如電纜的噪聲耦合到傳輸介質(zhì))和永久性故障(例如,節(jié)點(diǎn)發(fā)生故障并干擾總線(xiàn)). CAN通信節(jié)點(diǎn)的狀態(tài)分為暫時(shí)錯(cuò)誤(Error active和Error Passive)和永久性故障(Bus Off);
永久性故障節(jié)點(diǎn)自動(dòng)脫離總線(xiàn),防止網(wǎng)絡(luò)鎖定;Bus Off恢復(fù)需要滿(mǎn)足于以下兩個(gè)條件:
在bus off發(fā)生后,總線(xiàn)上已經(jīng)檢測(cè)到了128次11個(gè)連續(xù)的隱性位(邏輯"1");
用戶(hù)程序請(qǐng)求恢復(fù),通常MCU中的CAN控制器都可以支持自動(dòng)恢復(fù)和手動(dòng)恢復(fù)兩種方式。CAN總線(xiàn)的bus off恢復(fù)需要滿(mǎn)足整車(chē)的網(wǎng)絡(luò)管理規(guī)范。
處于暫時(shí)錯(cuò)誤(Error active和Error Passive)狀態(tài)的CAN 2.0總線(xiàn)節(jié)點(diǎn),其狀態(tài)可以根據(jù)其發(fā)送錯(cuò)誤計(jì)數(shù)器(TEC)和接收錯(cuò)誤計(jì)數(shù)器(REC)值的變化,自動(dòng)切換,而進(jìn)入永久性故障(Bus Off))狀態(tài)的節(jié)點(diǎn),必須進(jìn)入重新初始化才能恢復(fù):
因此,節(jié)點(diǎn)可能處于以下三種可能的錯(cuò)誤狀態(tài)之一:
錯(cuò)誤活動(dòng)狀態(tài)。錯(cuò)誤被動(dòng)狀態(tài)。錯(cuò)誤總線(xiàn)關(guān)閉狀態(tài)。
1. CAN協(xié)議中的錯(cuò)誤主動(dòng)狀態(tài)
當(dāng)CAN設(shè)備通電時(shí),它以錯(cuò)誤活動(dòng)狀態(tài)啟動(dòng)。處于錯(cuò)誤活動(dòng)狀態(tài)的設(shè)備通??梢詤⑴cCAN通信。它還會(huì)在檢測(cè)到錯(cuò)誤時(shí)傳輸主動(dòng)錯(cuò)誤標(biāo)志。此主動(dòng)錯(cuò)誤標(biāo)志(表示主導(dǎo) 0 位序列)會(huì)導(dǎo)致當(dāng)前幀傳輸中止,從而導(dǎo)致同一消息的后續(xù)重新傳輸。
其中兩個(gè)錯(cuò)誤計(jì)數(shù)器(TEC 和 REC)在錯(cuò)誤活動(dòng)狀態(tài)下都小于 128。它完全參與總線(xiàn)通信,并通過(guò)傳輸活動(dòng)錯(cuò)誤幀來(lái)發(fā)出錯(cuò)誤信號(hào)。這包括 6 個(gè)主導(dǎo)位的序列,后跟 8 個(gè)隱性位,所有其他節(jié)點(diǎn)都使用適當(dāng)?shù)腻e(cuò)誤標(biāo)志進(jìn)行響應(yīng),以響應(yīng)違反位填充規(guī)則。
2. CAN協(xié)議中的錯(cuò)誤被動(dòng)狀態(tài)
如果發(fā)送錯(cuò)誤計(jì)數(shù)器或接收錯(cuò)誤計(jì)數(shù)器大于127,CAN設(shè)備將進(jìn)入錯(cuò)誤被動(dòng)狀態(tài)。處于錯(cuò)誤被動(dòng)狀態(tài)的設(shè)備仍然可以參與通信,但在檢測(cè)到任何錯(cuò)誤時(shí)會(huì)傳輸被動(dòng)錯(cuò)誤標(biāo)志。此被動(dòng)錯(cuò)誤標(biāo)志(隱性 1 位序列)通常不會(huì)中止其他設(shè)備(如錯(cuò)誤主動(dòng)幀)傳輸?shù)膸?/p>
此外,錯(cuò)誤被動(dòng)節(jié)點(diǎn)必須在消息傳輸后等待額外的時(shí)間(Suspend Transmission Field,ITM后的 8 個(gè)隱性位),然后才能啟動(dòng)新數(shù)據(jù)。
3. CAN協(xié)議中的總線(xiàn)關(guān)閉狀態(tài)
如果CAN控制器的發(fā)送誤差計(jì)數(shù)器超過(guò)255,則進(jìn)入總線(xiàn)關(guān)閉狀態(tài)。它與總線(xiàn)斷開(kāi)連接(使用內(nèi)部邏輯),不再參與總線(xiàn)活動(dòng)。簡(jiǎn)單地說(shuō),我們可以說(shuō)物理上與總線(xiàn)連接和邏輯上斷開(kāi)連接。為了重新連接協(xié)議控制器,必須執(zhí)行Bus Off recovery sequence。這通常涉及主機(jī)系統(tǒng)對(duì)CAN控制器的重新初始化和配置,之后它將等待(128 * 11)隱性位時(shí)間,然后再開(kāi)始通信。
審核編輯:湯梓紅
評(píng)論