CAN總線是一種常用的總線,對于剛開始接觸CAN總線的,面對著各式各樣的資料,可能不知道從何看起,今天科普一下CAN總線的基礎(chǔ)知識。CAN2.0協(xié)議分為A版本和B版本,A版本協(xié)議為11位標(biāo)識符(標(biāo)準(zhǔn)幀),B版本在兼容11位ID標(biāo)識符的同時(shí),向上擴(kuò)展到29位ID標(biāo)識符。
CAN總線的物理電平
對 CAN 總線的協(xié)議了解之前,先介紹一下 CAN總線的電平,CAN總線的基本狀態(tài)有兩種,分別為“顯性”和“隱性”,也就是“邏輯 0”和“邏輯 1”,如圖 1:
圖中兩個(gè) CAN 總線節(jié)點(diǎn)分別接在 CAN 總線上,兩個(gè)終端為什么要接兩個(gè) 120Ω的終端電阻?
首先解釋一下“終端電阻”這個(gè)名詞,終端電阻是一種信號在傳輸過程中遇到的阻礙,高頻信號傳輸時(shí),信號波長相對傳輸線較短,信號在傳輸線終端會形成反射波,干擾原信號,所以需要在傳輸線末端加終端電阻,使信號到達(dá)傳輸線末端后不反射。對于低頻信號則不用。在長線信號傳輸時(shí),一般為了避免信號的反射和回波,也需要在接收端接入終端匹配電阻。
終端匹配電阻值取決于電纜的阻抗特性,特別注意的是與電纜的長度無關(guān)。RS-485/RS-422 /CAN 總線一般采用雙絞線(屏蔽或非屏蔽)連接,終端電阻一般介于100至140Ω之間,典型值為120Ω。在實(shí)際配置時(shí),在電纜的兩個(gè)終端節(jié)點(diǎn)上,即最近端和最遠(yuǎn)端,各接入一個(gè)終端電阻,而處于中間部分的節(jié)點(diǎn)則不能接入終端電阻,否則將導(dǎo)致通訊出錯(cuò)。
現(xiàn)在繼續(xù)介紹 CAN 總線的邏輯,CAN 總線傳輸數(shù)據(jù)時(shí),依靠的是差分電平,因?yàn)?CAN 總線是雙絞線,所以在沒有數(shù)據(jù)傳輸時(shí),兩條線的電壓相同,均為2.5V,差值為 0,所以為“隱形”,若是有數(shù)據(jù)傳輸時(shí),兩條線就會出現(xiàn)電壓不通的情況,CAN_H 為 3.5V、CAN_L 為 1.5V,電壓差為 2V,所以為“顯性”。
現(xiàn)在用兩個(gè)等式來對 CAN 的電平做一個(gè)總結(jié),那就是:
CAN 總線為隱性 = 無電壓差 = 邏輯 1
CAN 總線為顯性 = 有電壓差 = 邏輯 0
CAN報(bào)文幀詳解
在了解 CAN 硬件之后,知道了邏輯“0”和邏輯“1”,CAN 報(bào)文幀就是由這些0和1組成。由圖可以看出,CAN-bus 的通信幀共分為五種幀: 數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀、過載幀和幀間隔 ,數(shù)據(jù)幀又有標(biāo)準(zhǔn)幀和擴(kuò)展幀兩種。
數(shù)據(jù)幀和遙控幀
在 CAN 協(xié)議中,數(shù)據(jù)幀和遙控幀有著諸多相同之處,將數(shù)據(jù)幀和遙控幀放在一起來講。數(shù)據(jù)幀是指包含了要傳輸?shù)臄?shù)據(jù)的幀,作用是承載發(fā)送節(jié)點(diǎn)要傳遞給接收節(jié)點(diǎn)的數(shù)據(jù)。
遙控幀的作用: 請求其它節(jié)點(diǎn)發(fā)出與本遙控幀具有相同 ID 號的數(shù)據(jù)幀。發(fā)起方發(fā)起特定ID的遙控幀,并且只發(fā)送ID部分,那么與其 ID相符的終端設(shè)備就有義務(wù)在后半段的數(shù)據(jù)部分接管總線控制權(quán)并發(fā)送自己的數(shù)據(jù)。
例如中控機(jī)需要定時(shí)獲取某個(gè)節(jié)點(diǎn)的數(shù)據(jù)(例如轉(zhuǎn)速計(jì)的實(shí)時(shí)轉(zhuǎn)速、油量計(jì)的實(shí)時(shí)油量等),可以向總線發(fā)送遠(yuǎn)程幀;相應(yīng)節(jié)點(diǎn)在接收判斷幀 ID與自己相符、并且是遠(yuǎn)程幀的情況下,就可以將自己的實(shí)時(shí)數(shù)據(jù)發(fā)送到總線上;這樣中控機(jī)就獲取到了相關(guān)節(jié)點(diǎn)的實(shí)時(shí)數(shù)據(jù)。
遠(yuǎn)程幀最大的好處就是只需要一幀的時(shí)間就能完成一次雙向交互。
兩種幀格式由幀起始、仲裁幀、控制端、數(shù)據(jù)段、CPC 段、ACK 段、幀結(jié)束, 不同的段有不同的用途。
起始段
幀的最開始的一位是幀起始,也叫 SOF(Start Of Frame),SOF 恒為顯性位,即邏輯0。幀起始表示CAN_H和CAN_L上有了電位差,也就是說,一旦總線上有了 SOF 就表示總線上開始有報(bào)文了。
仲裁段
CAN 總線有一個(gè)特點(diǎn),就是所有節(jié)點(diǎn)均可以獲得總線的控制權(quán)并且向 CAN 總線發(fā)送數(shù)據(jù),當(dāng)同時(shí)有 2 個(gè)或 2 個(gè)以上的設(shè)備要求發(fā)送數(shù)據(jù)時(shí),就會產(chǎn)生總線沖突,這時(shí)就需要判斷一個(gè)先后順序,而仲裁段就是判斷先后順序的裁判員,仲裁段會對 CAN 數(shù)據(jù)進(jìn)行比較,ID 碼值越小的數(shù)據(jù)越具有優(yōu)先權(quán),從而使具有高優(yōu)先級的數(shù)據(jù)不受任何損壞地傳輸。
仲裁段是如何仲裁的?各節(jié)點(diǎn)在向總線發(fā)送電平的同時(shí),也對總線上的電平讀取,并與自身發(fā)送的電平進(jìn)行比較,如果電平相同繼續(xù)發(fā)送下一位,不同則停止發(fā)送退出總線競爭。剩余的節(jié)點(diǎn)繼續(xù)上述過程,直到總線上只剩下1個(gè)節(jié)點(diǎn)發(fā)送的電平,總線競爭結(jié)束,優(yōu)先級高的節(jié)點(diǎn)獲得總線的控制權(quán)。
假設(shè) CAN 總線上有兩個(gè)節(jié)點(diǎn),節(jié)點(diǎn)A和節(jié)點(diǎn) B,節(jié)點(diǎn)A 的 ID為 10101000000,節(jié)點(diǎn) B 的ID為 101100000,當(dāng)節(jié)點(diǎn) A 和節(jié)點(diǎn) B 同時(shí)向CAN 總線發(fā)送數(shù)據(jù)時(shí),如下圖,當(dāng)發(fā)送到 ID7 時(shí),節(jié)點(diǎn) A 仲裁成功,從而獲得 CAN 總線的控制權(quán),繼而發(fā)送全部消息。
總線中的信號持續(xù)跟蹤最后獲得總線控制權(quán)發(fā)出的報(bào)文,在這里值得注意的是,CAN 總線的這種仲裁方式優(yōu)點(diǎn)在于,無論是總線的控制權(quán)在哪個(gè)節(jié)點(diǎn),CAN 總線傳輸?shù)膱?bào)文已經(jīng)在總線上傳輸了。
因此,CAN 總線具有高優(yōu)先級的節(jié)點(diǎn)的數(shù)據(jù)在傳輸時(shí),沒有任何延遲,在獲得總線控制權(quán)的節(jié)點(diǎn)發(fā)送數(shù)據(jù)過程中,其他節(jié)點(diǎn)成為報(bào)文的接收節(jié)點(diǎn),并且不會在總線再次空閑之前發(fā)送報(bào)文。
仲裁段是用來判定一幀報(bào)文優(yōu)先級的依據(jù) ,仲裁段中的 ID 號也是實(shí)現(xiàn)報(bào)文過濾機(jī)制的基礎(chǔ)。那么不同幀的優(yōu)先級是怎么體現(xiàn)的呢?
RTR 位: Tranmission Request Bit (遠(yuǎn)程發(fā)送請求位),RTR 用來區(qū)分該幀是數(shù)據(jù)幀還是遠(yuǎn)程幀。當(dāng) RTR為邏輯 0 時(shí),代表該幀為數(shù)據(jù)幀;當(dāng) RTR 為邏輯 1 時(shí),代表該幀為遠(yuǎn)程幀。
由圖可以看出,當(dāng)四種傳輸幀時(shí),由于標(biāo)準(zhǔn)數(shù)據(jù)幀和擴(kuò)展數(shù)據(jù)幀的RTR 都為 0,可以看出數(shù)據(jù)幀的優(yōu)先級大于遠(yuǎn)程幀的優(yōu)先級。RTR 的作用是在前 11 位 ID 號相同的情況下,保證數(shù)據(jù)幀優(yōu)先級高于遠(yuǎn)程幀。
SRR 位: Substitutes for Remote Requests Bit(替代遠(yuǎn)程請求位)
在擴(kuò)展幀(數(shù)據(jù)幀或遙控幀)中,SRR 恒為隱性位 1,并且可以發(fā)現(xiàn),擴(kuò)展幀的隱性 SRR 位正好對應(yīng)標(biāo)準(zhǔn)數(shù)據(jù)幀的顯性 RTR 位,可以看出標(biāo)準(zhǔn)幀的優(yōu)先級高于擴(kuò)展幀。SRR 位的作用,在前 11 位 ID 號相同的情況下,標(biāo)準(zhǔn)數(shù)據(jù)幀的優(yōu)先級高于擴(kuò)展數(shù)據(jù)幀。
IDE 位: Identifier Extension Bit(標(biāo)識符擴(kuò)展位),IDE 用來區(qū)分該幀是標(biāo)準(zhǔn)幀幀還是擴(kuò)展幀。當(dāng) IDE 為邏輯 0 時(shí),代表該幀為標(biāo)準(zhǔn)幀;當(dāng) IDE 為邏輯 1 時(shí),代表該幀為擴(kuò)展幀。擴(kuò)展幀 IDE 位和標(biāo)準(zhǔn)幀 IDE 位位置對應(yīng),可以看出,標(biāo)準(zhǔn)遙控幀的優(yōu)先級一定高于擴(kuò)展遙控幀。IDE 位的作用,在前 11 位相同的情況下,標(biāo)準(zhǔn)數(shù)據(jù)幀的優(yōu)先級高于擴(kuò)展數(shù)據(jù)幀。
在 ID 號前 11 位相同的情況下:
RTR :保證數(shù)據(jù)幀優(yōu)先級高于遠(yuǎn)程幀;
SRR :保證標(biāo)準(zhǔn)數(shù)據(jù)幀的優(yōu)先級高于擴(kuò)展數(shù)據(jù)幀。
IDE :保證標(biāo)準(zhǔn)遙控幀的優(yōu)先級高于擴(kuò)展遠(yuǎn)程幀。
控制段
控制段由6個(gè)位組成,標(biāo)準(zhǔn)格式和擴(kuò)展格式的控制場格式不同。
標(biāo)準(zhǔn)格式里的幀包括:數(shù)據(jù)長度代碼、IDE 位(為顯性位)及保留位 RB0。
擴(kuò)展格式里的幀包括:數(shù)據(jù)長度代碼、兩個(gè)保留位 RB0 和 RB1。其保留位必須發(fā)送為顯性,但是接收器認(rèn)可“顯性”和“隱性”位的任何組合,其結(jié)構(gòu)如圖所示:
數(shù)據(jù)幀長度代碼(DLC),指示了數(shù)據(jù)場里的字節(jié)數(shù)量。其中:d—“顯性”, r—“隱性”, 數(shù)據(jù)幀允許的數(shù)據(jù)字節(jié)數(shù)為{0,1,...,7,8}。其他的數(shù)值不允許使用。
數(shù)據(jù)段
數(shù)據(jù)段由數(shù)據(jù)幀里的發(fā)送數(shù)據(jù)組成。它可以為 0~8 個(gè)字節(jié),每字節(jié)包含了 8 個(gè)位,首先發(fā)送最高有效位(MSB)。
CRC校驗(yàn)段
CRC 包含 CRC 校驗(yàn)序列和 CRC 界定符(恒為隱形,即邏輯 1),通過多項(xiàng)式生成 CRC 值,比較發(fā)送節(jié)點(diǎn)與接受節(jié)點(diǎn) CRC 是否一致,來確保幀的有效性,計(jì)算范圍包括發(fā)送節(jié)點(diǎn)【幀起始、仲裁場、控制場、數(shù)據(jù)場】是否與接收節(jié)點(diǎn)【幀起始、仲裁場、控制場、數(shù)據(jù)場】是否一致。
傳統(tǒng) CAN 使用的是 CRC15 的算法,這個(gè)通過 CAN 的數(shù)據(jù)結(jié)構(gòu)也可以看出,CRC段的長度就是 15 位。CAN FD 之所以有兩種是因?yàn)?CAN FD 的數(shù)據(jù)長度是可變的, 針對不同的數(shù)據(jù)長度使用的方法不同,低于 16 字節(jié)的使用的是 CRC17,高于 16 字節(jié)的使用的是 CRC21。
ACK段
ACK段包含 ACK 槽和 ACK 界定符兩個(gè)位。
發(fā)送節(jié)點(diǎn)在 ACK 段發(fā)送兩個(gè)隱性位,即發(fā)送方發(fā)出的報(bào)文中 ACK 槽為隱性 1;接收節(jié)點(diǎn)在接收到正確的報(bào)文之后會在 ACK 槽發(fā)送顯性位 0,通知發(fā)送節(jié)點(diǎn)正常接收結(jié)束。所謂接收到正確的報(bào)文指的是接收到的報(bào)文沒有填充錯(cuò)誤、格式錯(cuò)誤、CRC 錯(cuò)誤。
以標(biāo)準(zhǔn)數(shù)據(jù)幀為例來分析 ACK 段的工作方式,Node_A 為發(fā)送節(jié)點(diǎn), Node_B 為接收節(jié)點(diǎn)。Node_A 在 ACK 段發(fā)送兩個(gè)隱性位 1。Node_B 正確接收到這一報(bào)文后,在 ACK 段的 ACK 槽中填充了一個(gè)顯性位 0。注意,這個(gè)時(shí)候 Node_A 回讀到的總線上的額電平為顯性 0,于是這個(gè)時(shí)候,Node_A 就知道自己發(fā)出去的報(bào)文至少有一個(gè)節(jié)點(diǎn)正確接收了。
結(jié)束段(EOF)
每一個(gè)數(shù)據(jù)幀或遠(yuǎn)程幀均由 7 個(gè)連續(xù)的隱性位 1 組成。幀結(jié)束強(qiáng)制不遵守位填充特性,表達(dá)出明顯的結(jié)束標(biāo)識。這樣接收節(jié)點(diǎn)可以正確檢測到一個(gè)幀的傳輸結(jié)束。
評論
查看更多