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