本文來源:車端 / 導(dǎo)讀 / 本文力求以圖文并茂來接好CAN通訊協(xié)議的基礎(chǔ)知識,,希望能給有興趣的朋友帶來一些收獲,。 為了便于大家理解與接受,請先看一幅圖:圖1 電話會議 簡單地講CAN總線就如上圖1中兩根粗黃線,,其通訊原理:好比開一個電話會議,,大家都撥進來了,這時會議的狀態(tài)可能是: - 兩人甚至多人同時開口了,但只會讓另一人說,,其他人聽,;
針對于上述各種情況,要保證這個電話會議的有序高效地進行,,那么我們需要有一些約定俗成的規(guī)定或協(xié)議,,大家都遵守,。CAN總線通訊與這種電話會議形式有異曲同工之處,那么CAN總線通訊到底具體是怎么回事,?接下來將以理論與實踐相結(jié)合方法來介紹CAN通訊協(xié)議,。
概覽 控制器局域網(wǎng)CAN( Controller Area Network)屬于現(xiàn)場總線的范疇,,是一種有效支持分布式控制系統(tǒng)的串行通信網(wǎng)絡(luò)。是由德國博世公司在20世紀80年代專門為汽車行業(yè)開發(fā)的一種串行通信總線,。由于其高性能,、高可靠性以及獨特的設(shè)計而越來越受到人們的重視,被廣泛應(yīng)用于汽車業(yè),、航空業(yè),、工業(yè)控制、安全防護等領(lǐng)域,。隨著CAN總線在各個行業(yè)和領(lǐng)域的廣泛應(yī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。
高速CAN和低速CAN廣泛應(yīng)用于汽車總線,,如下圖3,。圖3 兩類CAN總線應(yīng)用在汽車(引自[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)附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信號:
1.4 CAN信號傳輸上述的電位差(差分電平)與邏輯電平由CAN收發(fā)器實現(xiàn)。在發(fā)送過程,,CAN控制器將CPU傳來的信號轉(zhuǎn)換為邏輯電平,。CAN收發(fā)器接收邏輯電平之后,再將其轉(zhuǎn)換為差分電平輸出到CAN總線上,。在接收過程,,CAN收發(fā)器將CAN_H 和 CAN_L 線上傳來的差分電平轉(zhuǎn)換為邏輯電平輸出到CAN控制器,CAN控制器再把該邏輯電平轉(zhuǎn)化為相應(yīng)的信號發(fā)送到CPU上。通俗地講,,就是發(fā)送方通過CAN收發(fā)器使總線電平發(fā)生變化,,將其信息傳遞到CAN總線上。接收方通過監(jiān)聽總線電平,,將總線上的消息讀入自己的CAN收發(fā)器,。由上可知:CAN總線有2種架構(gòu),CAN信號有2種形式,,CAN信號發(fā)送和接收2個過程,。
CAN總線特性為了有助于理解后面講述的內(nèi)容,先看CAN總線有什么特性,。CAN總線上的所有節(jié)點沒有主從之分,,反應(yīng)在數(shù)據(jù)傳輸上是:在總線空閑狀態(tài)下,任意節(jié)點都可以向總線上發(fā)送信息,。另外:最先向總線發(fā)送信息的節(jié)點獲得總線的發(fā)送權(quán),;當多個節(jié)點同時向總線發(fā)送消息時,所發(fā)送消息的優(yōu)先權(quán)高的那個節(jié)點獲得總線的發(fā)送權(quán),。圖11說明:0x12優(yōu)先級高于0x67,,所以0x12先于0x67發(fā)送;緊接著0x52也要求發(fā)送,,同樣其優(yōu)先級也高于0x67,,所以0x52先于0x67發(fā)送,依次類推,。這里0x12優(yōu)先級高于0x67是怎么判斷的呢,?這就下個特點相關(guān)。非破壞性仲裁機制是一種既不會造成已發(fā)送數(shù)據(jù)的延遲,,也不會破壞已經(jīng)發(fā)送的數(shù)據(jù)的仲裁機制,其具體實施需要了解CAN協(xié)議幀結(jié)構(gòu),,線與機制等,。其中,線與機制簡單說就是位與計算,,顯性電平會覆蓋隱性電平(換種方式理解:電路通路情況下,,有一個端點接地(GND),那么整個電路電壓就接地了),。再了解線與機制后,,看一個簡單的仲裁例子,如下圖:上圖:假設(shè)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(shè)計,,后續(xù)將會詳細分析,。與總線相連的節(jié)點沒有類似于“地址”的信息。因此在總線上增加節(jié)點時,,連接在總線上的其它節(jié)點的軟硬件及應(yīng)用層都不需要改變,。根據(jù)整個網(wǎng)絡(luò)的規(guī)模,可設(shè)定適合的通信速度,。在同一網(wǎng)絡(luò)中,,所有單元必須設(shè)定成統(tǒng)一的通信速度。即使有一個單元的通信速度與其它的不一樣,,此單元也會輸出錯誤信號,,妨礙整個網(wǎng)絡(luò)的通信。不同網(wǎng)絡(luò)間則可以有不同的通信速度,。(簡單一句話理解:雙方必須需要在同一頻道交流,,不然溝通就有障礙)可通過發(fā)送“遙控幀” 請求其他單元發(fā)送數(shù)據(jù)。信息廣播就如:節(jié)點A發(fā)送一條ID 0x12的信息,,然后節(jié)點B,C,D都能收到,。上圖節(jié)點B,C,D最終是否會接收這個0x12發(fā)送信息,與他們設(shè)置相關(guān),,如下圖只有節(jié)點B設(shè)置接收,,C,D將會丟棄該條信息,,這個過程與報文過濾相關(guān),。CAN協(xié)議幀結(jié)構(gòu)上述仲裁機制部分我們提到CAN協(xié)議幀,,總的來說CAN協(xié)議幀有5種類型,下面逐個展開,。由于數(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])這里結(jié)合實際采集的CAN總線電壓信號來看下標準格式的數(shù)據(jù)幀,。圖14 標準(格式)數(shù)據(jù)幀的CAN總線電壓(引自[5])通過圖13和15對比數(shù)據(jù)幀和遙控幀有:通過對數(shù)據(jù)幀和遙控幀有了基本認識,,下面我們再具體了解下每個段。1) 幀起始(SOF, Start of Frame)表示幀開始的段,,1個位的顯性位,。(總線空閑時為隱性位,故幀起始以顯性位非常好識別),,對于數(shù)據(jù)幀和遙控幀的標準/擴展格式均如此,。2) 仲裁段(Arbitration field)表示數(shù)據(jù)的優(yōu)先級的段,起作用就是根據(jù)報文ID來確定其發(fā)送優(yōu)先級,。標準格式和擴展格式在此的構(gòu)成有所不同,。這里對比數(shù)據(jù)幀與遙控幀各自的兩個格式,其不同為:針對上表的這種設(shè)計,,后面會具體分析其在仲裁過程的作用,。表述數(shù)據(jù)段的字節(jié)數(shù),由6個位構(gòu)成,,標準格式和擴展格式的構(gòu)成有所不同,。圖16 控制段與數(shù)據(jù)段的關(guān)系(引自[5])4) 數(shù)據(jù)段(Data Field)數(shù)據(jù)段可包含0-8個字節(jié)的數(shù)據(jù),從MSB(最高位)開始輸出,。遙控幀沒有此段,。5) CRC段(Cyclic Redundancy Check Field)檢查幀傳輸錯誤的幀,由15個位的CRC順序和1個位的CRC界定符(用于分隔位)構(gòu)成,。CRC界定符恒為隱性,。這里CRC順序是根據(jù)多項式生成的CRC值,CRC的計算范圍包括幀起始,,仲裁段,控制段和數(shù)據(jù)段,。附2:en.wikipedia.org/wiki/C , 如何通俗的理解CRC校驗并用C語言實現(xiàn),, zhuanlan.zhihu.com/p/776) ACK段(Acknowledge Field)用來確認是否正常接收。由ACK槽(ACK Slot)和ACK界定符2個位構(gòu)成,。圖18 發(fā)送與接收時的ACK槽狀態(tài)(引自[3])7) 幀結(jié)束(End of Frame)表示該幀的結(jié)束的段,。由7個位的隱性位構(gòu)成。3.2 錯誤幀用于在接收和發(fā)送消息時檢測出錯誤通知錯誤的幀,錯誤幀由錯誤標志和錯誤界定符構(gòu)成,。圖19 錯誤幀結(jié)構(gòu)(引自[4])上圖的錯誤標志包括主動錯誤標志(6個位的顯性位)和被動錯誤標志(6個位的隱性位)兩種,。主動錯誤標志處于主動錯誤狀態(tài)下的單元檢測出錯誤時輸出的錯誤標志。被動錯誤標志處于被動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標志,。錯誤界定符由8個位的隱性位構(gòu)成,。注意上圖0~6位的錯誤標志重疊,這段怎么確定呢,?需先介紹2個概念:位填充和錯誤類型,。位填充是為防止突發(fā)錯誤而設(shè)定的功能。當同樣的電平持續(xù)5位則添加一個位的反型數(shù)據(jù)位:注意:位填充作用范圍為SOF-CRC段機間的數(shù)據(jù),。針對上述位錯誤再做說明(引自[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ā)送的顯性電平覆蓋。錯誤狀態(tài)的種類有:主動錯誤狀態(tài),,被動錯誤狀態(tài)和總線關(guān)閉態(tài)3種狀態(tài),。單元始終處于3種狀態(tài)之一。- 主動錯誤狀態(tài):可以正常參加總線通信的狀態(tài),,處于主動錯誤狀態(tài)的單元檢測出錯誤時,,輸出主動錯誤標志。
- 被動錯誤狀態(tài):是易引起錯誤的狀態(tài),。處于被動錯誤狀態(tài)的單元雖能參加總線通信,,但為不妨礙其他單元通信,,接收時不能積極地發(fā)送錯誤通知;處于被動錯誤狀態(tài)的單元即使檢測出錯誤,,而其它處于主動錯誤狀態(tài)的單元如果沒發(fā)現(xiàn)錯誤,,整個總線也被認為是沒有錯誤的。處于被動錯誤狀態(tài)的單元檢測出錯誤時,,輸出被動錯誤標志,。另外,處于被動錯誤狀態(tài)的單元在不能馬上再次開始發(fā)送,。在開始下次發(fā)送前,,在間隔幀期間內(nèi)必須插入“延遲傳送”(8個位的隱性位)。
- 總線關(guān)閉態(tài)是不能參加總線上通信的狀態(tài),。信息的接收和發(fā)送均被禁止,。
以上這些狀態(tài)依靠發(fā)送錯誤計算和接收錯誤計數(shù)來管理,根據(jù)計數(shù)值決定進入何種狀態(tài),。錯誤狀態(tài)和計數(shù)值的關(guān)系如下表: 發(fā)送錯誤計數(shù)值和接收錯誤計數(shù)值根據(jù)一定的條件發(fā)送變化,。錯誤計數(shù)值的變動條件如下表,一次數(shù)據(jù)的接收和發(fā)送可能同時滿足多個條件,。錯誤計數(shù)器在錯誤標志的第一個位出現(xiàn)的時間點上開始計數(shù),。檢查到錯誤后,什么時候發(fā)送錯誤幀呢,?按照CAN協(xié)議的規(guī)定:位錯誤,、填充錯誤、格式錯誤,、ACK錯誤,。在錯誤產(chǎn)生的那一位的下一位開始發(fā)送錯誤幀。 CRC錯誤,。緊隨ACK界定符后的位發(fā)送錯誤幀,。
1)發(fā)送節(jié)點Node_A發(fā)送一個顯性位,但是卻從總線上聽到一個隱形位,,于是Node_A節(jié)點就會檢測到一個位錯誤,; 2)Node_A檢測到位錯誤之后,立即在下一位開始發(fā)送主動錯誤幀:6個連續(xù)顯性位的主動錯誤標志+8個連續(xù)隱性位的錯誤界定符,; 3)對應(yīng)Node_A發(fā)出的主動錯誤標志,,總線上電平為6個連續(xù)顯性位; 4)接收節(jié)點Node_B和Node_C從總線上聽到連續(xù)6個顯性位,,那么就會檢測到一個填充錯誤,,于是這兩個節(jié)點都會發(fā)送主動錯誤幀; 5)對應(yīng)Node_B和Node_C發(fā)出的主動錯誤標志,,總線電平又有6個連續(xù)顯性電平,,對應(yīng)Node_B和Node_C發(fā)出的錯誤界定符,總線電平有8個連續(xù)的隱性電平,。 6)在間歇場之后,,Node_A節(jié)點重新發(fā)送剛剛出錯的報文。 在了解了錯誤幀的發(fā)送后,,回到之前提到錯誤標志重疊部分是怎樣形成的,,再看一個例子:在這個例子,我們知道位錯誤的錯誤標志與填充錯誤的錯誤標志重疊2位,,剩下部分還有4位:3.3 過載幀過載幀是用于接收單元通知其尚未完成接收準備的幀,。過載幀由過載標志(6個位的顯性位)和過載界定符(8個位的隱性位)構(gòu)成。過載界定符的構(gòu)成與錯誤界定符的構(gòu)成相同,。過載幀的構(gòu)成如下圖所示,。對于過載幀的幀結(jié)構(gòu)我們可以這樣理解:接收節(jié)點達到接收極限時,就會發(fā)出過載幀到總線上,,顯然,,過載標志的6個連續(xù)顯性位會屏蔽掉總線上其它節(jié)點的發(fā)送,也就是說這個時候的接收節(jié)點通過發(fā)送過載幀的方式來破壞其它節(jié)點的發(fā)送,,這樣在接收節(jié)點發(fā)送過載幀期間,,其它節(jié)點就不能成功發(fā)送報文,于是就相當于把其它節(jié)點的發(fā)送推遲了,,也就是說接收節(jié)點在其發(fā)送過載幀的這段時間得以“休息”,。接收節(jié)點自身原因。接收節(jié)點由于某種原因需要延遲接收下一個數(shù)據(jù)幀或者遙控幀,。 在幀間隔的間歇段的第一位和第二位檢測到一個顯性位(正常的間歇段都是隱性位),。幀間隔的間隔段本應(yīng)是三個連續(xù)的隱性位,如果接收節(jié)點在間隔段檢測到顯性位,,那么就意味著此時有報文發(fā)向接收節(jié)點,,但這個時候是不應(yīng)該有報文發(fā)來的,于是接收節(jié)點發(fā)送過載幀,。 CAN節(jié)點在錯誤界定符或過載界定符的第八位(最后一位)聽到一個顯性位0,,節(jié)點會發(fā)送一個過載幀,且錯誤計數(shù)器不會增加,。接收節(jié)點在錯誤界定符和過載界定符的最后一位聽到顯性位,,也意味著有報文發(fā)向接收節(jié)點,但這個時候是不應(yīng)該有報文發(fā)來的,,于是接收節(jié)點發(fā)送過載幀,。
3.4 幀間隔幀間隔是用于分隔數(shù)據(jù)幀和遙控幀的幀。數(shù)據(jù)幀和遙控幀可通過插入幀間隔將本幀與前面的任何幀(數(shù)據(jù)幀,、遙控幀,、錯誤幀,、過載幀)分開。過載幀和錯誤幀前不能插入幀間隔,。針對上圖,,間隔為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)就基本介紹完了,,下面綜上所述來分析下具體的總線仲裁:
總線仲裁基于上節(jié)的仲裁段和控制段,這里主要考慮幾種情況的仲裁:假設(shè)一條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ù)是否被正確接收,。)情況1:仲裁在前11位ID就結(jié)束 ,如上圖,。從D28-D18,,采用線與機制,逐位進行比較,,一旦某位出現(xiàn)不同,,上圖的ID25,則顯性位覆蓋隱性位,,仲裁結(jié)束,,顯性位的對應(yīng)節(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é)議設(shè)定的RTR, SRR, IDE,,就可以保證如下:RTR:保證數(shù)據(jù)幀優(yōu)先級高于遙控幀,; SRR :保證標準數(shù)據(jù)幀的優(yōu)先級高于擴展數(shù)據(jù)幀; IDE :保證標準遙控幀的優(yōu)先級高于擴展遙控幀,。
報文過濾在CAN總線中沒有地址的概念,,CAN總線是通過報文ID來實現(xiàn)收發(fā)數(shù)據(jù)的。CAN節(jié)點上都會有一個驗收濾波ID表,,其位于CAN節(jié)點的驗收濾波器中,,如果總線上的報文的ID號在某個節(jié)點的驗收濾波ID表中,那么這一幀報文就能通過該節(jié)點驗收濾波器的驗收,,該節(jié)點就會接收這一幀報文,。假設(shè)有設(shè)置:關(guān)于報文過濾具體如何實現(xiàn),后續(xù)將會寫相關(guān)文章,。數(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)成等,,可以任意設(shè)定位時序。通過設(shè)定位時序,,多個單元可同時采樣,,也可任意設(shè)定采樣點。各段的作用和Tq數(shù)如下表:所謂采樣點是讀取總線電平,,并將讀到的電平作為位值的點,,位置在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)整寬度不限。如下圖假設(shè)這時檢測的時SOF位。那么硬同步簡單說就是接收節(jié)點直接與發(fā)送節(jié)點同步(真有硬的味道),,如下: 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)發(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的采樣點同步了,。
1)發(fā)送節(jié)點Node_A當前位的SS段誕生2Tq時長之后,,接收節(jié)點Node_B的當前位才產(chǎn)生SS段,; 2)于是,接收節(jié)點Node_B當前位的PBS2段縮短,, 3)這樣就會導(dǎo)致接收節(jié)點Node_B的下一位能夠提前2個Tq,,從而Node_B的下一位采樣點和Node_A下一位 的采樣點能夠同步。
6.5 調(diào)整同步的規(guī)則 1) 1 個位中只進行一次同步調(diào)整,。 2) 只有當上次采樣點的總線值和邊沿后的總線值不同時,該邊沿才能用于調(diào)整同步,。 3) 在總線空閑且存在隱性電平到顯性電平的邊沿時,,則一定要進行硬件同步。 4) 在總線非空閑時檢測到的隱性電平到顯性電平的邊沿如果滿足條件(1)和(2),,將進行再同步,。 但還要滿足下面條件,。 5) 發(fā)送單元觀測到自身輸出的顯性電平有延遲時不進行再同步。 6) 發(fā)送單元在幀起始到仲裁段有多個單元同時發(fā)送的情況下,,對延遲邊沿不進行再同步,。
位時間實例本部分將根據(jù)Infineon的芯片手冊對位時間如何計算和如何配置位時間的寄存器進行說明。假設(shè)我們有一條需求:設(shè)置CAN通訊的波特率為500KBaud,。7.1 計算Infineon芯片手冊提供的CAN總線位時間標準格式定義如下圖,,后面根據(jù)該定義進行求解。設(shè):晶振時鐘周期頻率為40MHz,,轉(zhuǎn)換為時間表示則為T=1/40MHz=25nsNBT=16(即一個位有16個tq,,time quantum),因為要設(shè)置的波特率為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,假設(shè)我們采樣點取在50%處,,即有:50%=Tseg2/NBT=[(TSEG2+1)tq]/16*tq=(TSEG2+1)/16那么Tseg1= NBT-Tseg2-Tsync=7tq,,所以TSEG1=6,。再根據(jù)下式計算SJW, 這里直接假設(shè)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)過上述配置,,我們成功設(shè)置了CAN通訊的波特率為500KBaud。7.3 補充:傳輸延遲時間tPTSCAN報文在CAN總線上的傳輸時,,物理延遲包含兩個部分:在CAN-BUS上傳輸造成的延遲 在節(jié)點上傳輸造成延遲 按照CAN通信協(xié)議的規(guī)定,補償給傳播延遲的時間長度要至少等于實際實際傳播延遲時長的2倍,即:tPTS≥2×tdel=2×(tdel+tBus)注意:在CAN總線通信系統(tǒng)中是以時間量子Tq來度量時間的,,所以如果延遲補償時間tPTS = 3.1Tq,,那么這個時候要?。簍PTS = 4Tq。凡本公眾號注明“來源:XXX(非智車科技)”的作品,,均轉(zhuǎn)載自其它媒體,,轉(zhuǎn)載目的在于傳遞和分享更多信息,并不代表本平臺贊同其觀點和對其真實性負責,,版權(quán)歸原作者所有,,如有侵權(quán)請聯(lián)系我們刪除。
|