《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > 一文了解CAN總線教程

一文了解CAN總線教程

2020-06-03
來源:與非網(wǎng)

先看看工作原理

當 CAN 總線上的一個節(jié)點(站)發(fā)送數(shù)據(jù)時,,它以報文的形式廣播給網(wǎng)絡(luò)中所有節(jié)點,對每個節(jié)點來說,無論數(shù)據(jù)是否是發(fā)給自己的,都對其接收。

 

每組報文開頭的 11 位字符為標識符,,定義了報文的優(yōu)先級,這種報文格式成為面向內(nèi)容的編制方案。同一系統(tǒng)中標識符是唯一的,,不可能有兩個站發(fā)送具有相同標識符的報文,當幾個站同時競爭總線讀取時,,這種配置十分重要,。

 

大體的工作原理我們搞清了,但是根本的協(xié)議我們還要花一番功夫,。下面介紹一個重要的名詞,,“顯性”和“隱性”:

 

在我看到的很多文章里,,有很多顯性和隱性的地方,為此我頭痛不已,,最終我把它們徹底弄明白了,。

 

首先 CAN 數(shù)據(jù)總線有兩條導(dǎo)線,一條是黃色的,,一條是綠色的 ------ 分別是 CAN_High 線和 CAN_Low 線,,當靜止狀態(tài)時,這兩條導(dǎo)線上的電平一樣,,這個電平稱為靜電平,,大約為 2.5 伏。

 

這個靜電平狀態(tài)就是隱形狀態(tài),,也稱隱性電平,,也就是沒有任何干擾的時候的狀態(tài)稱為隱性狀態(tài)。當有信號修改時,,CAN_High 線上的電壓值變高了,,一般來說會升高至少 1V;而 CAN_Low 線上的電壓值會降低一個同樣值,,也是 1v,。

 

那么這時候,CAN_High 就是 2.5v+1v=3.5v,,它就處于激活狀態(tài)了,。而 CAN_Low 降為 2.5v-1v=1.5v??梢钥纯催@個圖

 

5ed710374c28e-thumb.jpg

 

由此我們得到

 

在隱性狀態(tài)下,,CAN_High 線與 CAN_Low 沒有電壓差,這樣我們看到?jīng)]有任何變化也就檢測不到信號,。但是在顯性狀態(tài)時,,改值最低為 2V,我們就可以利用這種變化才傳輸數(shù)據(jù)了,。所以出現(xiàn)了那些幀,,那些幀中的場,那些場中的位,,云云,。

 

在總線上通常邏輯 1 表示隱性。而 0 表示顯性,。這些 1 啊,,0 啊,就可以利用起來為我們傳數(shù)據(jù)了,。利用這種電壓差,,我們可以接收信號,。

 

一般來說,控制單元通過收發(fā)器連接到 CAN 驅(qū)動總線上,,這個收發(fā)器(顧名思義,,可發(fā)送,可接收)內(nèi)有一個接收器,,該接收器是安裝在接收一側(cè)的差動信號放大器,。然后,這個放大器很自然地就放大了 CAN_High 和 CAN_Low 線的電平差,,然后傳到接收區(qū),。如下圖

 

 

5ed710375f0af-thumb.jpg


由上圖可知,當有電壓差,,差動信號放大器放大傳輸,,將相應(yīng)的數(shù)據(jù)位轉(zhuǎn)化為 0。

 

下面我們進入重點難點 ----- 報文

 

所謂報文,,就是 CAN 總線上要傳輸?shù)臄?shù)據(jù)報,,為了安全,我們要給我們傳輸?shù)臄?shù)據(jù)報編碼定一下協(xié)議,,這樣才能不容易出錯,,所以出現(xiàn)了很多的幀,以及仲裁啊,,CRC 效驗,。這些都是難點。

 

識別符的概念

識別符顧名思義,,就是為了區(qū)分不同報文的可以鑒別的好多字符位,。有標準的,和擴展的,。標準的是 11 位,,擴展的是 29 位。他有一個功能就是可以提供優(yōu)先級,,也就是決定哪個報文優(yōu)先被傳輸,,報文標識符的值越小,報文具有越高的優(yōu)先權(quán),。

 

CAN 的報文格式有兩種,不同之處其實就是識別符長度不同,,具有 11 位識別符的幀稱為標準幀,,而還有 29 位識別符的幀為擴展幀,CAN 報文有以下 4 個不同的幀類型,。分別是:

 

(1) 數(shù)據(jù)幀:數(shù)據(jù)幀將數(shù)據(jù)從發(fā)送器傳輸?shù)浇邮掌鳎?/p>


(2) 遠程幀:總線節(jié)點發(fā)出遠程幀,,請求發(fā)送具有同一標識符的數(shù)據(jù)幀,;


(3) 錯誤幀:任何節(jié)點檢測到總線錯誤就發(fā)出錯誤幀;


(4) 過載幀:過載幀用已在先行的后續(xù)的數(shù)據(jù)幀(或遠程幀)之間提供一附加的延時,。

 

我們先研究數(shù)據(jù)幀吧,。

 

一,數(shù)據(jù)幀由 7 個不同位場組成(幀起始,、仲裁場,、控制場、數(shù)據(jù)場,、CRC 場,、應(yīng)答場、幀結(jié)尾),。

 

這里的位場,,就是不同位的組合,這名字起的很爛,,讓人看了感覺很抽象,。我們來看看這些個不同的位場吧。一開始是一位幀起始,,也叫 SOF,。它用顯性位表示,也就是 0,;它告訴我們,,兩個線上有電壓差了,也就是有數(shù)據(jù)了,。

 

這個幀起始看起來只有一位,,其實不簡單了。為了讓所有的分站都同步于發(fā)送報文的發(fā)送站,,好接收數(shù)據(jù),,有很多要考慮的地方。

 

5ed7103760dca-thumb.jpg

 

報文的數(shù)據(jù)幀結(jié)構(gòu)

 

然后下一個場是仲裁場,。這個仲裁很抽象,,其實在這里就是為了解決一個問題。如果 2 個或 2 個以上的單元同時開始傳送報文,,那么就會有總線訪問沖突,,那么仲裁機制就是用來根據(jù)標識符優(yōu)先級來一個一個的去掉低級別的數(shù)據(jù)。我們可以詳細的描述這場生動的爭搶總線的戰(zhàn)斗,。

 

當總線處于空閑狀態(tài)時呈隱性電平,,此時任何節(jié)點都可以向總線發(fā)送顯性電平作為幀的開始。2 個或 2 個以上的節(jié)點同時發(fā)送開始爭搶總線,但是總線只能被一個人搶走,。這時候到底怎么決定誰留下,,誰滾蛋呢。我們開始思索,,我們以前定義了標識符,,標識符有優(yōu)先級,它越小,,它優(yōu)先級越高,。那么怎么實現(xiàn)的呢??聪旅鎴D:

 

首先搞明白兩點,,


一、下圖中,, 低波形代表 0(顯性),,高波形代表 1(隱性);


二,、當隱性碰到顯性,,就變?yōu)轱@性。

 

 

5ed7103756027-thumb.jpg


如圖所示,,節(jié)點 A 和節(jié)點 B 的標識符的第 10,、9、8 位電平相同,,因此兩個節(jié)點偵聽到的信息和它們發(fā)出的信息相同,。第 7 位節(jié)點 B 發(fā)出一個“1”,但從節(jié)點上接收到的消息卻是“0”,。

為什么呢,,因為 A 節(jié)點同時發(fā)出顯性位,讓總線也變成

顯性了,,也就是 0,。節(jié)點 B 會退出發(fā)送處于單純監(jiān)聽方式而不發(fā)送數(shù)據(jù);節(jié)點 A 成功發(fā)送仲裁位從而獲得總線的控制權(quán),,繼而發(fā)送全部消息,。

 

總線中的信號持續(xù)跟蹤最后獲得總線控制權(quán)發(fā)出的報文,本例中節(jié)點 A 的報文將被跟蹤,。這種非破壞性位仲裁方法的優(yōu)點在于,,在網(wǎng)絡(luò)最終確定哪個節(jié)點被傳送前,報文的起始部分已經(jīng)在網(wǎng)絡(luò)中傳輸了,,因此具有高優(yōu)先級的節(jié)點的數(shù)據(jù)傳輸沒有任何延時,。

 

在獲得總線控制權(quán)的節(jié)點發(fā)送數(shù)據(jù)過程中,,其他節(jié)點成為報文的接收節(jié)點,并且不會在總線再次空閑之前發(fā)送報文,,在這逐位的比較中,最終節(jié)點 B 因為第七位的偏差丟掉了總線,。從此單純監(jiān)聽,,江山就拱手讓給了節(jié)點 A 了。這就是仲裁機制,。

 

上面我們說過,,報文有兩種格式,標準和擴展,。這里,,不同的格式仲裁場是不一樣的。標準格式下,,仲裁場由 11 位識別符和 RTR 位組成,。

 

但在擴展格式里,包括 29 位識別符,、SRR 位,、IDE 位、RTR 位,。

 

RTR 位,,Remote Tranmission Request BIT 全稱為遠程發(fā)送請求位。它在數(shù)據(jù)幀里必須為顯性 0 ,,但在遠程幀里為隱性 1,。

 

我暈,為什么這么搞呢,,不急,,先留著這個問題。

 

SRR 位,,替代遠程請求位,,SRR 是一隱性位,也就是 1,,它在擴展格式的標準幀 RTR 位位置,,那么標準幀怪不得優(yōu)先于擴展幀了,因為在傳輸完 11 位標識符之后(擴展幀的后 18 位在最后發(fā)送,,先發(fā)送 11 位標識符),,輪到標準幀的 RTR 位和擴展幀的 SRR 位了。

 

這時候,,標準幀的 RTR 為顯性,,而擴展幀 SRR 為隱性,,這樣,總線自然就被標準幀占據(jù),。

 

同時上面那個問題,,也一目了然了,CAN 總線協(xié)議設(shè)計者,,肯定是設(shè)計了數(shù)據(jù)幀優(yōu)先于遠程幀,。所以 IDE(Identifier Extension Bit),全稱識別符擴展位,,它屬于擴展格式的仲裁場,。

 

對于擴展格式,IDE 位屬于仲裁場,;對于標準格式,,IDE 位屬于控制場。標準格式的 IDE 位為“顯性”,,而擴展格式的 IDE 位為“隱性”,。

 

5ed710376e327-thumb.jpg


標準格式中的數(shù)據(jù)幀

 

5ed710376522e-thumb.jpg


拓展格式中的數(shù)據(jù)幀

 

控制場

 

控制場由 6 個位組成,標準格式和擴展格式的控制場格式不同,。標準格式里的幀包括數(shù)據(jù)長度代碼,、IDE 位(為顯性位)及保留位 r0。擴展格式里的幀包括數(shù)據(jù)長度代碼和兩個保留位:r1 和 r0,。其保留位必須發(fā)送為顯性,,但是接收器認可“顯性”和“隱性”位的任何組合。其結(jié)構(gòu)如圖所示:

 

5ed710378cce1-thumb.jpg

 

控制場結(jié)構(gòu)

 

數(shù)據(jù)長度代碼(標準格式以及擴展格式)DLC,,如下表所示

 

5ed71037a4500-thumb.jpg


數(shù)據(jù)幀長度代碼 DLC

 

數(shù)據(jù)長度代碼指示了數(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 個字節(jié),每字節(jié)包含了 8 個位,,首先發(fā)送最高有效位(MSB),。

 

循環(huán)冗余碼 CRC 場是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定,。

 

CRC 場包括 CRC 序列(CRC Sequence),,其后是 CRC 界定符(CRC Delimiter),,結(jié)構(gòu)如圖:

 

5ed71037a5097-thumb.jpg

 

生成 CRC 碼的基本原理:

 

任意一個由二進制位串組成的代碼都可以和一個系數(shù)僅為‘0’和‘1’取值的多項式一一對應(yīng)。例如:代碼 1010111 對應(yīng)的多項式為 x6+x4+x2+x+1,,而多項式為 x5+x3+x2+x+1 對應(yīng)的代碼 101111,。

 

參考一下下面的例題,自已再領(lǐng)悟一下吧,!已知信息位為 1101,,生成多項式 G(x)= x3+x+1,求 CRC 碼,。

 

要傳輸?shù)男畔⑿蛄袨?1101,在末尾添加所給多項式的最高次階個 0,,如本題為 x^3,,則添加 3 個 0,變?yōu)椋?101000;

 

由多項式 G(X)=X3+X+1,,得其階數(shù)為 1 的二進制編碼為:1011,;1101000 對 1011 進行模二除法,所得到的余數(shù)即為校驗碼,,把校驗碼添加在原數(shù)據(jù)尾部即為所求的編碼,則實際發(fā)送的數(shù)據(jù)序列為 1101001,。校驗碼計算過程如圖所示:

 

5ed71037b1444-thumb.jpg


模二除法

 

應(yīng)答場(ACK Field)

應(yīng)答場長度為 2 個位,包含應(yīng)答間隙(ACK Slot)和應(yīng)答界定符(ACK Delimiter),,如圖所示,。在 ACK 場(應(yīng)答場)里,發(fā)送節(jié)點發(fā)送兩個“隱性”位,。

 

當接收器正確地接收到有效的報文,,接收器就會在應(yīng)答間隙(ACK Slot)期間向發(fā)送器發(fā)送一“顯性”位以示應(yīng)答。

 

5ed71037b048e-thumb.jpg


幀結(jié)尾

 

每一個數(shù)據(jù)幀和遠程幀均由一標志序列界定,。這個標志序列由 7 個“隱性”位組成,。

 

二、遠程幀

通過發(fā)送遠程幀,,總線的節(jié)點發(fā)出遠程幀,,請求以前發(fā)送給它數(shù)據(jù)幀的節(jié)點再發(fā)送一遍。具體發(fā)送哪個數(shù)據(jù)幀,,由遠程幀的標識符決定,。

 

與數(shù)據(jù)幀類似,遠程幀也有標準格式和擴展格式,,而且都由 6 個不同的位場組成:幀起始,、仲裁場、控制場,、CRC 場,、應(yīng)答場,、幀結(jié)尾。

 

與數(shù)據(jù)幀相反,,遠程幀的 RTR 位是“隱性”的,。它沒有數(shù)據(jù)場,數(shù)據(jù)長度代碼 DLC 的數(shù)值是不受制約的(可以標注為容許范圍0~8 里的任何數(shù)值),,此數(shù)值是相應(yīng)于數(shù)據(jù)幀的數(shù)據(jù)長度代碼,。遠程幀結(jié)構(gòu)如圖所示:

 

5ed71037b71e2-thumb.jpg


遠程幀結(jié)構(gòu)

 

三、錯誤幀

錯誤幀由兩個不同的場組成,,第一個場是不同節(jié)點提供的錯誤標志(Error Flag)的疊加,,第二個場是錯誤界定符。

 

為了能正確地終止錯誤幀,,“錯誤認可”的節(jié)點要求總線至少有長度為 3 個位時間的總線空閑,。因此,總線的載荷不應(yīng)為 100%,。錯誤幀結(jié)構(gòu)如圖:

 

5ed71037c9b90-thumb.jpg


錯誤幀結(jié)構(gòu)(圖中統(tǒng)一起見出錯幀改為錯誤幀)

 

(1) 錯誤標志,,有兩種形式的錯誤標志:激活錯誤標志 和 認可錯誤標志


“激活錯誤”標志由 6 個連續(xù)的“顯性”位組成;“認可錯誤”標志由 6 個連續(xù)的“隱性”的位組成,,除非被其他節(jié)點的“顯性”位重寫,。

 

(2) 錯誤界定符,錯誤界定符包括 8 個“隱性”的位,。

 

錯誤標志傳送了以后,,每一個節(jié)點就發(fā)送一個“隱性”的位,并一直監(jiān)視總線直到檢測出一個“隱性”的位為止,,然后就開始發(fā)送其余 7 個“隱性”位,。

 

四、過載幀

過載幀(Overload Frame)包括兩個位場:過載標志 和 過載界定符,,其結(jié)構(gòu)如圖:

 

5ed71037d63df-thumb.jpg


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

 

有三種過載的情況會引發(fā)過載標志的傳送:接收器的內(nèi)部情況,,需要延遲下一個數(shù)據(jù)幀和遠程幀。

 

在間歇(Intermission)的第 1 和第 2 字節(jié)檢測到一個“顯性”位,。這里有個間歇的概念,。我們可以講講。間歇屬于幀間空間的一部分,。它包含三個隱性位,。間歇期間,所有的站不允許傳送數(shù)據(jù)幀或遠程幀,。它唯一要做的就是標示一個過載條件,。

 

如果 CAN 節(jié)點在錯誤界定符或過載界定符的第 8 位(最后一位)采樣到一個顯性位,節(jié)點會發(fā)送一個過載幀,。該幀不是錯誤幀,,錯誤計數(shù)器不會增加,。

 

(1)過載標志(Overload Flag)


過載標志由 6 個“顯性”的位組成。過載標志的所有形式和“激活錯誤”標志的一樣,。

 

(2)過載界定符(Overload Delimiter)


過載界定符包括 8 個“隱性”的位,。

 

五、幀間空間

數(shù)據(jù)幀(或遠程幀)與先行幀的隔離是通過幀間空間實現(xiàn)的,,無論此先行幀類型如何(數(shù)據(jù)幀,、遠程幀、錯誤幀,、過載幀),。

 

幀間空間包括間歇、總線空閑的位場,。如果“錯誤認可”的節(jié)點已作為前一報文的發(fā)送器,,則其幀間空間除了間歇、總線空閑外,,還包括稱作“掛起傳送”(暫停發(fā)送)(Suspend Transmission)的位場。

 

對于不是“錯誤認可”的節(jié)點,,或作為前一報文的接收器的節(jié)點,,其幀間空間如圖:

 

5ed71037def59-thumb.jpg


非 “錯誤認可”幀間空間

 

對于作為前一報文發(fā)送器的“錯誤認可”的節(jié)點,其幀間空間如圖:

 

5ed71037e2af8-thumb.jpg


“錯誤激活”幀間空間

 

(1)總線空閑(Bus Idle)
總線空閑的時間是任意的,。只要總線被認定為空閑,,任何等待發(fā)送報文的節(jié)點就會訪問總線。在發(fā)送其他報文期間,,有報文被掛起,,對于這樣的報文,其傳送起始于間歇之后的第一個位,??偩€上檢測到的“顯性”的位可被解釋為幀的起始。

 

(2)掛起傳送(Suspend Transmission)
“錯誤認可”的節(jié)點發(fā)送報文后,,節(jié)點就在下一報文開始傳送之前或總線空閑之前發(fā)出 8 個“隱性”的位跟隨在間歇的后面,。如果與此同時另一節(jié)點開始發(fā)送報文(由另一節(jié)點引起),則此節(jié)點就作為這個報文的接收器,。

 

最后用腦圖總結(jié):

 

5ed7103805a60-thumb.jpg

 

再來幾張實物圖:


5ed71038206a1-thumb.jpg


CAN 總線接收芯片

 

5ed71038219c0-thumb.jpg


CAN 總線控制器芯片

 

5ed7103834493-thumb.jpg


標準數(shù)據(jù)幀波形捕獲

 

5ed7103842825-thumb.jpg


擴展數(shù)據(jù)幀波形捕獲


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。