引言
本文將介紹CAN總線通信協(xié)議的基礎(chǔ)知識,目前的內(nèi)容僅為通用的協(xié)議部分,暫不涉及具體的外設(shè)模塊的用法。研究通信協(xié)議的具體內(nèi)容,主要是看建立通信的物理環(huán)境(信號與總線拓?fù)浣Y(jié)構(gòu)),通信過程的對象(通信幀),以及交互過程(通信或握手過程)。
在后續(xù)的文章中,將以實現(xiàn)本文描述的協(xié)議作為需求,結(jié)合具體的IP外設(shè),以及配套的軟件,基于具體的硬件電路實現(xiàn)功能。
CAN總線應(yīng)用
CAN總線有兩個ISO國際標(biāo)準(zhǔn):ISO11898 和 ISO11519。其中:
- ISO11898 定義了通信速率為 125 kbps~1 Mbps 的高速 CAN 通信標(biāo)準(zhǔn),屬于閉環(huán)總線,傳輸速率可達(dá)1Mbps,總線長度 ≤ 40米。
- ISO11519 定義了通信速率為 10~125 kbps 的低速 CAN 通信標(biāo)準(zhǔn),屬于開環(huán)總線,傳輸速率為40kbps時,總線長度可達(dá)1000米。
Tips: 總線的傳輸速率,又稱為總線的通信速率,指的是位速率,或稱為比特率(和波特率不是一回事),表示單位時間內(nèi),通信線路上傳輸?shù)亩M(jìn)制位的數(shù)量,其基本單位是 bps 或者 b/s (bit per second)。波特率強(qiáng)調(diào)的是傳送數(shù)據(jù)的同步載波信號的速率。
在汽車中為了滿足車載系統(tǒng)的不同要求,主要采用高速CAN和低速CAN。這兩者以不同的總線速率工作以獲得最佳的性價比,在兩條總線之間采用CAN網(wǎng)關(guān)進(jìn)行連接。
- 高速CAN總線(動力總線)的傳輸速率范圍在125kbit/s - 1Mbit/s之間,主要用于傳動系數(shù)傳輸?shù)膶崟r性要求(如發(fā)動機(jī)控制、自動變速箱控制、行駛穩(wěn)定系統(tǒng)、組合儀表等)。
- 低速CAN總線(舒適總線)的傳輸速率范圍在5kbit/s - 125kbit/s之間。主要用于舒適系統(tǒng)和車身系統(tǒng)的數(shù)據(jù)傳輸?shù)膶崟r性要求(如空調(diào)控制、座椅調(diào)節(jié)、車窗升降等)。
figure-can-network-in-car
圖x 整車CAN網(wǎng)絡(luò)示意圖CAN總線是一種串行數(shù)據(jù)通訊協(xié)議,其中包含了CAN協(xié)議的物理層以及數(shù)據(jù)鏈路層。可以完成對數(shù)據(jù)的位填充,數(shù)據(jù)塊編碼,循環(huán)冗余效驗,幀優(yōu)先級的判別等工作。其主要特點(diǎn)如下:
- 多主機(jī)方式工作,網(wǎng)絡(luò)上任意一個節(jié)點(diǎn)(未脫離總線)均可以隨時向總線網(wǎng)絡(luò)上發(fā)布報文幀。
- 節(jié)點(diǎn)發(fā)送的報文幀可以分為不同的優(yōu)先級,滿足不同實時要求。
- 采用載波偵聽多路訪問/沖突檢測(CSMA/CD)技術(shù),當(dāng)兩個節(jié)點(diǎn)同時發(fā)布信息時,高優(yōu)先級報文可不受影響地傳輸數(shù)據(jù)。
- 節(jié)點(diǎn)總數(shù)實際可達(dá)110個。
- 采用短幀結(jié)構(gòu),每一幀最多有8個有效字節(jié)的數(shù)據(jù)負(fù)載。短幀的優(yōu)勢在于,發(fā)送和接收速度快,實時性好,被干擾的概率小,抗干擾能力強(qiáng)。
- 當(dāng)某個節(jié)點(diǎn)錯誤嚴(yán)重時,具有自動關(guān)閉功能,切斷與總線的聯(lián)系,致使總線上的其他操作不受影響。
CAN總線信號與拓?fù)浣Y(jié)構(gòu)(物理層)
CAN總線采用雙線差分傳輸,兩根導(dǎo)線分別作為CAN_H、CAN_L,并在終端配備有120Ω的電阻。CAN收發(fā)器收到總線信號時,將信號電平轉(zhuǎn)化為邏輯狀態(tài),即CAN_H與CAN_L電平相減后,得到一個差分電平。各種干擾(如點(diǎn)火系統(tǒng))在兩根導(dǎo)線上的作用相同,相減后得到的插值電平可以濾過這些干擾(共模抑制)。
figure-can-bus-connection
圖x CAN總線連接CAN總線有兩種邏輯電平狀態(tài),即顯性與隱性。顯性電平代表“0”,隱性電平代表“1”。采用非歸零碼編碼,即在兩個相同電平之間并不強(qiáng)制插入一個零狀態(tài)電平。
- 高速CAN在傳輸隱性狀態(tài)位時,CAN_H與CAN_L上的電平位均為2.5V;在傳輸顯性狀態(tài)位時分別為3.5V與1.5V。
- 低速CAN在傳輸隱性狀態(tài)位時,CAN_H上的電平為0V,CAN_L上的電平為5V;在傳輸顯性狀態(tài)位時,CAN_H上的電平為3.6V,CAN_L為1.4V。
figure-can-voltage-high-speed
圖x 高速CAN總線上的信號電平
figure-can-voltage-low-speed
圖x 低速CAN總線上的信號電平為了確保通訊的正確性,總線信號必須在一定時間內(nèi)出現(xiàn)在總線上,并且保證被正確采樣??偩€信號傳輸有一定的時間延遲,最大的可靠的總線波特率與總線長度有關(guān)。ISO11898中對各種總線長度有著以下定義:
- 1Mbit/s 總線長度為40m(規(guī)范)。
- 500kbit/s 總線長度最大值為100m(建議值)。
- 250kbit/s 總線長度最大值為250m。
- 125kbit/s 總線長度最大值為500m。
- 40kbit/s 總線長度最大值為1000m。
接入CAN總線的設(shè)備需要滿足一定的條件:
- CAN通信線纜,實現(xiàn)節(jié)點(diǎn)的互聯(lián),是傳輸數(shù)據(jù)的通道。主要有:普通雙絞線,同軸電纜,光纖。
- CAN微控制器,嵌有部分或全部CAN控制模塊及相關(guān)接口的通用型微控制器現(xiàn)如今很多芯片都配備CAN接口。
- CAN收發(fā)器,將絕對電平信號表示的數(shù)據(jù)幀與差分信號表示的通信幀相互轉(zhuǎn)換。
集成CAN外設(shè)模塊的微控制器接入CAN總線,如圖x所示。
figure-can-transiver
圖x 微控制器通過CAN收發(fā)器接入CAN總線在這塊電路中,CAN外設(shè)同CAN收發(fā)器之間的兩根信號線CAN_TX
和CAN_RX
是單方向的位數(shù)據(jù)流,分別對應(yīng)發(fā)送數(shù)據(jù)和接收數(shù)據(jù),用絕對電平表示數(shù)據(jù)位;CAN收發(fā)器同總線之間的兩根信號線CAN_H
和CAN_L
的數(shù)據(jù)方向是雙向的,走的是差分電平信號。用邏輯分析儀可以觀察CAN_TX
和CAN_RX
上的數(shù)據(jù)幀,如圖x所示。至于CAN_H
和CAN_L
上的差分信號,可以通過示波器直接觀察,或者通常會使用“CAN分析儀”,一種可以抓CAN通信幀的抓包工具,將在后續(xù)文章中介紹。
figure-can-tx-line-waveform
圖x CAN_TX線上的信號波形## CAN通信幀格式
在CAN總線上,報文是以“幀”來發(fā)送的,每一幀都包含以下幾個部分:
- SOF幀起始:在總線空閑時,總線為隱性狀態(tài)。幀起始由單個顯性位構(gòu)成,標(biāo)志著報文的開始,并在總線上起著同步作用。
- 仲裁段:仲裁段定義了報文的標(biāo)識符,俗稱ID。在CAN2.0A規(guī)范中,標(biāo)識符為11位,而在CAN2.0B中擴(kuò)展到了29位。這意味著在2.0B中可以存在更多不同類型的報文,但是也降低了總線的利用率。仲裁段還包含RTR遠(yuǎn)程幀/數(shù)據(jù)幀控制位。
- DLC控制段:定義了數(shù)據(jù)域字節(jié)的長度。通過數(shù)據(jù)長度碼,接收節(jié)點(diǎn)可以判斷報文數(shù)據(jù)是否完整。
- DATA數(shù)據(jù)域:包含有0~8個字節(jié)數(shù)據(jù)。實際有效的數(shù)據(jù)負(fù)載。此處僅是基本CAN協(xié)議的定義,在CAN FD協(xié)議的通信幀中,有效數(shù)據(jù)負(fù)載可以達(dá)到64字節(jié),在更高速的CAN XL協(xié)議中,定義有效數(shù)據(jù)負(fù)載可達(dá)2048字節(jié)。
- CRC域:CRC又稱循環(huán)冗余碼校驗(Cyclical Redundancy Check),是數(shù)據(jù)通信中常見的查錯方法。
- ACK域:用于接收節(jié)點(diǎn)的反饋應(yīng)答。
- EOF幀結(jié)束:由一串7個隱性位組成,表示報文幀的結(jié)束。
CAN標(biāo)準(zhǔn)幀結(jié)構(gòu)如圖x所示。
figure-can-frame-standard
圖x CAN標(biāo)準(zhǔn)幀格式CAN2.0B中新增了擴(kuò)展幀,擴(kuò)展幀相對于標(biāo)準(zhǔn)幀,ID標(biāo)識符字段從11位擴(kuò)展到29位,可以容納更多的消息種類。如圖x所示。
figure-can-frame-ext
圖x CAN擴(kuò)展幀格式注意,擴(kuò)展幀的29位ID不是連續(xù)的,其中前11位同標(biāo)準(zhǔn)幀相同,之后緊跟著SRR和IDE位(均為1),然后才是接下來的18位ID。
開發(fā)CAN總線的過程中,主要關(guān)注CAN報文ID和數(shù)據(jù)域。根據(jù)客戶的要求,ECU接收自己需要的ID報文的同時,也向外發(fā)送別的ECU所需要的ID報文。一般不同整車廠在開發(fā)自己的CAN協(xié)議規(guī)范的同時,也會有自己的校驗機(jī)制,不滿足校驗規(guī)則的報文,數(shù)據(jù)將被ECU所遺棄。
CAN網(wǎng)絡(luò)通信
CAN網(wǎng)絡(luò)將多個CAN節(jié)點(diǎn)設(shè)備通過總線連接在一起,在通信過程中傳遞報文消息。通信過程以幀為基本通信單元??偩€上節(jié)點(diǎn)之間的通信過程大體有節(jié)點(diǎn)向總線發(fā)送消息,和節(jié)點(diǎn)向總線請求消息。
CAN報文幀種類
CAN總線報文傳輸有4種不同的格式:
- 數(shù)據(jù)幀:由發(fā)送節(jié)點(diǎn)發(fā)出,包含0 - 8個數(shù)據(jù)字節(jié)。主要用于本節(jié)點(diǎn)向總線主動發(fā)送數(shù)據(jù)。
- 遠(yuǎn)程幀:發(fā)送遠(yuǎn)程幀向網(wǎng)絡(luò)節(jié)點(diǎn)請求發(fā)送某一標(biāo)識符的數(shù)據(jù)幀。主要用于本節(jié)點(diǎn)向總線發(fā)出數(shù)據(jù)請求,被能夠提供數(shù)據(jù)的節(jié)點(diǎn)捕獲到后,再通過數(shù)據(jù)幀把消息發(fā)送到總線上。
- 錯誤幀:總線節(jié)點(diǎn)發(fā)現(xiàn)錯誤時,以錯誤幀的方式通知網(wǎng)絡(luò)上的其他節(jié)點(diǎn)。
- 過載幀:發(fā)送過載幀,表示當(dāng)前節(jié)點(diǎn)不能處理后續(xù)的報文(如幀延遲等)。
Ps:為了保持總線的利用率,在車載CAN總線上數(shù)據(jù)幀的報文一般均為8字節(jié)。
其中關(guān)于錯誤幀監(jiān)測的錯誤情況詳加說明。CAN總線將錯誤分為臨時性錯誤和長期性錯誤。前者主要由外部因素引起,如總線上驅(qū)動電壓波形不規(guī)整、有尖峰或毛刺時,其數(shù)據(jù)傳輸性能會受到一定程度的短期干擾。長期性錯誤則主要由網(wǎng)絡(luò)組建非正常狀況引起,比如接觸不良、線路故障、發(fā)送器或接收器失效等。CAN中每個具有數(shù)據(jù)通信能力的網(wǎng)絡(luò)單元內(nèi)部都集成有一個發(fā)送錯誤計數(shù)器和接收錯誤計數(shù)器,當(dāng)該單元在數(shù)據(jù)發(fā)送階段出現(xiàn)一次錯誤時,其發(fā)送錯誤計數(shù)器自加8;在數(shù)據(jù)接收階段出現(xiàn)一次錯誤時,其接收錯誤計數(shù)器自加1。在相應(yīng)計數(shù)器內(nèi)容非0的情況下,網(wǎng)絡(luò)單元每成功發(fā)送一幀,發(fā)送錯誤計數(shù)器自減1;每成功接收一幀,接收錯誤計數(shù)內(nèi)容原本小于127時自減1,大于127時被置為119 - 127之間任意值。這樣,如果某個網(wǎng)絡(luò)單元的錯誤計數(shù)在不斷增長,就說明該單元的數(shù)據(jù)通信在頻繁發(fā)生故障。當(dāng)計數(shù)器內(nèi)容超過一定閾值時,可以認(rèn)為該故障是由長期性錯誤引起的。這種機(jī)制保證了當(dāng)某一個節(jié)點(diǎn)出現(xiàn)故障的時候,不會造成總線長時間癱瘓。
仲裁機(jī)制
仲裁是CAN總線應(yīng)用中一個重要的概念。在CAN總線采用載波偵聽多路訪問/沖突檢測(CSMA/CD)技術(shù)。如果總線空閑(隱性位),那么每一個節(jié)點(diǎn)都可以開始發(fā)送報文。報文以顯性位(報文幀開始位)開始,接著是標(biāo)識符。如果多個節(jié)點(diǎn)同時開始發(fā)送報文,那么將使用“線與”仲裁機(jī)制(仲裁用邏輯“與”)來解決總線沖突,低電平(顯性位)將獲得仲裁,從而確定優(yōu)先級最高的報文,而不需要損失高優(yōu)先級報文的通信時間或數(shù)據(jù)(非破壞性仲裁)。仲裁機(jī)制使用標(biāo)識符ID為判斷依據(jù),不僅代表報文幀的內(nèi)容,還代表報文幀發(fā)送的優(yōu)先級。二進(jìn)制數(shù)越小的標(biāo)識符,優(yōu)先級越高;反之亦然。
關(guān)于報文的標(biāo)識符ID,這里要強(qiáng)調(diào)一個特別有用的知識點(diǎn)。CAN總線仲裁的是報文消息的優(yōu)先級,而不是節(jié)點(diǎn)的優(yōu)先級(CAN總線上的節(jié)點(diǎn)沒有優(yōu)先級)。例如,某個CAN總線節(jié)點(diǎn)發(fā)送低優(yōu)先級的報文時,可能被正在進(jìn)行的高優(yōu)先級報文通信搶占,但同一個節(jié)點(diǎn)發(fā)送更高優(yōu)先級的報文時,就可以獲得總線的使用權(quán)。報文的優(yōu)先級,也就是報文的標(biāo)識符ID,是由消息的表示的內(nèi)容決定的。這里面體現(xiàn)了一個“公平”合作的系統(tǒng),合作的開發(fā)者人人不分貴賤,只以任務(wù)的重要性獲取更多的資源,并且多個開發(fā)者可以共同做一個任務(wù),一個開發(fā)者也可以做多個不同的任務(wù)。整個總線上所有節(jié)點(diǎn)構(gòu)成的系統(tǒng)作為整體調(diào)度多任務(wù)。
總結(jié)
本文試圖用最簡約的描述總結(jié)出CAN總線通信協(xié)議的要點(diǎn)。CAN總線是一個共享介質(zhì)的總線結(jié)構(gòu),因此具備典型的總線型通信方式,例如通信過程建立在總線與節(jié)點(diǎn)之間(而不是點(diǎn)對點(diǎn)直連的通信),存在沖突檢測和仲裁等。需要注意的是,CAN總線通信的幀結(jié)構(gòu),包括各個字段的位置以及含義,這些數(shù)據(jù)位將以位流的方式出現(xiàn)在總線上,后續(xù)使用微控制器上的CAN外設(shè)模塊,也是在芯片內(nèi)部的緩沖區(qū)按照這些字段組織好數(shù)據(jù),交由外設(shè)收發(fā)引擎將位流轉(zhuǎn)變成電平信號接入總線。
關(guān)于CAN總線協(xié)議,仍有很多細(xì)節(jié)尚未在本文中記錄,例如CAN總線為了確保電平信號是“中和”的,會將超過連續(xù)5個相同的位流電平信號翻轉(zhuǎn),或是更詳細(xì)的錯誤檢測判定機(jī)制,這些電路系統(tǒng)中的設(shè)計,通常已經(jīng)固化在常規(guī)的集成電路中了,對于開發(fā)者來說,不需要直接操作。但如果仍有興趣繼續(xù)探究,可以參見標(biāo)準(zhǔn)化文檔ISO11989和ISO11519,通讀協(xié)議有注意讀者了解CAN總線通信的全貌,便于理解設(shè)定一些規(guī)則的來由,對于調(diào)試環(huán)節(jié)也大有裨益。
-
微控制器
+關(guān)注
關(guān)注
48文章
7552瀏覽量
151422 -
CAN總線
+關(guān)注
關(guān)注
145文章
1951瀏覽量
130757 -
通信協(xié)議
+關(guān)注
關(guān)注
28文章
883瀏覽量
40308 -
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
4469瀏覽量
51105 -
總線通信
+關(guān)注
關(guān)注
0文章
49瀏覽量
11830
發(fā)布評論請先 登錄
相關(guān)推薦
評論