CAN-bus的可靠性很高,但是在某些情況下還是發(fā)生錯(cuò)誤,為了使數(shù)據(jù)能夠在總線上可靠傳輸,CAN-bus規(guī)范對(duì)各類幀的格式、用途及發(fā)送時(shí)機(jī)都進(jìn)行了詳細(xì)的規(guī)定。并實(shí)現(xiàn)在CAN控制器中自動(dòng)完成幀格式處理及校驗(yàn)等工作,一旦錯(cuò)誤被檢測(cè),正在傳送的數(shù)據(jù)幀將會(huì)立即停止而待總線空閑時(shí)再次重發(fā)直至發(fā)送成功,該過程并不需要CPU的干涉除非錯(cuò)誤累計(jì)該發(fā)送器退隱(Bus off)。
CAN-bus的可靠性很高,但是在某些情況下還是發(fā)生錯(cuò)誤,為了使數(shù)據(jù)能夠在總線上可靠傳輸,CAN-bus規(guī)范對(duì)各類幀的格式、用途及發(fā)送時(shí)機(jī)都進(jìn)行了詳細(xì)的規(guī)定。下面我們來總結(jié)下在CAN通訊中會(huì)出現(xiàn)哪些錯(cuò)誤。
位錯(cuò)誤:發(fā)送節(jié)點(diǎn)在發(fā)送數(shù)據(jù)的同時(shí)也會(huì)對(duì)發(fā)出的比特流采樣回收,如果監(jiān)測(cè)到總線電平與正在發(fā)送的電平不符,將會(huì)發(fā)生位錯(cuò)誤(Bit Check Error);
位填充錯(cuò)誤:為解決異步串行通訊中共有的缺點(diǎn)——各節(jié)點(diǎn)通訊時(shí)鐘不同步,CAN-bus采用了一種同步的方式,規(guī)定每隔5個(gè)位的時(shí)間長(zhǎng)度進(jìn)行一次同步,當(dāng)傳輸信號(hào)連續(xù)5個(gè)位是相同的,就要插入一個(gè)點(diǎn)評(píng)相反的位(稱為“填充位”),如果電纜上傳輸?shù)男盘?hào)不滿足這一規(guī)則,則會(huì)出現(xiàn)填充位錯(cuò)誤(Bit Stuff Error);
CRC錯(cuò)誤:發(fā)送端發(fā)送的CRC值由發(fā)送器計(jì)算得出,接收器采用同樣的CRC算法,計(jì)算出接收端CRC值,若接收器計(jì)算的CRC值與接收到的CRC值不符,將會(huì)產(chǎn)生該類錯(cuò)誤(CRC Error);
格式錯(cuò)誤:當(dāng)傳輸?shù)臄?shù)據(jù)幀格式與任何一種合法的幀格式不符時(shí)會(huì)發(fā)生該類格式錯(cuò)誤(frame Check Error);
應(yīng)答錯(cuò)誤:如果在ACK段發(fā)送節(jié)點(diǎn)沒有接收到接收節(jié)點(diǎn)發(fā)出的應(yīng)答(顯性位),將發(fā)生應(yīng)答錯(cuò)誤(Acknowledgment Error),所以當(dāng)單個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)幀時(shí)會(huì)發(fā)生該類錯(cuò)誤。
錯(cuò)誤幀在總線信號(hào)傳輸中起著信號(hào)燈的作用,接收和發(fā)送過程中如果檢測(cè)到通信出錯(cuò),便會(huì)發(fā)送錯(cuò)誤幀,錯(cuò)誤幀由錯(cuò)誤標(biāo)識(shí)符以及錯(cuò)誤界定符構(gòu)成。其中錯(cuò)誤標(biāo)識(shí)符分為兩種:“主動(dòng)錯(cuò)誤”和“被動(dòng)錯(cuò)誤”。
主動(dòng)錯(cuò)誤狀態(tài)下,只要檢查到錯(cuò)誤,它立即“主動(dòng)地”發(fā)出錯(cuò)標(biāo)識(shí)。所謂“出錯(cuò)標(biāo)識(shí)“,它本身就是一個(gè)“錯(cuò)誤的位序列”(連續(xù)的6個(gè)顯性位,不滿足CAN協(xié)議的“zui多5個(gè)連續(xù)的同性位”要求),目的是“主動(dòng)地”告訴大家:即使你們沒有發(fā)現(xiàn)“剛才我已發(fā)現(xiàn)”的錯(cuò)誤,現(xiàn)在我“以身作則”出錯(cuò)啦!你們?cè)摽吹竭@個(gè)錯(cuò)誤了吧!
如果處于被動(dòng)狀態(tài)下,檢查到錯(cuò)誤,它只能干瞪眼“被動(dòng)地”等別人(主動(dòng)報(bào)錯(cuò)站點(diǎn))報(bào)錯(cuò),等待的時(shí)候它可不能去動(dòng)總線,直到識(shí)別出由主動(dòng)報(bào)錯(cuò)站點(diǎn)發(fā)出 的“錯(cuò)誤的位序列”,它才松了一口氣:有人正式報(bào)錯(cuò)了!然后他就可以去競(jìng)爭(zhēng)總線,該干啥干啥。
為了避免某個(gè)設(shè)備因?yàn)樽陨碓颍ɡ缬布p壞)導(dǎo)致無法正常收發(fā)數(shù)據(jù)而不斷地破壞數(shù)據(jù)幀,從而影響其他正常節(jié)點(diǎn)通訊,CAN-bus規(guī)范中規(guī)定每個(gè)CAN控制器都有一個(gè)發(fā)送錯(cuò)誤計(jì)數(shù)器和一個(gè)接收計(jì)數(shù)器。根據(jù)計(jì)數(shù)值不同CAN節(jié)點(diǎn)會(huì)處于不同的設(shè)備狀態(tài),狀態(tài)之間的轉(zhuǎn)換關(guān)系見下圖: