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