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