本文力求以圖文并茂來接好CAN通訊協(xié)議的基礎(chǔ)知識,希望能給有興趣的朋友帶來一些收獲。
為了便于大家理解與接受,請先看一幅圖:
圖1 電話會議
簡單地講CAN總線就如上圖1中兩根粗黃線,其通訊原理:好比開一個電話會議,大家都撥進來了,這時會議的狀態(tài)可能是:
一人說,其他人聽;
兩人甚至多人同時開口了,但只會讓另一人說,其他人聽;
一人要求另一人說;
有人睡著了,掉線了,電話卡頓了... ...
針對于上述各種情況,要保證這個電話會議的有序高效地進行,那么我們需要有一些約定俗成的規(guī)定或協(xié)議,大家都遵守。CAN總線通訊與這種電話會議形式有異曲同工之處,那么CAN總線通訊到底具體是怎么回事?接下來將以理論與實踐相結(jié)合方法來介紹CAN通訊協(xié)議。
第1部分 概覽
感謝前人引路,激勵后人前行,先簡要引自:
控制器局域網(wǎng)CAN( Controller Area Network)屬于現(xiàn)場總線的范疇,是一種有效支持分布式控制系統(tǒng)的串行通信網(wǎng)絡。是由德國博世公司在20世紀80年代專門為汽車行業(yè)開發(fā)的一種串行通信總線。由于其高性能、高可靠性以及獨特的設計而越來越受到人們的重視,被廣泛應用于汽車業(yè)、航空業(yè)、工業(yè)控制、安全防護等領(lǐng)域。隨著CAN總線在各個行業(yè)和領(lǐng)域的廣泛應用,對其的通信格式標準化也提出了更嚴格的要求。1991年CAN總線技術(shù)規(guī)范(Version2.0)制定并發(fā)布。該技術(shù)規(guī)范共包括A和B兩個部分。其中2.0A給出了CAN報文標準格式,而2.0B給出了標準的和擴展的兩種格式。
1.1 CAN總線架構(gòu)簡介
CAN總線是一種用于在不同的ECU(電子控制單元)之間傳輸數(shù)據(jù)的線,CAN總線協(xié)議是一種ISO 國際標準化的串行通信協(xié)議,有 ISO-11898 和 ISO-11519兩個系列。其定義有:
ISO-11898 定義了通信速率為 125 kbps ~1Mbps 的高速 CAN 通信標準,屬于閉環(huán)總線,傳輸速率可達1Mbps,總線長度 ≤ 40米,如圖2。
ISO11519 定義了通信速率為 10~125 kbps 的低速 CAN 通信標準,屬于開環(huán)總線,傳輸速率為40kbps時,總線長度可達1000米,如圖2。
圖2 兩類CAN總線(引自[1])
高速CAN和低速CAN廣泛應用于汽車總線,如下圖3。
圖3 兩類CAN總線應用在汽車(引自[2])
CAN總線終端電阻的作用?為什么是120Ω?為什么是0.25W?
CAN通訊速率(位速率)與CAN總線長度的關(guān)系大致如下圖。
以上介紹了高低速CAN兩種總線架構(gòu)的基本概念,接下來具體看看這兩種CAN總線。
1.2 CAN總線結(jié)構(gòu)信息
將上圖2細化,我們可以看到兩種CAN總線結(jié)構(gòu)都有CAN_H,CAN_L兩根線和多個節(jié)點。其中CAN_H和CAN_L線是以雙絞形式纏繞,每個節(jié)點都有CAN收發(fā)器(transceiver)和CAN控制器(controller),CAN收發(fā)器和CAN控制器可能集成在芯片(on-chip),也可能是獨立于芯片(off-chip)。(圖3列舉了兩種CAN收發(fā)器--TJA1054和82C250)
圖4 兩類CAN總線(引自[3])
圖6 雙絞線形式(提高抗干擾能力,引自附1)
附1: CAN總線抗干擾的6條“軍規(guī)”zhuanlan.zhihu.com/p/26
1.3 CAN總線信號
CAN總線上,信號表現(xiàn)為電壓形式,通過CAN_H和CAN_L線上的電位差來表示CAN信號,分為顯性電平(dominant)和隱性電平(recessive)兩種類型。其中顯性電平規(guī)定為邏輯0,隱性電平則為邏輯1。其具體定義可通過下圖來理解。
圖7 ISO-11898 (高速CAN)和ISO-11519(低速CAN)的CAN信號定義(引自[3])
具體說,如上圖第1幅圖:當CAN_H和CAN_L的電壓均為2.5v,兩者電壓差為0,就規(guī)定CAN信號為隱性電平;當CAN_H的電壓為3.5v,CAN_L的電壓為1.5v,兩者電壓差為2V,就規(guī)定CAN信號為顯性電平。這里實際的規(guī)定是:電壓差滿足定義的一定范圍,就可以認為是顯性電平或者隱性電平,比如電壓差在1.5-2.5v范圍,都認為是顯性電平。
為了加深理解,看了一段實際采集的電壓形式的CAN信號:
圖8 高速CAN總線實際電壓狀態(tài)
1.4 CAN信號傳輸
上述的電位差(差分電平)與邏輯電平由CAN收發(fā)器實現(xiàn)。在發(fā)送過程,CAN控制器將CPU傳來的信號轉(zhuǎn)換為邏輯電平。CAN收發(fā)器接收邏輯電平之后,再將其轉(zhuǎn)換為差分電平輸出到CAN總線上。
圖9 CAN信號發(fā)送(引自3)
在接收過程,CAN收發(fā)器將CAN_H 和 CAN_L 線上傳來的差分電平轉(zhuǎn)換為邏輯電平輸出到CAN控制器,CAN控制器再把該邏輯電平轉(zhuǎn)化為相應的信號發(fā)送到CPU上。
圖10 CAN信號接收(引自3)
通俗地講,就是發(fā)送方通過CAN收發(fā)器使總線電平發(fā)生變化,將其信息傳遞到CAN總線上。接收方通過監(jiān)聽總線電平,將總線上的消息讀入自己的CAN收發(fā)器。
由上可知:CAN總線有2種架構(gòu),CAN信號有2種形式,CAN信號發(fā)送和接收2個過程。
第2部分 CAN總線特性
為了有助于理解后面講述的內(nèi)容,先看CAN總線有什么特性。
2.1 多主工作方式
CAN總線上的所有節(jié)點沒有主從之分,反應在數(shù)據(jù)傳輸上是:在總線空閑狀態(tài)下,任意節(jié)點都可以向總線上發(fā)送信息。另外:最先向總線發(fā)送信息的節(jié)點獲得總線的發(fā)送權(quán);當多個節(jié)點同時向總線發(fā)送消息時,所發(fā)送消息的優(yōu)先權(quán)高的那個節(jié)點獲得總線的發(fā)送權(quán)。
圖11 多主工作方式示意圖(引自[5])
圖11說明:0x12優(yōu)先級高于0x67,所以0x12先于0x67發(fā)送;緊接著0x52也要求發(fā)送,同樣其優(yōu)先級也高于0x67,所以0x52先于0x67發(fā)送,依次類推。這里0x12優(yōu)先級高于0x67是怎么判斷的呢?這就下個特點相關(guān)。
2.2 非破壞性仲裁機制
非破壞性仲裁機制是一種既不會造成已發(fā)送數(shù)據(jù)的延遲,也不會破壞已經(jīng)發(fā)送的數(shù)據(jù)的仲裁機制,其具體實施需要了解CAN協(xié)議幀結(jié)構(gòu),線與機制等。其中,線與機制簡單說就是位與計算,顯性電平會覆蓋隱性電平(換種方式理解:電路通路情況下,有一個端點接地(GND),那么整個電路電壓就接地了)。
圖12 線與機制圖解(引自[6])
再了解線與機制后,看一個簡單的仲裁例子,如下圖:
上圖:假設CAN總線上只有兩個節(jié)點 A和B,它倆的ID用邏輯電平表示,我們規(guī)定:從SOF位開始,從左往右逐位比較,只要出現(xiàn)位不一樣,比較就結(jié)束,顯性電平者勝出,有權(quán)發(fā)送。
當節(jié)點A,B都發(fā)送請求時,開始逐位比較,直到它倆的ID7位,節(jié)點A為顯性電平,節(jié)點B為隱性電平。根據(jù)線與機制,節(jié)點A勝出,優(yōu)先發(fā)送。這就是一個大致的非破壞性仲裁過程。為了精準地實施仲裁過程,對CAN協(xié)議幀結(jié)構(gòu)有嚴謹?shù)脑O計,后續(xù)將會詳細分析。
2.3 系統(tǒng)的柔軟性
與總線相連的節(jié)點沒有類似于“地址”的信息。因此在總線上增加節(jié)點時,連接在總線上的其它節(jié)點的軟硬件及應用層都不需要改變。
2.4 通信速度
根據(jù)整個網(wǎng)絡的規(guī)模,可設定適合的通信速度。在同一網(wǎng)絡中,所有單元必須設定成統(tǒng)一的通信速度。即使有一個單元的通信速度與其它的不一樣,此單元也會輸出錯誤信號,妨礙整個網(wǎng)絡的通信。不同網(wǎng)絡間則可以有不同的通信速度。(簡單一句話理解:雙方必須需要在同一頻道交流,不然溝通就有障礙)
引自[6]
2.5 遠程數(shù)據(jù)請求
可通過發(fā)送“遙控幀” 請求其他單元發(fā)送數(shù)據(jù)。
引自[6]
2.6 信息廣播
信息廣播就如:節(jié)點A發(fā)送一條ID 0x12的信息,然后節(jié)點B,C,D都能收到。
引自[5]
上圖節(jié)點B,C,D最終是否會接收這個0x12發(fā)送信息,與他們設置相關(guān),如下圖只有節(jié)點B設置接收,C,D將會丟棄該條信息,這個過程與報文過濾相關(guān)。
第3部分 CAN協(xié)議幀結(jié)構(gòu)
上述仲裁機制部分我們提到CAN協(xié)議幀,總的來說CAN協(xié)議幀有5種類型,下面逐個展開。
引自[4]
由于數(shù)據(jù)幀與遙控幀的最大差別在于遙控幀沒有數(shù)據(jù)段,所以將兩者放在一起講述:
3.1數(shù)據(jù)幀和遙控幀
數(shù)據(jù)幀和遙控幀都有標準格式和擴展格式,這2種格式都具有相同的幀結(jié)構(gòu)。
數(shù)據(jù)幀由7個段構(gòu)成,遙控幀由6個段構(gòu)成。先看數(shù)據(jù)幀:
圖13 數(shù)據(jù)幀結(jié)構(gòu)及其兩種格式(引自[4])
引自[6]
這里結(jié)合實際采集的CAN總線電壓信號來看下標準格式的數(shù)據(jù)幀。
圖14 標準(格式)數(shù)據(jù)幀的CAN總線電壓(引自[5])
再看遙控幀(也叫遠程幀):
圖15 遙控幀的兩種格式(引自[4])
通過圖13和15對比數(shù)據(jù)幀和遙控幀有:
通過對數(shù)據(jù)幀和遙控幀有了基本認識,下面我們再具體了解下每個段。
1) 幀起始(SOF, Start of Frame)
表示幀開始的段,1個位的顯性位。(總線空閑時為隱性位,故幀起始以顯性位非常好識別),對于數(shù)據(jù)幀和遙控幀的標準/擴展格式均如此。
引自[4]
2) 仲裁段(Arbitration field)
表示數(shù)據(jù)的優(yōu)先級的段,起作用就是根據(jù)報文ID來確定其發(fā)送優(yōu)先級。標準格式和擴展格式在此的構(gòu)成有所不同。
引自[4]
這里對比數(shù)據(jù)幀與遙控幀各自的兩個格式,其不同為:
針對上表的這種設計,后面會具體分析其在仲裁過程的作用。
3) 控制段(Control field)
表述數(shù)據(jù)段的字節(jié)數(shù),由6個位構(gòu)成,標準格式和擴展格式的構(gòu)成有所不同。
引自[4]
?
圖16 控制段與數(shù)據(jù)段的關(guān)系(引自[5])
4) 數(shù)據(jù)段(Data Field)
數(shù)據(jù)段可包含0-8個字節(jié)的數(shù)據(jù),從MSB(最高位)開始輸出。遙控幀沒有此段。
引自[4]
5) CRC段(Cyclic Redundancy Check Field)
檢查幀傳輸錯誤的幀,由15個位的CRC順序和1個位的CRC界定符(用于分隔位)構(gòu)成。CRC界定符恒為隱性。
引自[4]
這里CRC順序是根據(jù)多項式生成的CRC值,CRC的計算范圍包括幀起始,仲裁段,控制段和數(shù)據(jù)段。
圖17 CRC序列計算方法
附2:en.wikipedia.org/wiki/C , 如何通俗的理解CRC校驗并用C語言實現(xiàn), zhuanlan.zhihu.com/p/77
用來確認是否正常接收。由ACK槽(ACK Slot)和ACK界定符2個位構(gòu)成。
引自[4]
?
圖18 發(fā)送與接收時的ACK槽狀態(tài)(引自[3])
7) 幀結(jié)束(End of Frame)
表示該幀的結(jié)束的段。由7個位的隱性位構(gòu)成。
引自[4]
3.2 錯誤幀
用于在接收和發(fā)送消息時檢測出錯誤通知錯誤的幀,錯誤幀由錯誤標志和錯誤界定符構(gòu)成。
圖19 錯誤幀結(jié)構(gòu)(引自[4])
上圖的錯誤標志包括主動錯誤標志(6個位的顯性位)和被動錯誤標志(6個位的隱性位)兩種。主動錯誤標志處于主動錯誤狀態(tài)下的單元檢測出錯誤時輸出的錯誤標志。被動錯誤標志處于被動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標志。錯誤界定符由8個位的隱性位構(gòu)成。
注意上圖0~6位的錯誤標志重疊,這段怎么確定呢?需先介紹2個概念:位填充和錯誤類型。
1)位填充(Bit Stuffing)
位填充是為防止突發(fā)錯誤而設定的功能。當同樣的電平持續(xù)5位則添加一個位的反型數(shù)據(jù)位:
圖20 位填充示意(引自[4])
注意:位填充作用范圍為SOF-CRC段機間的數(shù)據(jù)。
2)錯誤類型
引自[4]
圖21 CRC匹配示意(引自[6])
圖22 CRC錯誤(引自[6])
針對上述位錯誤再做說明(引自[3]):所謂“發(fā)出的電平與從總線上回讀的電平不一致”,指的就是節(jié)點向總線發(fā)出隱性位,卻從總線上回讀到顯性位或者節(jié)點向總線發(fā)出顯性位,卻從總線上回讀到隱性位這兩種情況。有三種例外情況不屬于位錯誤:在仲裁區(qū),節(jié)點向總線發(fā)送隱性位卻回讀到顯性位,不認為是位錯誤,這種情況表示該節(jié)點仲裁失??;在ACK槽,節(jié)點向總線發(fā)送隱性位卻回讀到顯性位,不認為是位錯誤,這種情況表示,該節(jié)點當前發(fā)送的這一幀報文至少被一個其它節(jié)點正確接收;一個節(jié)點發(fā)送被動錯誤標志,該節(jié)點向總線發(fā)送連續(xù)六個隱性位(被動錯誤標志)卻回讀到顯性位,不認為是位錯誤。因為被動錯誤標志是六個連續(xù)的隱性位,所以在總線上按照線與機制,有可能這六個連續(xù)隱性位被其它節(jié)點發(fā)送的顯性電平覆蓋。
3)錯誤處理
錯誤狀態(tài)的種類有:主動錯誤狀態(tài),被動錯誤狀態(tài)和總線關(guān)閉態(tài)3種狀態(tài)。單元始終處于3種狀態(tài)之一。
(1)主動錯誤狀態(tài):可以正常參加總線通信的狀態(tài),處于主動錯誤狀態(tài)的單元檢測出錯誤時,輸出主動錯誤標志。
(2)被動錯誤狀態(tài):是易引起錯誤的狀態(tài)。處于被動錯誤狀態(tài)的單元雖能參加總線通信,但為不妨礙其他單元通信,接收時不能積極地發(fā)送錯誤通知;處于被動錯誤狀態(tài)的單元即使檢測出錯誤,而其它處于主動錯誤狀態(tài)的單元如果沒發(fā)現(xiàn)錯誤,整個總線也被認為是沒有錯誤的。處于被動錯誤狀態(tài)的單元檢測出錯誤時,輸出被動錯誤標志。另外,處于被動錯誤狀態(tài)的單元在不能馬上再次開始發(fā)送。在開始下次發(fā)送前,在間隔幀期間內(nèi)必須插入“延遲傳送”(8個位的隱性位)。
(3)總線關(guān)閉態(tài)是不能參加總線上通信的狀態(tài)。信息的接收和發(fā)送均被禁止。
以上這些狀態(tài)依靠發(fā)送錯誤計算和接收錯誤計數(shù)來管理,根據(jù)計數(shù)值決定進入何種狀態(tài)。錯誤狀態(tài)和計數(shù)值的關(guān)系如下表:
?
圖23 單元的錯誤狀態(tài)(引自[4])
發(fā)送錯誤計數(shù)值和接收錯誤計數(shù)值根據(jù)一定的條件發(fā)送變化。錯誤計數(shù)值的變動條件如下表,一次數(shù)據(jù)的接收和發(fā)送可能同時滿足多個條件。錯誤計數(shù)器在錯誤標志的第一個位出現(xiàn)的時間點上開始計數(shù)。
引自[4]
4)錯誤幀發(fā)送
檢查到錯誤后,什么時候發(fā)送錯誤幀呢?按照CAN協(xié)議的規(guī)定:
位錯誤、填充錯誤、格式錯誤、ACK錯誤。在錯誤產(chǎn)生的那一位的下一位開始發(fā)送錯誤幀。
CRC錯誤。緊隨ACK界定符后的位發(fā)送錯誤幀。
具體來看一個例子:
圖24 錯誤幀(引自[3])
1)發(fā)送節(jié)點Node_A發(fā)送一個顯性位,但是卻從總線上聽到一個隱形位,于是Node_A節(jié)點就會檢測到一個位錯誤;
2)Node_A檢測到位錯誤之后,立即在下一位開始發(fā)送主動錯誤幀:6個連續(xù)顯性位的主動錯誤標志+8個連續(xù)隱性位的錯誤界定符;
3)對應Node_A發(fā)出的主動錯誤標志,總線上電平為6個連續(xù)顯性位;
4)接收節(jié)點Node_B和Node_C從總線上聽到連續(xù)6個顯性位,那么就會檢測到一個填充錯誤,于是這兩個節(jié)點都會發(fā)送主動錯誤幀;
5)對應Node_B和Node_C發(fā)出的主動錯誤標志,總線電平又有6個連續(xù)顯性電平,對應Node_B和Node_C發(fā)出的錯誤界定符,總線電平有8個連續(xù)的隱性電平。
6)在間歇場之后,Node_A節(jié)點重新發(fā)送剛剛出錯的報文。
在了解了錯誤幀的發(fā)送后,回到之前提到錯誤標志重疊部分是怎樣形成的,再看一個例子:
圖25 (引自[3])
在這個例子,我們知道位錯誤的錯誤標志與填充錯誤的錯誤標志重疊2位,剩下部分還有4位:
引自[4]
3.3 過載幀
過載幀是用于接收單元通知其尚未完成接收準備的幀。過載幀由過載標志(6個位的顯性位)和過載界定符(8個位的隱性位)構(gòu)成。過載界定符的構(gòu)成與錯誤界定符的構(gòu)成相同。過載幀的構(gòu)成如下圖所示。
引自[4]
對于過載幀的幀結(jié)構(gòu)我們可以這樣理解:接收節(jié)點達到接收極限時,就會發(fā)出過載幀到總線上,顯然,過載標志的6個連續(xù)顯性位會屏蔽掉總線上其它節(jié)點的發(fā)送,也就是說這個時候的接收節(jié)點通過發(fā)送過載幀的方式來破壞其它節(jié)點的發(fā)送,這樣在接收節(jié)點發(fā)送過載幀期間,其它節(jié)點就不能成功發(fā)送報文,于是就相當于把其它節(jié)點的發(fā)送推遲了,也就是說接收節(jié)點在其發(fā)送過載幀的這段時間得以“休息”。
有3種情況會引起過載幀:
接收節(jié)點自身原因。接收節(jié)點由于某種原因需要延遲接收下一個數(shù)據(jù)幀或者遙控幀。
在幀間隔的間歇段的第一位和第二位檢測到一個顯性位(正常的間歇段都是隱性位)。幀間隔的間隔段本應是三個連續(xù)的隱性位,如果接收節(jié)點在間隔段檢測到顯性位,那么就意味著此時有報文發(fā)向接收節(jié)點,但這個時候是不應該有報文發(fā)來的,于是接收節(jié)點發(fā)送過載幀。
CAN節(jié)點在錯誤界定符或過載界定符的第八位(最后一位)聽到一個顯性位0,節(jié)點會發(fā)送一個過載幀,且錯誤計數(shù)器不會增加。接收節(jié)點在錯誤界定符和過載界定符的最后一位聽到顯性位,也意味著有報文發(fā)向接收節(jié)點,但這個時候是不應該有報文發(fā)來的,于是接收節(jié)點發(fā)送過載幀。
3.4 幀間隔
幀間隔是用于分隔數(shù)據(jù)幀和遙控幀的幀。數(shù)據(jù)幀和遙控幀可通過插入幀間隔將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分開。過載幀和錯誤幀前不能插入幀間隔。
引自[4]
針對上圖,間隔為3個位的隱性位;總線空閑為隱性電平,無長度限制(0亦可);延遲傳送為8個位的隱性位,只在處于被動錯誤狀態(tài)的單元剛發(fā)送一個消息后的幀間隔中包含的段。這里為什么需要延遲傳送段呢?
首先,考慮主動錯誤狀態(tài)的節(jié)點A,發(fā)送主動錯誤標志之后,隨之就要重新發(fā)送剛剛發(fā)送失敗的報文,但是為了間隔開與前面剛剛發(fā)送的錯誤幀,總線在錯誤幀之后就會插入3個隱形位的幀間隔,在這3個隱形位期間,其它的節(jié)點不足以判定總線空閑(需要連續(xù)11個隱性位才能判定),所以節(jié)點A仍然占據(jù)著總線的控制權(quán),于是在幀間隔之后,節(jié)點A能夠接著發(fā)送報文?,F(xiàn)在節(jié)點A轉(zhuǎn)入到被動錯誤狀態(tài)了,說明它已經(jīng)不是很可靠了,這個時候如果沒有延遲傳送段,在節(jié)點A發(fā)出被動錯誤標志之后,它仍然能夠在3位的幀間隔之后立即重新發(fā)送報文,這是不符合我們對被動錯誤狀態(tài)的處理要求的當然也是不符合CAN協(xié)議的,于是乎對于發(fā)送出被動錯誤標志的節(jié)點,總線在幀間隔中加入了8個連續(xù)隱性位的延遲傳送段,這樣的3+8=11個連續(xù)隱性位。就能讓節(jié)點A在這個幀間隔期間失去對總線的控制權(quán),從而優(yōu)先保證其它正常(處于主動錯誤狀態(tài))節(jié)點能夠使用總線,而不必等著一個已經(jīng)不可靠的節(jié)點A占據(jù)總線。
到此CAN協(xié)議幀結(jié)構(gòu)就基本介紹完了,下面綜上所述來分析下具體的總線仲裁:
第4部分 總線仲裁
基于上節(jié)的仲裁段和控制段,這里主要考慮幾種情況的仲裁:假設一條CAN總線上有兩個節(jié)點Node_A和Node_B。在總線空閑時,總線上為隱性電平,就在這個時候Node_A 和 Node_B 這兩個節(jié)點同時向總線上發(fā)送數(shù)據(jù),如下圖,其中,Tx表示發(fā)送,Rx表示接收,也就是說每個節(jié)點都有發(fā)送與接收。
當作為發(fā)送方的節(jié)點會去接收自己發(fā)送的內(nèi)容進行檢查,即回讀機制(節(jié)點在向總線上發(fā)送報文的過程中,同時也對總線上的二進制位進行“回讀”,對比該節(jié)點發(fā)出的二進制位與總線上當前的二進制位是否一致,就可節(jié)點數(shù)據(jù)是否被正確接收。)
圖26 仲裁過程(引自[3])
情況1:仲裁在前11位ID就結(jié)束 ,如上圖。
從D28-D18,采用線與機制,逐位進行比較,一旦某位出現(xiàn)不同,上圖的ID25,則顯性位覆蓋隱性位,仲裁結(jié)束,顯性位的對應節(jié)點勝出,上圖的Node_A。
情況2:仲裁在前11位ID未結(jié)束,即說明前11位ID相同
在這種情況下,我們就需要回顧一下前面的一個表:
根據(jù)這個表,我們可以進一步分為4種情況:
標準格式的數(shù)據(jù)幀與遙控幀,看RTR位,數(shù)據(jù)幀的RTR位恒為顯性,遙控幀的RTR位恒為隱性。故前11位ID號相同時,標準數(shù)據(jù)幀優(yōu)先級高于標準遙控幀。
擴展格式的數(shù)據(jù)幀與遙控幀,在前11位ID和后18位ID全相同的情況,與上條一致。
數(shù)據(jù)幀的標準格式與擴展格式,比較標準格式的RTR位與擴展格式的SRR位,標準格式的RTR位恒為顯性,擴展格式的SRR位恒為隱性。故前11位ID號相同時,標準數(shù)據(jù)幀優(yōu)先級高于擴展數(shù)據(jù)幀。
遙控幀的標準格式與擴展格式,看IDE位,擴展格式的IDE位恒為隱性,標準格式的IDE位在控制段,恒為顯性。故前11位ID號相同時,標準遙控幀優(yōu)先級高于擴展遙控幀。
通過上述分析,我們可以知道在前11位ID號相同時,根據(jù)協(xié)議設定的RTR, SRR, IDE,就可以保證如下:
RTR:保證數(shù)據(jù)幀優(yōu)先級高于遙控幀;
SRR :保證標準數(shù)據(jù)幀的優(yōu)先級高于擴展數(shù)據(jù)幀;
IDE :保證標準遙控幀的優(yōu)先級高于擴展遙控幀。
第5部分 報文過濾
在CAN總線中沒有地址的概念,CAN總線是通過報文ID來實現(xiàn)收發(fā)數(shù)據(jù)的。CAN節(jié)點上都會有一個驗收濾波ID表,其位于CAN節(jié)點的驗收濾波器中,如果總線上的報文的ID號在某個節(jié)點的驗收濾波ID表中,那么這一幀報文就能通過該節(jié)點驗收濾波器的驗收,該節(jié)點就會接收這一幀報文。假設有設置:
可看報文過濾過程如下圖示意:
圖27 報文發(fā)送到接收的過程
關(guān)于報文過濾具體如何實現(xiàn),后續(xù)將會寫相關(guān)文章。
第6部分 數(shù)據(jù)傳輸同步
6.1 位速率概念
位速率(也叫做比特率)表示的是單位時間內(nèi),總線上傳輸?shù)男畔⒘浚疵棵肽軌騻鬏數(shù)亩M制位的數(shù)量,R=1/T ,單位是bit per second。比如比特率為8bit/s,意思為一秒傳輸了8bit,包含了8個二進制事件的信息量。注意位速率與波特率不是同一概念。
摘自:zhuanlan.zhihu.com/p/10?實際傳輸中,傳輸速率以每秒發(fā)送的符號(baud)數(shù)量進行計算,即波特率。?當一個符號只包含兩種可能,即一個事件兩種可能,那么此時1baud=1bit。此時波特率等于比特率。一個符號也有可能包含多個可能,例2中,一個符號中包含四個電平,那么接受端的一個事件,有了abcd四種可能,那么1baud=2bit。此時波特率為比特率的兩倍。
6.2 位時序
第3部分講到幀結(jié)構(gòu),我們知道每一幀數(shù)據(jù)(即一個完整的數(shù)據(jù)幀)有很多位組成,當發(fā)送方發(fā)送一幀數(shù)據(jù)到總線時,接收方怎么準確接收到這幀數(shù)據(jù)呢?實際采用逐位逐位地接收數(shù)據(jù)。
引自[3]
具體來說,將一個位分為4段,如上圖所示。這些段又由可稱為Time Quantum(以下稱為Tq)的最小時間單位構(gòu)成。1位分為4個段,每個段又由若干個Tq構(gòu)成,這稱為位時序。1位由多少個Tq構(gòu)成,每個段又由多少個Tq構(gòu)成等,可以任意設定位時序。通過設定位時序,多個單元可同時采樣,也可任意設定采樣點。各段的作用和Tq數(shù)如下表:
引自[4]
所謂采樣點是讀取總線電平,并將讀到的電平作為位值的點,位置在PBS1結(jié)束處。
CAN協(xié)議的通信方法為NRZ方式,各個位的開頭或者結(jié)尾都沒有附加同步信號。發(fā)送單元以與位時序同步的方式開始發(fā)送數(shù)據(jù)。另外,接收單元根據(jù)總線上電平的變化進行同步并進行接收工作。但是,發(fā)送單元和接收單元存在的時鐘頻率誤差及傳輸路徑上的(電纜/驅(qū)動器等)相位延遲會引起同步偏差,因此接收單元通過硬件同步或者再同步的方法調(diào)整時序進行接收。
6.3 硬同步
在總線空閑狀態(tài),接收節(jié)點檢測出幀起始(SOF位)時,會調(diào)整當前位的同步段,調(diào)整寬度不限。如下圖假設這時檢測的時SOF位。
那么硬同步簡單說就是接收節(jié)點直接與發(fā)送節(jié)點同步(真有硬的味道),如下:
引自[3]
?
具體解釋引自[3]: 1)發(fā)送節(jié)點Node_A在發(fā)送SOF位時,SOF位的下降沿在SS段; 2)這個時候接收節(jié)點Node_B發(fā)現(xiàn)自己當前位的SS段和發(fā)送節(jié)點SOF位的SS段不同步。也就是說當Node_A 產(chǎn)生SOF位SS段時,Node_B的當前位的SS段已經(jīng)在5個Tq之前產(chǎn)生了; 3)于是接收節(jié)點Node_B強行將自己當前位的SS段拉到與SOF位的SS段同步。
?
?
6.4 再同步
接收節(jié)點檢測出除SOF位以外的其他位時,進行的同步調(diào)整。重同步會通過加長PSB1段,或縮短PBS2段來調(diào)整同步,以保證采樣點的準確。
對于再同步,需一個概念SJW(同步跳轉(zhuǎn)寬度),是指PSB1和PSB2再同步時允許跳轉(zhuǎn)的最大寬度,其必須滿足以下2個條件:
SJW必須小于PBS1和PBS2的最小值;
SJW最大值不能超過4。
下面看一下再同步的兩種情況:
情況1:PSB1段加長(發(fā)的晚,收的早)
引自[3]
?
具體解釋引自[3]: 1)發(fā)送節(jié)點Node_A比接收節(jié)點Node_B的時間慢了,也就是說Node_A當前位的ss段產(chǎn)生的時候,Node_B 當前位的ss段已經(jīng)在2個Tq之前產(chǎn)生了; 2)所以這個時候接收節(jié)點Node_B就將PBS1延長2個Tq的時間; 3)于是這個時候Node_A當前位的采樣點就和Node_B的采樣點同步了。
?
?
情況2:PSB2段縮短(發(fā)的早,收的晚)
引自[3]
?
具體解釋引自[3]: 1)發(fā)送節(jié)點Node_A當前位的SS段誕生2Tq時長之后,接收節(jié)點Node_B的當前位才產(chǎn)生SS段; 2)于是,接收節(jié)點Node_B當前位的PBS2段縮短, 3)這樣就會導致接收節(jié)點Node_B的下一位能夠提前2個Tq,從而Node_B的下一位采樣點和Node_A下一位 的采樣點能夠同步。
?
?
6.5 調(diào)整同步的規(guī)則
?
?
硬件同步和再同步遵從如下規(guī)則。 1) 1 個位中只進行一次同步調(diào)整。 2) 只有當上次采樣點的總線值和邊沿后的總線值不同時,該邊沿才能用于調(diào)整同步。 3) 在總線空閑且存在隱性電平到顯性電平的邊沿時,則一定要進行硬件同步。 4) 在總線非空閑時檢測到的隱性電平到顯性電平的邊沿如果滿足條件(1)和(2),將進行再同步。 但還要滿足下面條件。 5) 發(fā)送單元觀測到自身輸出的顯性電平有延遲時不進行再同步。 6) 發(fā)送單元在幀起始到仲裁段有多個單元同時發(fā)送的情況下,對延遲邊沿不進行再同步。
?
?
第7部分 位時間實例
本部分將根據(jù)Infineon的芯片手冊對位時間如何計算和如何配置位時間的寄存器進行說明。
假設我們有一條需求:設置CAN通訊的波特率為500KBaud。
7.1 計算
Infineon芯片手冊提供的CAN總線位時間標準格式定義如下圖,后面根據(jù)該定義進行求解。
CAN總線位時間標準
設:晶振時鐘周期頻率為40MHz,轉(zhuǎn)換為時間表示則為T=1/40MHz=25ns
NBT=16(即一個位有16個tq,time quantum),
因為要設置的波特率為500KBaud,換算時間表示則為1/500KBaud =2000ns,即傳輸一個位的時間要2000ns。那意味著16個tq就等于2000ns,即tq=125ns。
又因為有:
所以:tq/T=125ns/25ns=5,因為BRP只能為整數(shù),這時取DIV8=0, BRP=4。
我們已經(jīng)NBT=16,假設我們采樣點取在50%處,即有:
50%=Tseg2/NBT=[(TSEG2+1)tq]/16*tq=(TSEG2+1)/16
即有:TSEG2=7。
那么Tseg1= NBT-Tseg2-Tsync=7tq,所以TSEG1=6。
再根據(jù)下式計算SJW, 這里直接假設TSJW=3*tq能保證下式兩個不等式成立(不在此處展開Tprope的討論),那么SJW=2。
綜上有:DIV8=0, BRP=4,TSEG1=6,TSEG2=7,SJW=2。
7.2 寄存器配置
根據(jù)上節(jié)的計算結(jié)果進行位時間寄存器的配置,關(guān)于該寄存器的內(nèi)容以及配置信息見下圖。
?
位時間寄存器說明
經(jīng)過上述配置,我們成功設置了CAN通訊的波特率為500KBaud。
7.3 補充:傳輸延遲時間tPTS
CAN報文在CAN總線上的傳輸時,物理延遲包含兩個部分:
在CAN-BUS上傳輸造成的延遲
在節(jié)點上傳輸造成延遲
按照CAN通信協(xié)議的規(guī)定,補償給傳播延遲的時間長度要至少等于實際實際傳播延遲時長的2倍,即:tPTS≥2×tdel=2×(tdel+tBus)
注意:在CAN總線通信系統(tǒng)中是以時間量子Tq來度量時間的,所以如果延遲補償時間tPTS = 3.1Tq,那么這個時候要?。簍PTS = 4Tq。
編輯:黃飛
?
評論