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