CAN總線通信機(jī)制

介紹

在汽車產(chǎn)業(yè)中,各種各樣的ECU被開發(fā)出來,來提高汽車的安全性、舒適性、方便性,同時滿足對低公害、低成本的要求。但各個電控系統(tǒng)對通信的數(shù)據(jù)類型、時效性、可靠性要求不盡相同。如果按照常規(guī)的點對點布線方式,那么有多條總線構(gòu)成的情況很多,線束數(shù)量也隨之增加。

點對點通信

為了減少線束數(shù)量,通過多個LAN,進(jìn)行大量數(shù)據(jù)的高速通信的需要,1986年德國電氣商博世公司開發(fā)出面向汽車的CAN通信協(xié)議。并通過ISO11898 及ISO11519 進(jìn)行了標(biāo)準(zhǔn)化。

總線通信

現(xiàn)在,CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面。被譽(yù)為自動化領(lǐng)域的計算機(jī)局域網(wǎng)。它的出現(xiàn)為分布式控制系統(tǒng)實現(xiàn)各節(jié)點之間實時、可靠的數(shù)據(jù)通信提供了強(qiáng)有力的技術(shù)支持。

CAN總線是一種多主控的總線系統(tǒng),在網(wǎng)絡(luò)空閑時,接入網(wǎng)絡(luò)的單元節(jié)點都可以發(fā)送數(shù)據(jù)。當(dāng)兩個以上單元同時開始發(fā)送消息時,根據(jù)標(biāo)識符(ID)決定優(yōu)先級。

CAN網(wǎng)絡(luò)的消息是廣播式的,同一時刻網(wǎng)絡(luò)上的所有單元節(jié)點讀取到的數(shù)據(jù)是相同的,是一種基于消息廣播的串行通信總線。

通信機(jī)制與特性

CAN總線標(biāo)準(zhǔn)中規(guī)定的硬件控制層面包括物理層和數(shù)據(jù)鏈路層,至于軟件應(yīng)用層需要用戶自定義。

下面對核心的物理層和數(shù)據(jù)鏈路層進(jìn)行介紹。


CAN物理層

不同的CAN總線標(biāo)準(zhǔn)只在物理層有所不同。
CAN總線上連接了不同的設(shè)備(單元節(jié)點),CAN網(wǎng)絡(luò)的拓?fù)湟话銥榫€型。線束最常用的是非屏蔽雙絞線,線上傳輸為對稱的差分電平信號。

CAN總線節(jié)點示意圖

如上圖,一個節(jié)點主要包括Host、控制器和收發(fā)器三部分。CAN收發(fā)器將控制器設(shè)備連接到總線上。在發(fā)送數(shù)據(jù)時,CAN控制器將要發(fā)送的二進(jìn)制編碼發(fā)送給CAN收發(fā)器,然后由收發(fā)器把這個普通的邏輯電平信號轉(zhuǎn)化為差分信號,通過差分線CAN_High和CAN_Low輸出到CAN總線網(wǎng)絡(luò)上。接受數(shù)據(jù)時,正好相反,CAN控制器根據(jù)兩根線上的電位差來判斷總線電平。因此CAN總線物理傳輸媒介只需要兩根線。

高速CAN總線最高信號傳輸速率為1Mbps,支持最長距離40m。ISO11898-2要求在高速CAN總線兩段安裝端接電阻RL(端接電阻一般為120?,因為電纜的特性阻抗為120 ?,為了模擬無限遠(yuǎn)的傳輸線。)以消除反射。低速CAN最高速度只有125Kbps,所以ISO11898-3沒有端接要求。

在傳輸距離方面,由于距離越遠(yuǎn),信號時延也越大,為了確保信息的正確采樣,總線上的信號速率也的下降。下圖是推薦的信號速率與距離的關(guān)系。

CAN總線通過兩個信號線進(jìn)行差分信號傳輸。邏輯0和邏輯1通過兩根線上的電壓差來表示。而高速CAN和低速CAN總線在物理層信號電平上定義有所不同。

在高速CAN中,定義兩根線電壓下相同(2.5V)時為邏輯0(顯性),當(dāng)兩電壓相差為2V(CAN_High = 3.5V, CAN_Low = 1.5V)時為邏輯1(隱性)。

低速CAN中,定義電壓差為5V(CAN_High = 0V, CAN_Low = 5V)時為邏輯1,電壓差為1.5V(CAN_High = 3.6V, CAN_Low = 1.4V)時為邏輯0。

高速CAN信號電平
低速CAN信號電平

總線電平分為顯性電平和隱性電平,二者必居其一。CAN總線的信號電平具有線與特性,既顯性電平(0)總是會掩蓋隱性電平(1)。如果不同節(jié)點同時發(fā)送顯性和隱性電平,總線上表現(xiàn)出顯性電平(0),只有在總線上所有節(jié)點發(fā)送的都是隱性電平(1)時,總線才表現(xiàn)為隱性。

線與特性


CAN數(shù)據(jù)鏈路層

只是用兩條信號線的CAN,每次只能表達(dá)一個信號,簡潔的物理層決定了CAN必然要配上一套較為復(fù)雜的協(xié)議。

通信機(jī)制
  • 多主機(jī)
    對安全敏感的應(yīng)用(如汽車)對通信系統(tǒng)的可靠性要求很高。將整個總線的正常與否托付于單個節(jié)點是極其危險的。比較合理的方法是對總線的接入去中心化,是每個節(jié)點都有接入總線的能力。所以CAN總線采用多主控的線性拓?fù)浣Y(jié)構(gòu)。
    在總線上,每個節(jié)點發(fā)送消息不必遵循任何預(yù)先設(shè)定的時序,通信是事件驅(qū)動的。只有當(dāng)有新的信息傳遞時,CAN總線才處于忙碌狀態(tài)。這使得節(jié)點接入總線速度非??欤瑢τ诋惒绞录磻?yīng)迅速,基本上對于ms級別的實時應(yīng)用沒有任何問題。

  • 尋址機(jī)制
    不同其他類型的總線,CAN總線不設(shè)定節(jié)點的地址,而是通過消息的標(biāo)識符(ID)來區(qū)別消息。雖然這在消息中增加了標(biāo)識符,提高了復(fù)雜度。但這使得節(jié)點可以無需了解其他節(jié)點的狀況,而相互獨立工作。在總線上增加節(jié)點只需關(guān)注消息類型,不需要關(guān)心其他節(jié)點的狀況,更加靈活。

  • CSMA/CD+AMP
    CAN總線通信原理可以簡單描述為多路載波偵聽(CSMA)+仲裁機(jī)制(CD)和基于消息優(yōu)先級的沖突檢測(AMP)。
    CSMA(CarrieSense Multiple Access)指的是所有節(jié)點必須都等到總線處于空閑狀態(tài)時才能往總線上發(fā)送消息。由于所有節(jié)點接在同一根總線上,且以廣播的形式發(fā)送消息。所以每個節(jié)點在發(fā)送數(shù)據(jù)前都要檢測總線上是否已有數(shù)據(jù)傳輸。如果總線上有數(shù)據(jù),則暫時不發(fā)送數(shù)據(jù),等待網(wǎng)絡(luò)空閑時再發(fā)。
    CD+AMP(Collision Detection + Arbitration on Message Priority)指的是節(jié)點在發(fā)送數(shù)據(jù)時,要不停地檢測發(fā)送的數(shù)據(jù)是否與其他節(jié)點數(shù)據(jù)發(fā)送沖突。當(dāng)出現(xiàn)沖突時,通過ID仲裁,總線優(yōu)先保證發(fā)送ID更小的消息。報文優(yōu)先級低的節(jié)點退出仲裁后,在下次總線空閑時自動重新發(fā)送報文。

  • 報文接收過濾
    由于CAN總線以廣播形式傳播消息,所以CAN總線上的所有節(jié)點都可以接受到CAN上的消息。但各控制器會根據(jù)其ID過濾報文的功能,直接收需要的報文。
CAN報文種類及結(jié)構(gòu)

CAN協(xié)議是通過以下5種類型的幀進(jìn)行的:

幀類型 幀用途
數(shù)據(jù)幀 用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀
遠(yuǎn)程幀 用于接收單元向具有相同 ID 的發(fā)送單元請求數(shù)據(jù)的幀
錯誤幀 用于當(dāng)檢測出錯誤時向其它單元通知錯誤的幀
過載幀 用于接收單元通知其尚未做好接收準(zhǔn)備的幀
間隔幀 用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開來的幀

1、數(shù)據(jù)幀
數(shù)據(jù)幀是CAN通信中最主要,也是最復(fù)雜的。數(shù)據(jù)幀以一個顯性位開始,以7個連續(xù)的隱性位結(jié)束。CAN總線的數(shù)據(jù)幀有標(biāo)準(zhǔn)格式和擴(kuò)展格式的區(qū)分。

數(shù)據(jù)幀

各字段定義及長度分別為:
SOF:表示數(shù)據(jù)幀開始;(1 bit)
Identifier:標(biāo)準(zhǔn)格式11 bit,擴(kuò)展格式29 bit包括Base Identifier(11 bit)和Extended Identifier(18 bit),該區(qū)段標(biāo)識數(shù)據(jù)幀的優(yōu)先級,數(shù)值越小,優(yōu)先級越高;
RTR:遠(yuǎn)程傳輸請求位,0時表示為數(shù)據(jù)幀,1表示為遠(yuǎn)程幀,也就是說RTR=1時,消息幀的Data Field為空;(1 bit)
IDE: 標(biāo)識符擴(kuò)展位,0時表示為標(biāo)準(zhǔn)格式,1表示為擴(kuò)展格式;(1 bit)
DLC:數(shù)據(jù)長度代碼,08表示數(shù)據(jù)長度為08 Byte;(4 bit)
Data Field:數(shù)據(jù)域;(0~8 Byte)
CRC Sequence:校驗域,校驗算法G(x) = x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1;(15 bit)

DEL:校驗域和應(yīng)答域的隱性界定符;(1 bit)
ACK:應(yīng)答,確認(rèn)數(shù)據(jù)是否正常接收,所謂正常接收是指不含填充錯誤、格式錯誤、 CRC 錯誤。發(fā)送節(jié)點將此位為1,接收節(jié)點正常接收數(shù)據(jù)后將此位置為0;(1 bit)

SRR:替代遠(yuǎn)程請求位,在擴(kuò)展格式中占位用,必須為1;(1 bit)
EOF:連續(xù)7個隱性位(1)表示幀結(jié)束;(7 bit)
ITM:幀間空間,Intermission (ITM),又稱Interframe Space (IFS),連續(xù)3個隱性位,但它不屬于數(shù)據(jù)幀。幀間空間是用于將數(shù)據(jù)幀和遠(yuǎn)程幀與前面的幀分離開來的幀。數(shù)據(jù)幀和遠(yuǎn)程幀可通過插入幀間空間將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分開。過載幀和錯誤幀前不能插入幀間空間。

2、遠(yuǎn)程幀
一般地,數(shù)據(jù)是由發(fā)送單元主動向總線上發(fā)送的。而遠(yuǎn)程幀的用于接收單元主動向發(fā)送單元請求數(shù)據(jù)。
遠(yuǎn)程幀沒有數(shù)據(jù)塊Data Field。遠(yuǎn)程幀的 DLC 塊表示請求發(fā)送單元發(fā)送的數(shù)據(jù)長度(Byte)。
遠(yuǎn)程幀的RTR值為1。當(dāng)總線上具有相同標(biāo)識符的數(shù)據(jù)幀和遠(yuǎn)程幀同時發(fā)送時,由于數(shù)據(jù)幀的 RTR 位是顯性的,數(shù)據(jù)幀將在仲裁中贏得總線控制權(quán)。

3、錯誤幀
當(dāng)接受和發(fā)送消息的節(jié)點檢測出錯誤時,就發(fā)送錯誤幀通知錯誤。由錯誤標(biāo)志和錯誤界定符構(gòu)成。錯誤幀的幀結(jié)構(gòu)如下圖:

錯誤幀結(jié)構(gòu)

其中錯誤標(biāo)志為6-12個顯性/隱性重疊位。處于主動報錯狀態(tài)的單元檢測出錯誤時輸出主動錯誤標(biāo)志(6個顯性位);處于被動認(rèn)錯狀態(tài)的單元檢測出錯誤時輸出被動錯誤標(biāo)志(6個隱性位)。
錯誤界定符由8個“隱性”位構(gòu)成。

CAN總線的錯誤類型包括以下五種:

  • CRC錯誤——校驗錯誤,接受單元重新計算CRC,與發(fā)送單元的CRC不一致。
  • ACK錯誤——應(yīng)答錯誤,發(fā)送單元在ACK為中檢測到隱性電平。
  • FORM錯誤——格式錯誤,檢測出傳輸?shù)臄?shù)據(jù)幀格式與合法格式不符。
  • 位錯誤——發(fā)送節(jié)點在發(fā)送電平時發(fā)現(xiàn)總線電平與發(fā)送電平不一致的錯誤。
  • 填充錯誤——在需要未填充的段內(nèi),連續(xù)檢測到6為相同的電平。(位填充的介紹見后文)

對錯誤的處理,可參考這里
此外為防止自身由于某些原因?qū)е聼o法正常接收的節(jié)點一直發(fā)送錯誤幀,干擾其他節(jié)點通信。CAN總線提供了復(fù)位重啟等處理機(jī)制。

4、過載幀
當(dāng)某個接收節(jié)點沒有做好接收下一幀數(shù)據(jù)的準(zhǔn)備時,將發(fā)送過載幀以通知發(fā)送節(jié)點。在兩種情況下,節(jié)點會發(fā)送過載幀:

  • 接收單元條件的制約,要求發(fā)送節(jié)點延緩下一個數(shù)據(jù)幀或遠(yuǎn)程幀的傳輸;
  • 幀間空間(Intermission)的 3 bit 內(nèi)檢測到顯性位

過載幀由過載標(biāo)志(6個顯性位)和過載幀界定符(8個隱性位)組成。由于存在多個節(jié)點同時過載且過載幀發(fā)送有時間差問題,可能出現(xiàn)過載標(biāo)志疊加后超過6個位的現(xiàn)象。

位填充

CAN總線使用到的是非歸零編碼(NRZ),NRZ編碼的優(yōu)點是效率高,但卻不易區(qū)分哪里是bit開始,哪里是bit結(jié)束。因此為確保在同步通信過程中有足夠的電平跳變,規(guī)范中應(yīng)用到位填充機(jī)制,即在每連續(xù) 5 個相同電平后插入 1個反相電平,接收節(jié)點在收到消息后自動將填充位刪除。
在幀內(nèi)除了CRC界定符、ACK域和EOF外,其余部分均應(yīng)用到位填充機(jī)制。在應(yīng)用到位填充的域,檢測到連續(xù) 6 個顯性位或隱性位均視為報錯。

數(shù)據(jù)幀在位填充前后的比較


DBC

CAN協(xié)議定義了物理層及數(shù)據(jù)鏈路層規(guī)范,通過CAN總線,ECU之間可以進(jìn)行數(shù)據(jù)通信。但建立更加完善的系統(tǒng),還需要在CAN的基礎(chǔ)上選擇合適的應(yīng)用層,如CANopen、J1939等。其中J1939即為DBC文件。

DBC(data base CAN)是汽車ECU見進(jìn)行CAN通信的報文內(nèi)容。規(guī)定了各種CAN信號的具體含義。DBC是一個ASCII格式的文本文件,一般用CANdb++帶來,方面查看和編輯。DBC解析過程就是將汽車CAN網(wǎng)絡(luò)傳輸?shù)氖M(jìn)制數(shù)據(jù)轉(zhuǎn)換成我們所熟悉的物理量,如車速、發(fā)動機(jī)轉(zhuǎn)速、燃油量等。有了DBC,ECU之間才能互相聽懂,實現(xiàn)控制。根據(jù)DBC文件中規(guī)定的信息,也可以對CAN網(wǎng)絡(luò)進(jìn)行監(jiān)控,掌握整車狀態(tài)。

但DBC只涉及CAN網(wǎng)絡(luò)中的通信,不涉及連接在CAN總線上的控制器設(shè)備內(nèi)部的功能邏輯。



——————————————————————
參考:
汽車CAN總線詳解
一口氣從零讀懂CAN總線
CAN總線_百度百科
CAN總線深入分析教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容