CAN總線協議 學習筆記

1.CAN總線網絡

CAN總線網絡主要掛在CAN_H和CAN_L,各個節點經過這兩條線實現信號的串行差分傳輸,爲了不信號的反射和干擾,還須要在CAN_H和CAN_L之間接上120歐姆的終端電阻,可是爲何是120歐姆呢?那是由於電纜的特性阻抗爲120歐。前端

2.信號表示

CAN總線採用不歸零碼位填充技術,也就是說CAN總線上的信號有兩種不一樣的信號狀態,分別是顯性的(Dominant)邏輯0和隱形的(recessive)邏輯1,信號每一次傳輸完後不須要返回到邏輯0(顯性)的電平。網絡

位填充規則:發送器只要檢測到位流裏有5個連續相同值的位,便自動在位流裏插入補充位。數據結構

 

觀察下圖:併發

能夠看到上圖中的當第一段爲隱性(recessive),CAN_H和CAN_L電平幾乎同樣,也就是說CAN_H和CAN_L電平很接近甚至相等的時候,總線表現隱性的,而兩線點位差較大時表現爲顯性的,按照定義的:測試

  • CAN_H-CAN_L < 0.5V 時候爲隱性的,邏輯信號表現爲"邏輯1"- 高電平。
  • CAN_H-CAN_L > 0.9V 時候爲顯性的,邏輯信號表現爲"邏輯0"- 低電平。

下面將差分信號和顯隱性之間對應關係總結爲下表:spa

狀態設計

邏輯信號3d

電壓範圍orm

顯性Dominantblog

0

CAN_H-CAN_L > 0.9

隱性recessive

1

CAN_H-CAN_L < 0.5

由上面的分析咱們能夠知道:

CAN總線採用的"線與"的規則進行總線衝裁。即1&0=0;因此0爲顯性。

這句話隱含的意思是,若是總線上只要有一個節點將總線拉到低電平(邏輯0)即顯性狀態,總線就爲低電平(邏輯0)即顯性狀態而無論總線上有多少節點處於傳輸隱性狀態(高電平或是邏輯1),只有全部節點都爲高(隱性),總線才爲高,即隱性。

 

3.通信速率與通信距離

下面的SAE J2411爲美國汽車標準。

類型

標準

最高速率

描述

高速CAN

CAN/ISO 11839-2

1Mbit/秒

最通用的CAN總線類型

低速CAN

ISO/ISO 11839-3

125Kbit/秒

容錯,在一條總線短路的時候仍然能工做

單線CAN

SAE J2411

50Kbit/秒

高速模式可達到100Kbit/s主要用在汽車上,例如通用公司

 

CAN總線上任意兩個節點的最大傳輸距離與其位速率有關,以下表:

位速率/kbps

1000

500

250

125

100

50

20

10

5

最大距離/m

40

130

270

530

620

1300

3300

6700

10000

這裏的最大通訊距離指的是同一條總線上兩個節點之間的距離。能夠看到速率越低通信距離就越遠,也就是說CAN總線的通信距離和波特率成反比。在位速率爲5千比特位每秒的時候達到最大的傳輸距離10千米。其中通常的工程中比較經常使用的爲500K每秒的通信速率。這個速率在實際測試的時候也是很是可靠的。

若是想要更遠的傳輸(大於10千米);能夠考慮用多個CAN控制器鏈接或是加其餘通信協議(如485或是TCP/IP)的接口芯片組成的一個設備,這樣就可實現長距離的通信需求。 

 

4.數據衝突解決辦法-仲裁

只要總線空閒,總線上任何節點均可以發送報文,若是有兩個或兩個以上的節點開始傳送報文,那麼就會存在總線訪問衝突的可能。可是CAN使用了標識符的逐位仲裁方法能夠解決這個問題。

在仲裁期間,每個發送器都對發送的電平與被監控的總線電平進行比較。若是電平相同,則這個單元能夠繼續發送。若是發送的是一"隱性"電平而監視到的是一"顯性"電平,那麼這個節點失去了仲裁,必須退出發送狀態。若是出現不匹配的位不是在仲裁期間則產生錯誤事件。

幀ID越小,優先級越高。因爲數據幀的RTR位爲顯性電平,遠程幀爲隱性電平,因此幀格式和幀ID相同的狀況下,數據幀優先於遠程幀;因爲標準幀的IDE位爲顯性電平,擴展幀的IDE位爲隱形電平,對於前11位ID相同的標準幀和擴展幀,標準幀優先級比擴展幀高。 

 

4.CAN總線是怎麼通訊的?

CAN 總線是一個廣播類型的總線,因此任何在總線上的節點均可以監聽總線上傳輸的數據。也就是說總線上的傳輸不是點到點的,而是一點對多點的傳輸,這裏多點的意思是總線上全部的節點。可是總線上的節點如何知道那些數據是傳送給本身的呢?CAN總線的硬件芯片提供了一種叫作本地過濾的功能,經過這種本地過濾的功能能夠過濾掉一些和本身無關的數據,而保留一些和本身有關的信息。 

CAN標準定義了四種消息類型,每條消息用一種叫作比特位仲裁(Arbitration)機制來控制進入CAN總線,而且每條消息都標記了優先權。另外CAN標準還定義了一系列的錯誤處理機制。

CAN報文的四種消息類型:

  • 數據幀:數據幀將數據從發送器傳輸到接收器。
  • 遠程幀:總線單元發出遠程幀,請求發送具備同一標識符的數據幀。
  • 錯誤幀:任何單元檢測到總線錯誤就發出錯誤幀。
  • 過載幀:過載幀用在相鄰數據幀或遠程幀之間的提供附加的延時。 

 

(1)數據幀

 

下圖爲基本的格式:

 

CAN總線中有標準幀和擴展幀兩種格式,兩種格式不一樣的地方在於仲裁域格式的不一樣,看下面兩個表格能夠很清楚的看出二者的不一樣,下面第一個表是標準幀(CAN2.0 A),第二個爲擴展幀(CAN2.0 B):

下面爲擴展幀格式(CAN2.0B):

其中

  • SOF爲幀開始
  • SRR爲"替代遠程請求位
  • IDE爲擴展標識符位
  • RTR爲遠程傳輸請求位
  • CRC delimiter 爲CRC定界符。
  • ACK delimiter 爲應答定界符.

 

咱們看到上圖中的基本幀格式能夠總結爲如下幾個域:

描述

仲裁域

仲裁域決定了當總線上兩個或是多個節點爭奪總線時的優先權。

數據域

包含了0到8字節的數據。

CRC域

包含了15位的校驗和,校驗和用來作錯誤檢測。

應答槽

任何一個已經正確接收到消息的控制器在每一條消息的末端發送一個應答位,發送器檢查消息是否存在應答位,若是沒有就重發消息。

 

 

(2)遠程幀

 

做爲數據接收器的站,經過發送遠程幀,能夠啓動其資源節點傳送它們各自的數據。遠程幀和數據幀很是相似,只是遠程幀沒有數據域。

 

上圖就是遠程幀的幀格式,它相對與數據幀沒有遠程幀,可是要注意發送遠程幀的時候RTR位要置1,表示發送的是遠程幀。下圖更加清晰了呈現了這種結構。

 

(3)錯誤幀

 

錯誤幀是當總線的某一個節點檢測到錯誤後發送出來的,它會引發全部節點檢測到一個錯誤,因此當有任何一個節點檢測到錯誤,總線上的其餘節點也會發出錯誤幀。CAN總線設計了一套詳盡的錯誤計數機制來確保不會因爲任何一個節點反覆的發送錯誤幀而致使CAN總線的崩潰。

如上圖所示錯誤標誌和錯誤定界符組成,高低表明分別表明隱性和顯性,其中錯誤標誌爲全部節點發過來的錯誤標誌的疊加(Superposition)。下圖更爲清楚的看出各個數據位的分佈:

下面經過如下數據結構框圖歸納各個部分的定義:

 

錯誤標誌有兩種形式:

  • 主動錯誤標誌,它由6個連續的顯性位0組成,它是節點主動發送的錯誤標誌。
  • 被動錯誤標誌,它由6個連續的隱性位1組成,除非被其餘節點的顯性位覆蓋。

     

    剛纔說到一個節點上檢測到錯誤會致使總線上全部的節點都會檢測到錯誤併發送錯誤標誌,這是爲何呢?

    由於單一節點上的錯誤標誌格式違背了從幀起始到CRC界定符的位填充規則,也破壞了ACK域或幀結尾的固定格式。下面簡要說下位填充規則。

    位填充規則:發送器只要檢測到位流裏有5個連續相同值的位,便自動在位流裏插入補充位。

    注意:位填充規則只是針對數據幀和遠程幀,錯誤幀和過載幀格式固定。

        因此全部其餘的節點會檢測到錯誤條件而且開始發送錯誤標誌,所以錯誤幀就是各個站的不一樣錯誤標誌疊加在一塊兒的結果。

當某個節點發送錯誤幀(帶有錯誤標誌),其餘節點收到了錯誤幀,檢測到錯誤條件,就經過發送"被動錯誤標誌"的錯誤幀來提示錯誤。

錯誤定界符:

傳送了錯誤標誌之後,每個站就發送一個隱性位,並一直監視總線直到檢測出一個隱性位爲止,而後就開始發送其他7個隱性位。

 

(4)過載幀

過載幀是接收節點用來向發送節點告知自身接收能力的幀。

過載幀,意思就是某個接收節點來不及處理數據了,但願其餘節點慢點發送數據幀或者遠程幀,因此告訴發送節點,我已經沒有能力處理你發送過來的數據了。

過載幀跟錯誤幀結構相似包括過載標誌和過載定界符,有3中狀況會引發過載:

  • 接收器內部的緣由,它須要延遲下一個數據幀或是遠程幀。
  • 在間歇字段(看下面的幀間空間)的第一位和第二位檢測到一個顯性位(間歇字段都是隱性位的)
  • 若是CAN節點在錯誤界定符或是過載界定符的第八位(最後一位)採樣到一個顯性位邏輯0,節點會發送一個過載幀,錯誤計數器不會增長。

 

上圖中很清晰的表示了過載標誌有6個顯性位組成,而疊加部分和"主動錯誤"標誌同樣,過載的標誌破壞的是間歇域的固定格式。因此致使其餘的節點都檢測到過載條件,並一同發出過載標誌。

過載定界符:

也就是上圖的過載結束符,過載標誌被傳送之後,節點就一直監聽着總線,直到檢測到有一個從顯性位到隱性位的跳變爲止。當從總線上檢測到這樣的跳變,則就標誌着每個節點都完成了各自過載標誌的發送,並開始同時發送其他7個隱性位。 

 

5.CAN總線通訊協議實例

(1)幀標識符-29位

 

 

(a)、協議號 PROTNO Protocol No

協議號描述各高級單元之間通訊使用的協議。

0x064

RMP

Rectifier Monitor Protocol

監控主機與採集前端標識符

 

(b)PTP

點對點位。PTP=0,表示該幀爲廣播信息。PTP=1 時,表示該幀爲點對點信息。例如,在對全部的節點廣播命令時,PTP=0時,目的地址設置爲 0xFF。。

 

(c、目的地地址

目標地址表示該幀發往哪一個地址。 目的地址(0x00-0xFE)。

若是 PTP=1,bit11~bit18 被做爲點對點通訊的目的地址。

 

(d)源地址

源地址表示該幀是由哪一個地址發出。 源地址(0x00-0xFE)。

在全部通訊類型中,bit3~bit10 用於指示總線上信息源的地址。

在系統中,PRONTO=0x064,採集前端的地址肯定在 0x00~0x7F。

監控主機的地址都肯定在 0xF0~0xF8。

 

(e)源地址

後續數據標識。若是 CNT=1,表示數據包含下一幀,並且,它有相同的源地址和協議類型。若是 CNT=0,表示是數據的最後部分。若是數據包只須要一幀傳遞,則 CNT=0。

 

(f) RES 1

預留位,爲未來使用,必須設置爲 1

 

(g)RES 2

預留位,爲未來使用,必須設置爲 1。

 

(2)數據域

(a)ERR

錯誤位。若是節點接收到的數據包幀格式不符合協議規定,將此位置位傳遞給源節點。

 

(b)PTP

點對點位。PTP=0,表示該幀爲廣播信息。PTP=1 時,表示該幀爲點對點信息。例如,在對全部的節點廣播命令時,PTP=0時,目的地址設置爲 0xFF。。

 

(c)MSGTYPE

命令信息類型。表示數據信息對應的類型。

 

(d)ErrType

錯誤類型。表示數據信息錯誤緣由。

ErrType

意義

0xf0

無錯誤,正常響應

0xf1

節點地址無效

0xf2

命令無效

0xf3

數據校驗錯誤

0xf4

地址識別過程當中

 

(e)Data information

數據部分。

 

(3)MSGTYPE

 

 

歡迎你們進羣交流分享:QQ羣:773082801

相關文章
相關標籤/搜索