版本 | 頒佈日期 | 修訂章節 |
---|---|---|
0.1 | 2018.06.02 | 撰寫草稿 |
0.2 | 2018.06.16 | 整理CAN幀解析 |
0.3 | 2018.06.24 | 整理CAN幀數據類型格式 |
0.4 | 2018.07.07 | 完善CAN幀解析 |
0.5 | 2018.07.22 | 補充CAN幀類型說明 |
0.6 | 2018.08.05 | 整理CAN幀仲裁 |
0.7 | 2018.09.10 | 整理CAN處理關係 |
1.0 | 2018.09.17 | 整理CAN錯誤幀場景 |
文章目錄
CAN幀表達
CAN信號採用差分信號傳輸,通過差分電壓來表達信息。
兩條CAN線的差分電壓在某個閾值內纔是有效的,ISO11898中這個閾值爲2V(空閒2.5V CAN_H 3.5V,CAN_L 1.5V),ISO11519中,這個閾值爲3V,電平差變化時間約爲2μs
差分電壓 = CAN_H – CAN_L
差分電壓差範圍在2V時表現爲顯性,定爲邏輯0。
差分電壓差範圍在0V時表現爲隱性,定爲邏輯1。
CAN幀表示爲顯性標誌爲有效位。
位填充規則
在CAN發送幀時,爲避免總線上產生過多連續相同的電平表達(連續的顯性電平或隱性電平),導致使收發雙方失步。因此位填充確保最多5個位間就會產生反轉電平,確保發送端與接收端進行同步傳輸。錯誤幀、過載幀和幀結束之間的連續電平不需要位填充。
位填充適用範圍
幀起始、仲裁段、控制段、數據段、校驗段
CAN幀間隔(間歇場)
幀間隔用於隔離遠程幀或數據幀,但不會隔離錯誤幀和過載幀,即發送錯誤幀和過載幀不需要加入幀間隔,發送端檢測到異常後立即發送錯誤幀和過載幀。但錯誤幀和過載幀發送後後面有幀間隔
幀間隔也成爲間歇場
在幀間隔期間,所有的節點均不能發送數據幀和遠程幀。
格式:連續3個隱性電平1 + 下一幀或總線空閒電平
主動錯誤
與幀間隔形式相同
被動錯誤
被動錯誤會插入8位隱性電平的暫停段
總線空閒
當出現連續11個隱性電平以上時,認爲總線空閒
CAN幀結構
幀起始(SOF)
由一個顯性位構成,發送端發出一個顯性位,作爲CAN幀開始傳輸的標誌。
仲裁段
CAN在一條總線上傳輸,具有優先級,仲裁段就是區分幀的優先級,根據CAN2.0版本的不同,仲裁段可以分爲標準模式和擴展模式。
標準模式的幀ID爲11位,擴展模式的幀ID爲29位。
標準幀格式
擴展幀格式
RTR遠程請求幀:
數據幀:顯性電平0
遠程請求幀:隱性電平1
SRR在擴展幀中代替標準幀的RTR:
在擴展幀中表現隱性電平1
IDE擴展標誌位
標準幀:顯性電平0
擴展幀:隱性電平1
幀仲裁
顯性的優先級比隱性高,因此通過判斷仲裁端的對應的顯隱性優先級來判斷整個CAN幀的優先級。
在總線空閒時段,任何設備都可以向CAN總線發送報文。多個設備同時發送報文時,總線通過識別符的位形式仲裁進行快速進行分配。
節點的優先級被定義在仲裁段的ID中,這個ID在節點設計時就已經確定,不可更改
由於CAN總線採用非歸零(NRZ)編碼,CAN幀表達爲顯性爲有效位。當其中有一個節點向總線發送顯性0有效位時,總線整體就呈現顯性狀態,而不去呈現其他節點的隱性1位。那這些發隱性1位的節點就失去了仲裁,退出傳輸,進入監聽模式。
舉例
電平邏輯:顯性爲0,隱性爲1
節點1:0x53D——1341
節點2:0x531——1329
節點3:0x57A——1402
節點1、2在箭頭1處獲得仲裁,節點3退出仲裁,進入監聽模式;
節點2在箭頭2處獲得仲裁,節點1退出仲裁,進入監聽模式;
CAN總線通過逐幀仲裁的原理幀ID越小,幀的級別越高。
數據幀與遠程幀
在ID相同的情況下,識別遠程幀的標誌位爲RTR,RTR的電平選擇如下:
數據幀:顯性電平0
遠程請求幀:隱性電平1
因此數據幀的級別比遠程幀高。
標準幀與擴展幀
在ID相同的情況下,識別遠程幀的標誌位爲IDE,IDE的電平選擇如下:
標準幀:顯性電平0
擴展幀:隱性電平1
因此標準幀的級別比遠程幀高。
優缺點
優點:
- 實時性高,在總線仲裁哪個節點優先級高低的同時,幀控制段和數據段的有效信息已經在總線傳輸;
- 仲裁分配,獲得仲裁的節點在總線傳輸,未獲得總裁的節點不會在總線非空閒狀態發送報文;
- 優先級分配,效率高,總線通信是根據CAN幀在總線上的重要性處理的
缺點:
由於優先級不可改變,因此低優先級節點的傳輸有很大機率會被優先級高的節點打斷,發送失敗的機率變大,導致低優先級的節點延遲較高。
控制段
標準幀:
爲兼容擴展幀,標準幀有IDE位、保留位R0和數據長度DLC位組成,
IDE位和R0位都爲隱性電平1。
擴展幀:
由保留位R1、R0和數據長度DLC位組成。
R1位和R0位都爲隱性電平1。
數據長度爲DLC統計的是數據段的字節數,範圍0~8個字節。
數據段
一個完整的數據幀傳輸的數據量爲0 ~ 8個字節,對應占用0 ~ 64位,數據幀短促,使得幀傳輸時效性高。傳輸時MSB(高有效位)先傳輸。
校驗段
由15位CRC校驗值和1位CRC分隔符組成。
CRC分隔符爲隱性電平1
校驗區域:
數據幀:幀起始+幀仲裁+控制段+數據段
遠程幀:幀起始+幀仲裁+控制段
CRC校驗多項式
G(X) = X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1
應答段
由1位ACK值和1位ACK分隔符組成。ACK分隔符爲隱性電平1。
發送端的ACK爲隱性電平1,接收端回覆的ACK爲顯性電平0。
當發送端發送出CRC分隔符後,將發送兩個隱性電平的應答段。
在同一條總線上的所有除去發送端的節點,如果能夠正常校驗CRC後,都需要對該幀作出應答,即要求所有校驗CRC成功的接收節點都需要在應答段的ACK位發送一個顯性位,以應答發送端。
幀結束(EOF)
由7個連續的隱性位1組成。幀結束強制不遵守位填充特性,表達出明顯的結束標識,承接總線空閒。
CAN幀類型
數據幀
承載着數據的CAN幀,絕大多數的幀都是數據幀。
標準幀:
擴展幀:
遠程幀
也稱請求幀,當CAN端需要接收或發送某個數據時,先行發送遠程幀(請求幀),通知該節點準備發送數據或接收數據。
總線單元發送ID號與數據幀相同的幀,請求該ID號的數據幀。接收端鑑別遠程幀進行初始化的設置,接收到遠程幀之後,接收端就進入發送數據幀準備。
標準幀:
擴展幀:
錯誤幀
錯誤類型
儘管CAN的實時性和可靠性很高,但在現實中發送時也會會出現錯誤,CAN節點產生的錯誤類型有以下5種
- CRC校驗錯誤:接收端收到的CRC值與計算的CRC值不一致;
- 格式錯誤:傳輸的CAN幀不符合標準CAN幀格式;
- 無應答:發送端沒有收到接收端的ACK應答信號;
- 位發送錯誤:發送端監聽到總線上的電平與自己發送電平不符;
- 位填充錯誤:CAN總線上傳輸的信號違反位填充規則,出現6個連續相同的位。
在仲裁段,應答ack,被動錯誤標誌期間不會導致位發送錯誤。
幀格式:錯誤標誌+錯誤分隔符
錯誤分隔符:連續8個隱性電平1
發送端監聽:格式錯誤、無應答、位發送錯誤
接收端監聽:格式錯誤、CRC校驗錯誤、位填充錯誤
發送錯誤幀時不用插入幀間隔。
只要在總線上的節點,都會在監聽報文中出現的錯誤類型。只要監聽到錯誤,處於主動模式的節點就會發送錯誤幀,強制結束通信。也許有其他節點沒有監聽到出錯的標識(可能是線路過長或干擾引起的錯誤),但由於有一個主動節點發出了錯誤幀,就必然監聽到錯誤,並且也會發送錯誤幀。
因此所有在總線上的節點都會有發送出錯誤幀的體現。發送端在發送的同時也在監聽總線,其他監聽的節點在監聽到錯誤幀後,接收錯誤計數器加1,發送節點發送錯誤計數器加8。
當總線上體現出錯誤幀後,總線空閒時,發送端將會重新發送上一幀。
主動錯誤幀
主動錯誤幀格式,錯誤幀強制不遵守位填充特性,表達出明顯的錯誤標識。
錯誤標誌,連續6個顯性電平0
CAN正常通信狀態下發送的錯誤,比較明顯的就是連續發送6個顯性電平0,強制破壞掉總線當前的通訊狀態,表現強烈的主動發送錯誤意識。由於總線上其他的節點監聽到錯誤後也會發送主動錯誤幀或者存在發送時間差,因此主動錯誤幀有一個疊加範圍,最多有連續12個顯性電平。
被動錯誤幀
當節點的錯誤計數過多時(超過127次),節點再次檢測到錯誤就會進入被動錯誤狀態,節點連續的6個隱性電平和分隔符的8個隱性電平強制讓總線進入靜默狀態,沒有應答,讓發送端在監聽應答時發現接收端出現的被動錯誤。
由於總線保護機制,節點的錯誤計數過多可能是總線本身通信不穩定,也可能是節點自身問題,甚至是計數器自身故障。因此發送隱性電平的錯誤幀,不影響總線上其他節點的通信。
被動錯誤幀格式
錯誤標誌,連續6個隱性電平1,同樣被動錯誤幀也有一個疊加範圍,最多有連續12個隱性電平。
由於節點處於被動模式,被動錯誤幀都爲隱性電平,若總線上有處於主動錯誤模式的節點會發出主動錯誤幀。因此發送被動錯誤幀的節點必須監聽到總線存在等於或大於連續6個相同的極性電平後,才被認爲被動錯誤幀發出。
出錯場景
1、發送端檢測到位發送錯誤
發送端檢測到無應答(發送錯誤)
無應答原因:
發送端CRC錯誤,導致除發送端外所有節點CRC校驗失敗;
除發送端外所有節點處於被動模式,檢測到錯誤,發送被動錯誤幀;
除發送端外所有節點接收數據正常,但自身硬件錯誤;
總線只有發送端一個節點,(或者除發送端外所有節點總線關閉);
2、節點監控到格式錯誤
3、單個接收端檢測到CRC校驗錯誤
錯誤統計
發送錯誤計數器:Transmit Error Counter(TEC)
接收錯誤計數器:Receive Error Counter(REC)
CAN節點控制器內置發送(TX)和接收(RX)錯誤計數器,根據出錯是全局的還是本地的,計數器以此決定加1還是加8;
發送錯誤,發送錯誤計數器加8,
接收錯誤,總線上所有節點監聽到主動錯誤幀時,接收錯誤計數器加1,節點接收時檢測到錯誤,接收錯誤計數器加8
接收正確,發送/接收錯誤計數器減1,
當總線上的節點監聽到錯誤幀時,接收錯誤計數器加1;
當節點發送失敗時,發送錯誤計數器就會加8。
計數規則:
監聽到總線上有錯誤幀時,REC 計數加1,但檢測到錯誤標識符或過載標識符中的位錯誤除外;
接收端發送完錯誤幀後檢測到總線的第一位爲顯性電平REC加8
發送端主動發出錯誤幀時(格式錯誤、位發送錯誤、位填充錯誤(仲裁段除外)),TEC加8,檢測到無應答而發出的錯誤幀TEC不變。
發送端發送主動錯誤幀或過載幀時,檢測到位錯誤TEC加8
接收端發送主動錯誤幀或過載幀時,檢測到位錯誤REC加8
節點監聽主動錯誤幀、被動錯誤幀或過載幀時連續監聽到14個顯性標誌位;被動錯誤幀後監聽到8個顯性標誌位;被動錯誤標誌後緊跟着連續8個顯性標誌位。所有節點的REC和TEC加8
發送端成功發送一幀報文,TEC減1,直到TEC爲0
接收端成功接收一幀報文,若REC < 127,REC減1;若REC > 127 REC = 127
處於總線關閉的節點,檢測到連續的11個隱性標誌位連續出現128次,
REC = 0,TEC = 0,節點變爲主動錯誤模式。
錯誤處理
通過查詢出錯計數器值,能通俗的體現出通信網絡質量。通過統計錯誤的次數,切換自身在總線中的錯誤狀態,確保不會因爲自身CAN節點錯誤的原因而導致干擾整套CAN網絡的通信。
當發送和接收錯誤計數器的任何一方累計出錯統計達到一定數目時,就會觸發CAN端對計數次數的處理
錯誤次數統計:
0~127次: 節點發送主動錯誤幀狀態,在到達96次時,體現通信質量較差;
128~254次:節點發送進入被動幀錯誤狀態;
255次: 節點主動脫離總線,處於總線關閉狀態。
CAN的錯誤處理就是監聽總線上出現的CAN幀出錯的類型,做到及時統計,對相應的錯誤進行處理,如發送主動錯誤和被動錯誤以及自動斷開總線。
錯誤狀態
CAN節點發送錯誤幀的狀態有以下三種:
- 主動錯誤:節點發送主動錯誤幀,破壞總線正在傳輸的幀;
- 被動錯誤:節點發送被動錯誤幀,不影響總線上其他節點的通訊;
- 總線關閉:節點停止收發幀,該節點脫離總線,不再工作,且只有在硬件復位後,才能恢復工作狀態。
假設有一個節點,主動/被動錯誤計數器都爲0。
若該節點發送報文失敗,可能是總線受干擾,或者是仲裁失敗,或者是發送後收到接收端的錯誤幀。那在失敗時,發送計數器加8,並重新監聽總線空閒狀態,以便下次再重新發送報文。
在傳輸途中,該節點處於主動錯誤模式,監聽到總線錯誤時將會發送主動錯誤幀。
當發送/接收錯誤計數器超過128次時,該節點進入被動錯誤模式。監聽到錯誤時進入靜默狀態,即發送被動錯誤幀。不影響總線上其他節點的通信,其他節點的接收錯誤計數器不會加1。
當發送/接收錯誤計數器超過255時,總線關閉模式。不再往總線上發送報文。
總線關閉下的節點,只有在節點重啓或監聽到連續的11個隱性位達到128次時纔會恢復成主動錯誤模式,收發錯誤計數器清零。
錯誤狀態轉換圖:
過載幀
接收端由於接收能力有限,或自身已經達到極限時,向總線報告的幀,以延遲下一幀數據幀或遠程幀的發送,表示設備忙碌。
出現接收端發送過載幀有以下情況
- 接收端自身原因,沒有準備好接收下一幀,接收端在接收每一幀之間有個延時;
- 監聽到幀間隔間有顯性電平0;(意味着有下一幀報文,但此時監聽的是幀間隔時期,不應該有報文發送,因此發送過載幀,阻斷這幀報文);
- 監聽到錯誤分隔符或過載分隔符的低8位有顯性電平;(CAN幀規則,必須至少是連續的8個隱性電平,但在錯誤處理中不會增加錯誤計數)
強制不遵守位填充特性,表達出明顯的過載標識。
如在處理廣播幀時,當其中一個接收端自身能力達到極限,會發送過載幀,連續6個顯性電平會強制打斷總線上的幀傳輸,讓發送端從新發送該幀,以達到延遲的目的。
發送過載幀時不用插入幀間隔。