轉(zhuǎn)載

轉(zhuǎn)自:https://blog.csdn.net/cheatscat/article/details/82886889

CAN(Controller Area Network)總線協(xié)議是由?BOSCH?發(fā)明的一種基于消息廣播模式的串行通信總線,它起初用于實現(xiàn)汽車內(nèi)ECU之間可靠的通信,后因其簡單實用可靠等特點,而廣泛應用于工業(yè)自動化、船舶、醫(yī)療等其它領(lǐng)域。相比于其它網(wǎng)絡(luò)類型,如局域網(wǎng)(LAN, Local Area Network)、廣域網(wǎng)(WAN, Wide?Area Network)和個人網(wǎng)(PAN, Personal?Area Network)等,CAN?更加適合應用于現(xiàn)場控制領(lǐng)域,因此得名。

CAN總線是一種多主控(Multi-Master)的總線系統(tǒng),它不同于USB或以太網(wǎng)等傳統(tǒng)總線系統(tǒng)是在總線控制器的協(xié)調(diào)下,實現(xiàn)A節(jié)點到B節(jié)點大量數(shù)據(jù)的傳輸,CAN網(wǎng)絡(luò)的消息是廣播式的,亦即在同一時刻網(wǎng)絡(luò)上所有節(jié)點偵測的數(shù)據(jù)是一致的,因此比較適合傳輸諸如控制、溫度、轉(zhuǎn)速等短消息。

CAN起初由BOSCH提出,后經(jīng)ISO組織確認為國際標準,根據(jù)特性差異又分不同子標準。CAN國際標準只涉及到OSI(開放式通信系統(tǒng)參考模型 )的物理層和數(shù)據(jù)鏈路層。上層協(xié)議是在CAN標準基礎(chǔ)上定義的應用層,市場上有不同的應用層標準。


發(fā)展歷史

1983年,BOSCH開始著手開發(fā)CAN總線;

1986年,在SAE會議上,CAN總線正式發(fā)布;

1987年,Intel和Philips推出第一款CAN控制器芯片;

1991年,奔馳 500E 是世界上第一款基于CAN總線系統(tǒng)的量產(chǎn)車型;

1991年,Bosch發(fā)布CAN 2.0標準,分CAN 2.0A(11位標識符,標準幀)和CAN 2.0B(29位標識符,擴展幀);

1993年,ISO發(fā)布CAN總線標準(ISO 11898),隨后該標準主要有三部分:

ISO 11898-1:數(shù)據(jù)鏈路層協(xié)議

ISO 11898-2:高速CAN總線物理層協(xié)議

ISO 11898-3:低速CAN總線物理層協(xié)議

注意:ISO 11898-2和ISO 11898-3物理層協(xié)議不屬于 BOSCH CAN 2.0標準。

2012年,BOSCH發(fā)布?CAN FD 1.0?標準(CAN with Flexible Data-Rate),CAN FD定義了在仲裁后確使用不同的數(shù)據(jù)幀結(jié)構(gòu),從而達到最高12Mbps?數(shù)據(jù)傳輸速率。CAN FD與CAN 2.0協(xié)議兼容,可以與傳統(tǒng)的CAN 2.0設(shè)備共存于同樣的網(wǎng)絡(luò)

標準化

CAN標準分為底層標準(物理層和數(shù)據(jù)鏈路層)和上層標準(應用層)兩大類。CAN底層標準主要是?ISO 11898?系列的國際標準,也就是說不同廠商在CAN總線的物理層和數(shù)據(jù)鏈路層定義基本相同;而上層標準,涉及到例如流控制、設(shè)備尋址和大數(shù)據(jù)塊傳輸控制等,不同應用領(lǐng)域或制造商會有不同的做法,沒有統(tǒng)一的國際標準。

底層標準

CAN底層標準涵蓋OSI模型中的物理層和數(shù)據(jù)鏈路層,底層標準包括:

ISO 11898-1: 2015定義CAN總線的數(shù)據(jù)鏈路層(DLL)和電氣信號標準,描述CAN總線的基本架構(gòu),定義不同CAN總線設(shè)備在數(shù)據(jù)鏈路層通信方式,詳細說明邏輯鏈接控制(LLC)和介質(zhì)訪問控制(MAC)子層部分;

ISO 11898-2: 2003定義高速CAN總線(HS-CAN)物理層標準,最高數(shù)據(jù)傳輸速率1Mbps,應用為兩線平衡式信號(CAN_H, CAN_L),HS CAN是汽車動力和工業(yè)控制網(wǎng)絡(luò)中應用最為廣泛的物理層協(xié)議;

ISO 11898-3: 2006定義低速CAN總線(LS-CAN, Fault-Tolerant CAN)物理層標準,數(shù)據(jù)傳輸速率在?40Kbps ~ 125Kbps。Fault-Tolerant是指總線上一根傳輸信號失效時,依靠另外的單根信號也可以通信,LS CAN主要應用于汽車車身電控單元之間通信;

ISO 11898-4: 2004定義CAN總線中的時間觸發(fā)機制(Time-Triggered CAN,TTCAN),定義與ISO 11898-1 配合的幀同步實體,實現(xiàn)汽車ECU之間基于時間觸發(fā)的通信方式。注意,ISO 11898-1 是基于事件驅(qū)動(Event-Driven)的通信,它對于高負荷總線上,尤其是低優(yōu)先級的消息會造成較大的延遲,而基于時間觸發(fā)的ISO 11898-4 標準的初衷也正是為解決該問題,確保CAN總線上可靠的消息傳輸;

ISO 11898-5: 2007對ISO 11898-2高速CAN總線的補充,并參照ISO 8802-2,定義在總線閑置時的節(jié)電特性;

ISO 11898-6: 2013對ISO 11898-2 和 ISO 11898-5 的補充,并參照ISO 8802-2,定義使用可配置的幀實現(xiàn)選擇性喚醒總線的機制;

ISO 16845-1: 2004定義測試符合ISO 11898-1標準CAN應用的方法和條件;

ISO 16845-2: 2014定義包括特定功能下可以選擇性喚醒總線的CAN收發(fā)器的測試實例和測試要求,也稱為CAN總線的一致性測試

CAN總線底層標準與ISO/OSI模型的對應關(guān)系,如圖1所示。對于媒體專用接口(Medium Dependent Interface,MDI),沒有統(tǒng)一的國際標準。CiA DS-102(CiA: CAN in Automation )僅定義使用專用連接器(DB9),并對PIN定義作出一定規(guī)范。

圖1. CAN總線標準

上層標準

雖然底層標準相同,不同應用領(lǐng)域和組織會制定不同的上層標準。有的廠商開發(fā)并推廣其應用層標準,在某些領(lǐng)域得以廣泛應用。對于汽車行業(yè)來說,幾乎每家廠商都有自己的CAN上層標準。比較流行的有工業(yè)自動化領(lǐng)域?CiA?的CANopen,Rockwell?的DeviceNet;嵌入式控制領(lǐng)域?Kvaser?的CAN Kingdom;智能設(shè)備控制?Honeywell?的SDS;汽車診斷?ISO 14229?定義的UDS,和中重型汽車CAN總線標準SAE J1939?。如表1示。

表1. CAN上層標準舉例

總線特點

符合OSI開放式通信系統(tǒng)參考模型;

兩線式總線結(jié)構(gòu),電氣信號為差分式;

多主控制,在總線空閑時,所有的單元都可開始發(fā)送消息,最先訪問總線的單元可獲得發(fā)送權(quán);多個單元同時開始發(fā)送時,發(fā)送高優(yōu)先級 ID 消息的單元可獲得發(fā)送權(quán);

消息報文不包含源地址或者目標地址,僅通過標識符表明消息功能和優(yōu)先級;

基于固定消息格式的廣播式總線系統(tǒng),短幀結(jié)構(gòu);

事件觸發(fā)型,只有當有消息要發(fā)送時,節(jié)點才向總線上廣播消息;

可以通過發(fā)送遠程幀請求其它節(jié)點發(fā)送數(shù)據(jù)

消息數(shù)據(jù)長度 0~8 Byte;

錯誤檢測功能,所有節(jié)點均可檢測錯誤,檢測處錯誤的單元會立即通知其它所有單元;

發(fā)送消息出錯后,節(jié)點會自動重發(fā);

故障限制,節(jié)點控制器可以判斷錯誤是暫時的數(shù)據(jù)錯誤還是持續(xù)性錯誤,當總線上發(fā)生持續(xù)數(shù)據(jù)錯誤時,控制器可將節(jié)點從總線上隔離;

通信介質(zhì)可采用雙絞線、同軸電纜和光導纖維,一般使用最便宜的雙絞線;

理論上,CAN總線用單根信號線就可以通信,但還是配備了第二根導線,第二根導線與第一根導線信號為差分關(guān)系,可以有效抑制電磁干擾;

在40米線纜條件下,最高數(shù)據(jù)傳輸速率 1Mbps;

總線上可同時連接多個節(jié)點,可連接節(jié)點總數(shù)理論上是沒有限制的,但實際可連接節(jié)點數(shù)受總線上時間延遲及電氣負載的限制;

未定義標準連接器,但經(jīng)常用9腳 DSUB

應用

在當今汽車應用領(lǐng)域,車內(nèi)電控單元(Electrical Control Unit,?ECU)可能多達70?個(我們車好像180個),除了引擎控制單元(Engine Control Unit,?ECU?)外,還存在傳動控制、安全氣囊、ABS、巡航控制、EPS、音響系統(tǒng)、門窗控制和電池管理等模塊,雖然某些模塊是單一的子系統(tǒng),但是模塊之間的互連依然非常重要。例如,有的子系統(tǒng)需要控制執(zhí)行器和接收傳感器反饋,CAN總線可以滿足這些子系統(tǒng)數(shù)據(jù)傳輸?shù)男枨?。汽車?nèi)子模塊的總線互連架構(gòu)使得軟件可以更輕易地實現(xiàn)安全、經(jīng)濟和便利等新特性,相比傳統(tǒng)汽車網(wǎng)絡(luò)架構(gòu)中模塊單元直接連接更加經(jīng)濟。 CAN總線實現(xiàn)汽車內(nèi)互連系統(tǒng)由傳統(tǒng)的點對點互連向總線式系統(tǒng)的進化,大大降低汽車內(nèi)電子系統(tǒng)布線的復雜度,如圖2所示。

背景:隨著電氣化和智能化,汽車上的電子單元越來越多,電控單元組網(wǎng)需求也日漸迫切!

福特Fusion汽車 @2013

70個ECU單元

75個傳感器

150個激勵器

自動駕駛汽車 @2030 -Prediction

120個ECU單元

100個傳感器

200個激勵器


圖2. 傳統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu) VS 總線式結(jié)構(gòu)

VW的定義(SSP 269)中,根據(jù)應用范圍將車內(nèi)CAN總線分為三類:

Convenience CAN/舒適CAN網(wǎng)絡(luò),主要控制車門窗、空調(diào)等設(shè)備,最高傳輸速度100 kbps

Powertrain CAN?/動力CAN網(wǎng)絡(luò),主要控制動力相關(guān)設(shè)備,如發(fā)動機、制動、ABS等,最高傳輸速度500 kbps

Infotainment CAN/信息娛樂CAN網(wǎng)絡(luò),主要控制收音機、電話和導航等設(shè)備,最高傳輸速度100 kbps

根據(jù)數(shù)據(jù)傳輸速度不同CAN總線分兩類:高速CAN(ISO 11898-2)和低速CAN(ISO 11898-3)。

高速CAN(按BOSCH說法,也叫CAN-C),數(shù)據(jù)速率在?125kbps?~?1Mbps,應用在實時性要求高的節(jié)點,如引擎管理單元、電子傳動控制、ESP和儀表盤等;低速CAN(CAN-B),數(shù)據(jù)速率在?5kbps?~?125kbps,應用在實時性要求低的節(jié)點,主要在舒適和娛樂領(lǐng)域,如空調(diào)控制、座椅調(diào)節(jié)、燈光、視鏡調(diào)整等,這些節(jié)點對實時性要求不高,而且分布較為分散,線纜較易收到損壞,低速CAN的傳輸速度即可滿足要求,而且單根線纜也可以工作,很好地適應了以上需求。不同速度類型的CAN總線設(shè)備不能直接連在同一路總線上,它們之間需要通過網(wǎng)關(guān)隔離。

CAN總線在汽車診斷領(lǐng)域的應用也非常廣泛,ECU直接掛載在總線上,可以很快地獲取診斷所需的信息。傳統(tǒng)的汽車診斷接口(如KWP2000)應用逐漸減少。

圖2a示意了汽車內(nèi)總線系統(tǒng)及電子設(shè)備的邏輯分布,總線系統(tǒng)包括 CAN、LIN、FlexRay 和 MOST 。注意,車載以太網(wǎng)在圖中未列出,但它的應用日漸廣泛。以上不同類型和速度的總線,通過網(wǎng)關(guān)?Gateway?模塊相互通信。(圖片來源:鏈接)


圖2a. 汽車內(nèi)總線系統(tǒng)舉例

局限性

由于CAN總線仲裁的特點,即使往總線上周期性發(fā)送消息,也不能保證節(jié)點可以確定(周期) 地收到消息,CAN不適合對時間特別敏感的應用;

最高傳輸速率只有1Mbps?,對于汽車自動駕駛應用的數(shù)據(jù)傳輸,或者視頻音頻傳輸帶寬不足。為解決這方面的需求,CAN FD速度有所上升,另外還有MOSTLVDS?以太網(wǎng)等;

對于簡單的應用,高成本的CAN總線雖然可靠性很高,但有點浪費。LIN?總線相比CAN具有成本優(yōu)勢,更適合應用于車窗座椅空調(diào)等設(shè)備

電路基礎(chǔ)

硬件拓撲

連接在CAN總線上的設(shè)備叫做節(jié)點設(shè)備(CAN Node),CAN網(wǎng)絡(luò)的拓撲一般為線型。線束最常用為非屏蔽雙絞線(UTP),線上傳輸為對稱的電平信號(差分)。圖3示為CAN總線網(wǎng)絡(luò)示意圖,節(jié)點主要包括Host、控制器和收發(fā)器三部分。Host常集成有CAN控制器(現(xiàn)在的MCU一般都會搭載CAN控制器,特別是車載的MCU),CAN控制器負責處理協(xié)議相關(guān)功能,以減輕Host的負擔。CAN收發(fā)器將控制器連接到傳輸媒介。通??刂破骱涂偩€收發(fā)器通過光耦或磁耦隔離,這樣即使總線上過壓,損壞收發(fā)器,控制器和Host設(shè)備也可以得到保護。

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

高速CAN總線最高信號傳輸速率為1Mbps,支持最長距離?40m。ISO 11898-2?規(guī)定要求在高速CAN總線的兩端安裝端接電阻(RL)以消除反射,而低速CAN最高速度只有?125Kbps,因此?ISO?11898-3?沒有要求端接。ISO 11898 規(guī)定的CAN總線上最多?32?個節(jié)點。實際應用中要考慮到CAN總線收發(fā)器的性能,以及工作的CAN網(wǎng)絡(luò)是高速CAN還是低速CAN。在傳輸距離方面,由于距離越大,信號時延也越大,為確保消息的正確采樣,總線上的信號速率相應也得下降,表2列出推薦的信號速率與距離的關(guān)系。

表2. CAN總線長度與信號速率關(guān)系(推薦)

收發(fā)器

CAN收發(fā)器包括?CANH?和?CANL?兩根信號,CANH和CANL信號采用差分電平,這樣可以取得更好的電磁兼容效果。CAN總線物理傳輸媒介只需要兩根線。

前面的標準部分有介紹,CAN總線分高速CAN和低速CAN,收發(fā)器因之也分為高速CAN收發(fā)器(1Mbps)和低速CAN收發(fā)器(125Kbps)。低速CAN也叫?Fault Tolerant CAN?,指的是即使總線上一根線失效,總線依然可以通信。圖4示例高速CAN收發(fā)器的基本電路結(jié)構(gòu)。當兩個晶體管都關(guān)斷時,CANH和CANL上電壓相同,且都為?0.5*VCC?;而當兩個晶體管都打開時,CANH 和 CANL 上即存在一定的壓差,且壓差與負載電阻值相關(guān)。ISO 11898-2?要求此時 CANH 和 CANL 壓差在?2V?左右。

CAN收發(fā)器的特性包括非常低的電磁輻射和很強的抗擊共模噪聲的能力。另外,CAN收發(fā)器可以提供高達?8KV?的ESD保護,在電路設(shè)計中可以在收發(fā)器附近增加共模電感以進一步降低電磁輻射(圖5)。

圖4. CAN總線收發(fā)器(MCP2551)

圖5. 共模電感降低輻射

信號電平

高速CAN和低速CAN總線在物理層信號電平上定義有所不同(還有這樣的區(qū)別?)。圖6和圖7表示高速和低速CAN總線上信號電平與總線邏輯的對應關(guān)系。

高速CAN,定義 CANH 和 CANL?電壓相同(CANH = CANL =?2.5V)時為邏輯“1”,CANH和CANL?電壓相差?2V(CANH =?3.5V, CANL =?1.5V)?時為邏輯“0”。高速CAN收發(fā)器在共模電壓范圍內(nèi)(-12V ~ 12V),將CANH和CANL電壓相差大于?0.9V?解釋為顯性狀態(tài)(Dominant),而將CANH和CANL電壓相差小于?0.5V?解釋為為隱性狀態(tài)(Recessive)。收發(fā)器內(nèi)部有遲滯電路可以降低干擾。

低速CAN,定義CANH和CANL電壓相差?5V?(CANH =?0V, CANL =?5V)時為邏輯“1”,相差?2.2V?(CANH =?3.6V, CANL =?1.4V)時為邏輯“0”。

在CAN總線上,邏輯“0”和“1”之間顯著的電壓差是總線可靠通信的保證。參照上面的描述,CAN總線上兩種電平狀態(tài)分別為:

顯性(Dominant ): 0

隱性(Recessive ): 1

CAN總線的信號電平具有線與特性,即顯性電平(0)總是會掩蓋隱性電平(1)。如果不同節(jié)點同時發(fā)送顯性和隱性電平,總線上表現(xiàn)出顯性電平(0),只有在總線上所有節(jié)點發(fā)送的都是隱性電平(1)時,總線才表現(xiàn)為隱性。線與特性是CAN總線仲裁的電路基礎(chǔ)。詳細仲裁過程見下文“仲裁機制”部分。

圖6.?高速CAN信號電平( ISO 11898-2)


圖7.?低速CAN信號電平( ISO 11898-3)

連接器

在前文有提到,業(yè)界只規(guī)定了9 Pin D-Sub?類型的CAN總線連接器,其信號定義如圖8所示。


圖8. CAN 9 Pin D-Sub引腳定義

三種CAN標準物理層比較

除了上文介紹的高速CAN和低速CAN外,還有標準定義另外一種CAN物理層結(jié)構(gòu),即?Single Wire CAN。單線CAN可以減少一根傳輸線,但是要求節(jié)點間有良好的共地特性(相當于第二根信號線)。單線CAN的信號抗干擾能力相對較弱,在設(shè)計中需要提高信號幅度以增加信噪比,如此又會讓它自身的輻射能力增加,因此必須降低其信號傳輸速率以達到電磁兼容的要求。綜上,單線CAN僅適合應用在低速的車身電子單元、舒適及娛樂控制領(lǐng)域。低速CAN總線由于信號速度不高,在一根信號線失靈的情況下,仍可工作于單線模式。

三種CAN總線物理層的對比如表3列出??偩€連接拓撲圖如圖9,對于端接,高速CAN端接是在總線兩端,而低速CAN和單線CAN的端接都是在各節(jié)點位置。


表3. 三種CAN物理層標準比較


圖9. 三種CAN總線物理層的比較


通信原理

Multi-Master

安全敏感的應用,比如汽車動力,對通信系統(tǒng)的可靠性要求很高。將總線工作正常與否歸結(jié)到單一節(jié)點是極其危險的,比較合理的方案是對總線接入的去中心化,亦即每個節(jié)點都有接入總線的能力。這也是CAN總線采用多主控(Multi-Master)線性拓撲結(jié)構(gòu)的原因。在CAN總線上,每個節(jié)點都有往總線上發(fā)送消息的能力,而且消息的發(fā)送不必遵從任何預先設(shè)定的時序,通信是事件驅(qū)動的。只有當有新的信息傳遞時,CAN總線才處于忙的狀態(tài),這使得節(jié)點接入總線速度非???。CAN總線理論最高數(shù)據(jù)傳輸速率為1Mbps,對于異步事件反應迅速,基本上對于毫秒級的實時應用沒有任何問題。

尋址機制

不同于其它類型的總線,CAN總線不設(shè)定節(jié)點的地址,而是通過消息的標識符(Identifier)來區(qū)別消息。CAN總線消息是廣播式的,也就是說在同一時刻所有節(jié)點都檢測到同樣的電平信號。接受節(jié)點通過識別消息中的標識符,與該節(jié)點預設(shè)的過濾規(guī)則對比,如果滿足規(guī)則就接收這條消息,發(fā)送應答,否則就忽略這條消息,關(guān)于這部分介紹見下文“條件接收”部分。這種機制雖然會增加消息幀的復雜度(增加標識符),但是節(jié)點在此情況下可以無須了解其它節(jié)點的狀況,而相互間獨立工作,在總線上增加節(jié)點時僅須關(guān)注消息類型,而非系統(tǒng)上其它節(jié)點的狀況。這種以消息標識符尋址的方式,讓在總線上增加節(jié)點變得更加靈活。

CSMA/CD+AMP

CAN總線通信原理可簡單描述為多路載波偵聽+基于消息優(yōu)先級的沖突檢測和仲裁機制(CSMA/CD+AMP),CSMA(Carrier Sense Multiple Access )指的所有節(jié)點必須都等到總線處于空閑狀態(tài)時才能往總線上發(fā)送消息;CD+AMP(Collision Detection + Arbitration on Message Priority)指的是如果多個節(jié)點往總線上發(fā)送消息時,具備最高優(yōu)先級(標識符最?。┑南@得總線占有權(quán)。

幀分類

CAN總線定義四種幀類型,分別為數(shù)據(jù)幀、遠程幀、錯誤幀和過載幀。數(shù)據(jù)幀就是總線上傳輸用戶數(shù)據(jù)的幀,其最高有效載荷是?8 Byte,除了有效載荷外,數(shù)據(jù)幀還包括必要的幀頭幀位部分以執(zhí)行CAN標準通信,比如消息標識符(Identifier)、數(shù)據(jù)長度代碼、校驗信息等。遠程幀是用來向總線上其它節(jié)點請求數(shù)據(jù)的幀,它的幀結(jié)構(gòu)與數(shù)據(jù)幀相似,只不過沒有有效載荷部分;錯誤幀是表示通信出錯的幀。數(shù)據(jù)幀和遠程幀有標準格式和擴展格式兩種格式。標準格式有?11?位的標識符 , 擴展格式有?29?位標識符。

各種幀的用途分別為:

數(shù)據(jù)幀:用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀;

遠程幀:用于接收單元向具有相同標識符的發(fā)送單元請求數(shù)據(jù)的幀;

錯誤幀:用于當檢測出錯誤時向其它單元通知錯誤的幀;

過載幀:用于接收單元通知其尚未做好接收準備的幀

數(shù)據(jù)幀

數(shù)據(jù)幀的幀結(jié)構(gòu)如圖10所示,圖中示例標準數(shù)據(jù)幀(Standard)和擴展數(shù)據(jù)幀(Extended)兩種格式。各字段定義及長度分別為:

SOF:表示數(shù)據(jù)幀開始;(1 bit)

Identifier:標準格式11 bit,擴展格式29 bit包括Base Identifier(11 bit)和Extended Identifier(18 bit),該區(qū)段標識數(shù)據(jù)幀的優(yōu)先級,數(shù)值越小,優(yōu)先級越高;

RTR:遠程傳輸請求位,0時表示為數(shù)據(jù)幀,1表示為遠程幀,也就是說RTR=1時,消息幀的Data Field為空;(1 bit)

IDE:?標識符擴展位,0時表示為標準格式,1表示為擴展格式;(1 bit)

DLC:數(shù)據(jù)長度代碼,0~8表示數(shù)據(jù)長度為0~8 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:校驗域和應答域的隱性界定符;(1 bit)

ACK:應答,確認數(shù)據(jù)是否正常接收,所謂正常接收是指不含填充錯誤、格式錯誤、 CRC 錯誤。發(fā)送節(jié)點將此位為1,接收節(jié)點正常接收數(shù)據(jù)后將此位置為0;(1 bit)

SRR:替代遠程請求位,在擴展格式中占位用,必須為1;(1 bit)

EOF:連續(xù)7個隱性位(1)表示幀結(jié)束;(7 bit)

ITM:幀間空間,Intermission (ITM),又稱Interframe Space (IFS),連續(xù)3個隱性位,但它不屬于數(shù)據(jù)幀。幀間空間是用于將數(shù)據(jù)幀和遠程幀與前面的幀分離開來的幀。數(shù)據(jù)幀和遠程幀可通過插入幀間空間將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分開。過載幀和錯誤幀前不能插入幀間空間。

圖10. CAN標準格式和擴展格式的數(shù)據(jù)幀/遠程幀格式

遠程幀

一般地,數(shù)據(jù)是由發(fā)送單元主動向總線上發(fā)送的,但也存在接收單元主動向發(fā)送單元請求數(shù)據(jù)的情況。遠程幀的作用就在于此,它是接收單元向發(fā)送單元請求發(fā)送數(shù)據(jù)的幀。遠程幀與數(shù)據(jù)幀的幀結(jié)構(gòu)類似,如上圖X所示。遠程幀與數(shù)據(jù)幀的幀結(jié)構(gòu)區(qū)別有兩點:

數(shù)據(jù)幀的?RTR?值為“0”,遠程幀的?RTR?值為“1”

遠程幀沒有數(shù)據(jù)塊

遠程幀的?DLC?塊表示請求發(fā)送單元發(fā)送的數(shù)據(jù)長度(Byte)。當總線上具有相同標識符的數(shù)據(jù)幀和遠程幀同時發(fā)送時,由于數(shù)據(jù)幀的?RTR?位是顯性的,數(shù)據(jù)幀將在仲裁中贏得總線控制權(quán)。

錯誤幀

用于在接收和發(fā)送消息時檢測出錯誤時,通知錯誤的幀。錯誤幀由錯誤標志和錯誤界定符構(gòu)成。錯誤幀的幀結(jié)構(gòu)如圖11示。

錯誤標志:6-12?個顯性/隱性重疊位

主動錯誤標志(6個顯性位): 處于主動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標志

被動錯誤標志(6個隱性位): 處于被動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標志

錯誤界定符:8?個隱性位

圖11. 錯誤幀的幀結(jié)構(gòu)

過載幀

過載幀是用于接收單元通知發(fā)送單元它尚未完成接收準備的幀。在兩種情況下,節(jié)點會發(fā)送過載幀:

接收單元條件的制約,要求發(fā)送節(jié)點延緩下一個數(shù)據(jù)幀或遠程幀的傳輸;

幀間空間(Intermission)的?3 bit?內(nèi)檢測到顯性位

每個節(jié)點最多連續(xù)發(fā)送兩條過載幀。過載幀由過載標志和過載界定符(8?個隱性位)構(gòu)成。數(shù)據(jù)幀的幀結(jié)構(gòu)如圖12所示。


圖12. 過載幀的幀結(jié)構(gòu)

仲裁機制

如果多個節(jié)點同時往總線上發(fā)送消息,總線的使用權(quán)是通過消息幀標識符的逐位仲裁機制決定的,在仲裁過程中消息是不會丟失的。這里的不會丟失的意思是指仲裁完成后,獲得總線控制權(quán)的消息內(nèi)容沒有被仲裁過程篡改,將繼續(xù)在總線上發(fā)送沒有傳輸完的消息。

在CAN總線上,標識符值越小,消息的優(yōu)先級越高。標識符全零的消息,由于它將總線電平保持在顯性的時間最長,因此優(yōu)先級最高。CAN總線的仲裁機制如圖13所示,幾點說明:

Wire-AND Bus Logic:只有節(jié)點發(fā)送的全是隱性,總線電平才表現(xiàn)為隱性;

Arbitration Logic:所有發(fā)送節(jié)點在發(fā)送數(shù)據(jù)的同時,也檢測總線上的電平狀態(tài)。如果總線電平狀態(tài)與它發(fā)送的電平狀態(tài)一致,則繼續(xù)發(fā)送(Next);如果發(fā)送為顯性,總線電平狀態(tài)為隱性,則傳輸出現(xiàn)故障(Fault);如果發(fā)送為隱性,總線電平狀態(tài)為顯性,則該節(jié)點退出對總線占用權(quán)的競爭(Stop);

仲裁機制:節(jié)點A和節(jié)點C同時向總線上發(fā)送數(shù)據(jù),在仲裁階段,逐位對比總線上電平與自身發(fā)送的電平,在標識符的第四位(ID7),節(jié)點C檢測到總線上電平與其自身發(fā)送電平不一致,它自動退出對總線的競爭,節(jié)點A則繼續(xù)發(fā)送數(shù)據(jù)

圖13. CAN總線仲裁機制

如上介紹,CAN總線上的逐位仲裁機制與?I2C?總線的仲裁都應用到線與邏輯的電路基礎(chǔ),不同的是I2C的仲裁只是在主機間進行,而CAN總線沒有主從機的概念。另外I2C的消息本身是不分優(yōu)先級的;CAN消息則是帶優(yōu)先級,有的消息出身高貴(標識符值越?。谥俨弥锌倳?。

為消息劃分優(yōu)先級比較適合于實時控制系統(tǒng),這樣可以確保重要的信息優(yōu)先發(fā)送,相對次要的消息延遲發(fā)送,系統(tǒng)設(shè)計師應該根據(jù)應用的特點為不同消息確定不同的優(yōu)先級(標識符),在類似?DeviceNet?這些規(guī)范組織的定義中,對于同樣類型的消息,比如溫度傳感器,即使它們可能來自不同的供應商,但消息標識符是一致的。

對于車身控制CAN網(wǎng)絡(luò)(舒適+信息娛樂),其特點是消息標識符種類多,而且消息發(fā)送沒有固定頻率或規(guī)律,在此類應用的CAN控制器,例如?Freescale?的?MSCAN(Motorola Scalable Controller Area Network)的設(shè)計中,控制器內(nèi)部包括?FIFO?寄存器,它將具有相同標識符的消息按順序保存,從而避免接收緩沖器溢出。而對于動力系統(tǒng)控制的CAN網(wǎng)絡(luò),總線上的消息特點是速度快,但是存在一定規(guī)律,此類應用的CAN控制器,例如?Freescale?的?FlexCAN(CAN 2.0B-Compliant),它包括?16 ~ 64?個稱為“mailbox”的接收緩沖器,運行時根據(jù)特定的過濾規(guī)則,將不同標識符的消息送到各自對應的?mailbox?。

條件接收

前面有提到消息在CAN總線上是廣播式的,但并不是所有節(jié)點都會對總線上所有消息感興趣。節(jié)點通過控制器中過濾碼(Filter Code?)和掩碼(Mask Code),再檢驗總線上消息的標識符,來判斷是否接收該消息(Message Filtering)。

對于掩碼,“1”表示該位與本節(jié)點相關(guān),“0”表示該位與本節(jié)點不相關(guān)。舉例如下:

例1:僅接收消息標識符為00001567(十六進制)的幀

設(shè)置過濾碼為00001567

設(shè)置掩碼為1FFFFFFF

節(jié)點檢測消息的標識符的所有位(29位),如果標識符為00001567接收,否則舍棄。

例2:接收消息標識符為00001567 到 0000156F 的幀

設(shè)置過濾碼為00001560

設(shè)置掩碼為1FFFFFF0

節(jié)點檢測消息的標識符的高25位,最低的4位則不care。如果標識符最高25位相同則接收,否則舍棄。

例3:接收消息標識符為00001560 到 00001567 的幀

設(shè)置過濾碼為00001560

設(shè)置掩碼為1FFFFFF8

節(jié)點檢測消息的標識符的高26位,最低的3位則不care。如果標識符最高26位相同則接收,否則舍棄。

例4:接收所有消息幀幀

設(shè)置過濾碼為0

設(shè)置掩碼為0

節(jié)點接收總線上所有消息。


應答機制

應答位(ACK)用來表示節(jié)點已經(jīng)收到有效的幀。任何節(jié)點如果準確無誤地接收到幀,則要向總線上發(fā)送顯性位,該顯性位將掩蓋發(fā)送節(jié)點輸出的隱性位,使總線上表現(xiàn)為顯性。如果發(fā)送節(jié)點檢測應答位為隱性,那么說明沒有節(jié)點收到有效幀。接收節(jié)點可能在應答位輸出隱性表示它沒有收到有效幀,但另外有收到有效幀的節(jié)點也可能輸出顯性表示它收到有效幀,這樣總線上總體上表現(xiàn)為顯性,發(fā)送節(jié)點也無從得知是否總線上所有節(jié)點都收到有效的幀。


位填充

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

位填充意味著實際傳輸?shù)臄?shù)據(jù)幀長度可能更長,圖14示例位填充前后的數(shù)據(jù)幀的變化,紫色位是位填充增加的位,接收節(jié)點收到消息后會自動刪除這些位。


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

錯誤檢驗

完善的錯誤校驗機制是CAN總線高可靠性的有效保證。CAN總線包括5?種錯誤校驗機制,其中?3?種在消息層面(Message Level)2?種在比特層面(Bit Level)?。如果消息出現(xiàn)五種錯誤中的任何一種,接收節(jié)點將不接收消息,并且產(chǎn)生錯誤幀通知發(fā)送節(jié)點重新發(fā)送消息,直到接收節(jié)點正確地收到消息。如果失效的節(jié)點持續(xù)不斷地報錯,導致總線掛死,那么在報錯次數(shù)達到設(shè)定的上限時,它將被控制器從總線上移除(詳見“故障限制”部分)。

消息層面的錯誤校驗機制體現(xiàn)在數(shù)據(jù)幀(圖10)中的?CRC?校驗域和?ACK?域。CRC校驗域包括傳輸數(shù)據(jù)的 15 bit Checksum值和 1 bit 界定符。ACK域包括 1 bit ACK位和 1 bit 界定符。消息層面的校驗還包括格式錯誤校驗,格式錯誤校驗會檢查消息幀中必須為隱性的位,如果這些位表現(xiàn)為顯性,那么節(jié)點將報格式錯誤。格式錯誤檢查的隱性位包括SOF、EOF、ACK界定符和CRC界定符。

在比特層面,發(fā)送節(jié)點在發(fā)送消息的同時會檢測總線電平,如果檢測到總線的狀態(tài)和它發(fā)送的狀態(tài)不符,則發(fā)送節(jié)點將報錯。該過程的兩處例外是消息幀處于標識符仲裁階段和消息應答階段。

最后一種錯誤校驗機制源于CAN總線的位填充機制。除了錯誤標志和EOF,如果節(jié)點檢測到連續(xù)?6?個相同電平,它即報填充錯誤。主動錯誤標志包括連續(xù)6個顯性位,總線上所有檢測到主動錯誤標志的節(jié)點都會報錯,而產(chǎn)生各自的錯誤幀,這意味著總線上的錯誤幀可能由原先的?6 bit?到反饋疊加至?12 bit?不等。錯誤幀后面緊接著8個隱性位界定符(如圖10)。在總線空閑時,消息通過競爭仲裁獲得總線占用權(quán)后將重新傳送。

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

CRC錯誤(CRC Error)

在發(fā)送消息時,發(fā)送節(jié)點會根據(jù)特定的多項式計算出由數(shù)據(jù)幀SOF位到數(shù)據(jù)域最末位的Checksum值,并將該值放在數(shù)據(jù)幀的CRC域,隨著數(shù)據(jù)幀廣播到總線上。接收節(jié)點在收到數(shù)據(jù)后,應用同樣的多項式計算Checksum值,并與收到的Checksum值對比。如果兩者一致,正常接收;如果不一致,則舍棄該消息,并發(fā)送錯誤幀請求發(fā)送節(jié)點重傳消息。CRC校驗過程如圖15所示。

CAN 2.0 規(guī)范定義CRC校驗應用的多項式為:


圖15. CRC校驗機制

應答錯誤(ACK Error)

發(fā)送單元在ACK位中檢測到隱性電平時所檢測到的錯誤(ACK沒被傳送過來時所檢測到的錯誤)。

格式錯誤(Form Error)

檢測出與固定格式的位段相反的格式時所檢測到的錯誤。

位錯誤(Bit Error)

比較輸出電平和總線電平(不含填充位),當兩電平不一樣時所檢測到的錯誤。

填充錯誤(Stuff Error)

在需要位填充的段內(nèi),連續(xù)檢測到?6?位相同的電平時所檢測到的錯誤。

故障限制

CAN總線上的每個節(jié)點控制器都會檢測消息是否出錯,如果節(jié)點發(fā)現(xiàn)消息出錯,它將發(fā)送錯誤標志,從而打斷總線上正常的數(shù)據(jù)傳輸??偩€上其它沒有發(fā)現(xiàn)原始消息錯誤的節(jié)點,在收到錯誤標志后將采取必要的措施,比如舍棄當前總線上的消息。CAN節(jié)點內(nèi)部有兩種錯誤狀態(tài)計數(shù)器?TEC?和?REC?。節(jié)點通過特定的規(guī)則管理這兩個計數(shù)器的值,其中:

TEC?/Transmit Error Counter,發(fā)送錯誤狀態(tài)計數(shù)器,出現(xiàn)一次錯誤該計數(shù)器值?+8;

REC?/Receive Error Counter,接收錯誤狀態(tài)計數(shù)器,出現(xiàn)一次錯誤該計數(shù)器值?+1;

消息成功發(fā)送或接收一次,對應的?TEC?或?REC?值相應?-1

TEC?增加的速度快于?REC?增加的速度,這是因為有很大概率地是發(fā)送節(jié)點,而不是接受節(jié)點出錯!基于?TEC?和?REC數(shù)值的變化,CAN規(guī)范定義了節(jié)點的?3?種基本錯誤狀態(tài):

Error Active:正常狀態(tài),在此狀態(tài)下,節(jié)點可以發(fā)送所有類型的幀,包括錯誤幀;

Error Passive:節(jié)點可以發(fā)送除錯誤幀以外的所有幀;

Bus Off:節(jié)點被控制器從總線上隔離

節(jié)點的三種錯誤狀態(tài)切換關(guān)系如圖16所示。


圖16. CAN總線節(jié)點錯誤狀態(tài)切換圖

波形舉例

圖17示例CAN通信過程信號波形。

在?1?時刻,節(jié)點A向總線上發(fā)送消息;

在?2?時刻,節(jié)點B和C收到消息,發(fā)送響應應答;

在?3?時刻,節(jié)點B和C同時向總線上發(fā)送消息,競爭仲裁后節(jié)點C獲得總線占用權(quán),

4?時刻繼續(xù)發(fā)送未傳輸完畢的數(shù)據(jù);

節(jié)點A和B在?5?時刻響應C發(fā)送的消息;

在總線空閑的?6?時刻,B發(fā)送消息到總線上;

7?時刻節(jié)點A和B響應節(jié)點B發(fā)送的消息;

?8?時刻,節(jié)點A向空閑總線上發(fā)送消息。


圖17. CAN通信過程舉例

編后記

一直以來,對CAN總線的認識僅限于收發(fā)器、電平端接以及高低速的區(qū)分。作為“業(yè)內(nèi)人士”,對汽車電子行業(yè)內(nèi)最為基礎(chǔ)的通信協(xié)議卻不甚了了,頗有些“平生不識陳近南”的遺憾,因此很早軍規(guī)就萌生撰寫一篇CAN總線文章的念頭。然而手頭資料太多,不知從何下手,終于好不容易鼓起勇氣,在印象筆記內(nèi)敲下“CAN總線協(xié)議”的標題,也是整整一年前的事了(2016/05/31)。

拖延癥如此嚴重,\Database\Portocol\CAN?文件夾中囤積的資料越來越多。軍規(guī)悲觀地發(fā)現(xiàn),這些文檔雖然保存在本地,但99%以上的文檔,既然在下載的時候都沒有認真地閱讀和消化,又如何指望在未來的某一天與它再次重逢?

于是,自上月末起,軍規(guī)每日下班后抽出?1-2?小時,如此持續(xù)將近兩周,將先前搜集有關(guān)CAN總線的資料羅列、拼湊到這個地方,試圖將該命題下所有的知識點收服在自己的知識框架下。每寫完一個知識點,就刪掉本地幾篇講解同樣內(nèi)容的文檔。如同妖怪吸干人體之精華,吐掉無用的軀殼,大呼過癮!

當然,本文還是很原始的版本,其中不免有許多錯誤,而且還有不少知識點,比如同步、加密等,都沒有涉及到。鑒于此,軍規(guī)會在后續(xù)不斷地修正和完善它。(2017/05/06)

參考資料

CAN Bus?-Wikipedia

CAN 入門書?-Renesas

Learning Module CAN?-Vector

CAN?-CANAUTO

Can?Bus Id Filter And Mask?-De Montfort University

Data Communication in the Automobile: CAN?-Vector

CAN Protocol Tutorial?-Kvaser

SSP269: Data Transfer on CAN Data Bus II?-VW

Introduction to the Controller Area Network?-TI

轉(zhuǎn)載于:https://www.cnblogs.com/aaronLinux/p/11032911.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容