1. 程式人生 > >CAN匯流排介紹及要點說明

CAN匯流排介紹及要點說明

轉載出處:https://www.cnblogs.com/spoorer/p/6649303.html

  1. 前言

CAN匯流排的應用在現在看來越來越廣泛,我廠裝置從最初的ARM9與ARM7平臺、期間升級過度到CortexA8與Cortex M3平臺,再到現在的Cortex M4平臺,圍繞CAN進行了一系列產品的開發,CAN匯流排的穩定性是毋庸置疑的。

  1. CAN匯流排物理結構與特性

    1. CAN匯流排網路

CAN匯流排網路主要掛在CAN_H和CAN_L,各個節點通過這兩條線實現訊號的序列差分傳輸,為了避免訊號的反射和干擾,還需要在CAN_H和CAN_L之間接上120歐姆的終端電阻,但是為什麼是120歐姆呢?那是因為電纜的特性阻抗為120歐。

 

  1. CAN收發器

CAN收發器的作用是負責邏輯電平和訊號電平之間的轉換。

即從CAN控制晶片輸出邏輯電平到CAN收發器,然後經過CAN收發器內部轉換將邏輯電平轉換為差分訊號輸出到CAN總線上,CAN總線上的節點都可以決定自己是否需要總線上的資料。具體的管教定義如下:

  1. 訊號表示

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

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

 

觀察下圖:

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

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

狀態

邏輯訊號

電壓範圍

顯性Dominant

0

CAN_H-CAN_L > 0.9

隱性recessive

1

CAN_H-CAN_L < 0.5

由上面的分析我們可以知道:

CAN匯流排採用的"線與"的規則進行匯流排衝裁。即1&0=0;所以0為顯性。

這句話隱含的意思是,如果總線上只要有一個節點將匯流排拉到低電平(邏輯0)即顯性狀態,匯流排就為低電平(邏輯0)即顯性狀態而不管總線上有多少節點處於傳輸隱性狀態(高電平或是邏輯1),只有所有節點都為高(隱性),匯流排才為高,即隱性。

  1. 通訊速率與通訊距離

下面的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)的介面晶片組成的一個裝置,這樣就可實現長距離的通訊需求。

  1. CAN匯流排關鍵概念

    1. 仲裁

只要匯流排空閒,總線上任何節點都可以傳送報文,如果有兩個或兩個以上的節點開始傳送報文,那麼就會存在匯流排訪問衝突的可能。但是CAN使用了識別符號的逐位仲裁方法可以解決這個問題。

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

幀ID越小,優先順序越高。由於資料幀的RTR位為顯性電平,遠端幀為隱性電平,所以幀格式和幀ID相同的情況下,資料幀優先於遠端幀;由於標準幀的IDE位為顯性電平,擴充套件幀的IDE位為隱形電平,對於前11位ID相同的標準幀和擴充套件幀,標準幀優先順序比擴充套件幀高。

  1. CAN匯流排協議

CAN 匯流排是一個廣播型別的匯流排,所以任何在總線上的節點都可以監聽總線上傳輸的資料。也就是說總線上的傳輸不是點到點的,而是一點對多點的傳輸,這裡多點的意思是總線上所有的節點。但是總線上的節點如何知道那些資料是傳送給自己的呢?CAN匯流排的硬體晶片提供了一種叫做本地過濾的功能,通過這種本地過濾的功能可以過濾掉一些和自己無關的資料,而保留一些和自己有關的資訊。

  1. CAN訊息機制

CAN標準定義了四種訊息型別,每條訊息用一種叫做位元位仲裁(Arbitration)機制來控制進入CAN匯流排,並且每條訊息都標記了優先權。另外CAN標準還定義了一系列的錯誤處理機制。

CAN報文的四種訊息型別:

 

  1. 資料幀

下圖為基本的格式:

 

CAN匯流排中有標準幀和擴充套件幀兩種格式,兩種格式不同的地方在於仲裁域格式的不同,看下面兩個表格可以很清楚的看出兩者的不同,下面第一個表是標準幀(CAN2.0 A),第二個為擴充套件幀(CAN2.0 B):

下面為擴充套件幀格式(CAN2.0B):

其中

 

我們看到上圖中的基本幀格式可以總結為以下幾個域:

描述

仲裁域

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

資料域

包含了0到8位元組的資料。

CRC域

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

應答槽

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

 

  1. 遠端幀

作為資料接收器的站,通過傳送遠端幀,可以啟動其資源節點傳送它們各自的資料。遠端幀和資料幀非常類似,只是遠端幀沒有資料域。

 

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

  1. 錯誤幀

錯誤幀是當匯流排的某一個節點檢測到錯誤後傳送出來的,它會引起所有節點檢測到一個錯誤,所以當有任何一個節點檢測到錯誤,總線上的其他節點也會發出錯誤幀。CAN匯流排設計了一套詳盡的錯誤計數機制來確保不會由於任何一個節點反覆的傳送錯誤幀而導致CAN匯流排的崩潰。

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

下面通過以下資料結構框圖概括各個部分的定義:

 

錯誤標誌有兩種形式:

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

錯誤定界符:

傳送了錯誤標誌以後,每一個站就傳送一個隱性位,並一直監視匯流排直到檢測出一個隱性位為止,然後就開始傳送其餘7個隱性位。

 

  1. 過載幀

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

過載幀,意思就是某個接收節點來不及處理資料了,希望其他節點慢點發送資料幀或者遠端幀,所以告訴傳送節點,我已經沒有能力處理你傳送過來的資料了。

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

 

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

過載定界符:

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

  1. 幀間空間(Interframe Space)

幀間空間說白了就是幀與幀之間的間隔,但是這種間隔在CAN的幀中只存在於資料幀和遠端幀,其他的幀就不一定是幀間空間隔開的,而是其他形式,或是直接是沒有間隔,例如過載幀和錯誤幀之間就沒幀間空間。過個過載幀之間有間隔但是不是有幀間空間隔開的。

這裡所說的針間空間包括"間歇"、"匯流排空閒"的位域。如果是傳送前一報文的"被動錯誤"的站,則還包括叫做"掛起傳輸"的位域。

若不是"被動錯誤"的站,或作為前一報文的接收器的站,幀間空間格式為下圖:

若是"被動錯誤"的站,如果想要傳送8個隱性電平,在傳送其他幀,幀間空間格式為下圖,即包括了掛起傳輸,

可以看到

  1. 間歇欄位有3個隱性位。

特別的在間歇期間,所有的節點都不允許傳送資料幀和遠端幀,唯一看做的是標示一個過載條件。

  1. 匯流排空閒

只要匯流排空閒,任何節點就可以往匯流排傳送資料,並且是開始於間歇之後的第一個位。一旦總線上檢測到顯性位即邏輯"0",可以認為是幀的開始。

  1. 掛起傳輸

"被動錯誤"的節點發送報文之後,在下一個報文開始傳送之前或是確認匯流排空閒之前發出8個隱性位跟隨在間歇的後面。如果這個時候有一個報文從其他的節點發過來,則這個節點就成為了接收器。

 

  1. 錯誤處理機制

    1. 錯誤偵測

下標是幾個錯誤型別:

錯誤型別

出錯條件

出錯域

幀測單元

位元錯誤

bit error

傳送的位值與所監控的位值不相符合(填充位元和ACK位元除外)

資料幀(SOF~EOF)

遠端幀(SOF~EOF)

錯誤幀

過載幀

傳送單元

接收單元

填充錯誤stuff error

偵測到6個連續相同的電平

資料幀(SOF~CRC)

遠端幀(SOF~CRC)

傳送單元

接收單元

CRC 錯誤

計算結果和接收到的CRC不同

資料幀(CRC)

遠端幀(CRC)

接收單元

格式錯誤

Form Error

某個固定的格式位置出現無效的位元

資料幀:

(CRC Delimiter, ACK Delimiter EOF)

遠端幀:

(CRC Delimiter,ACK Delimiter)

錯誤幀:

(Error Frame Delimiter)

過載幀:

(Overload Delimiter)

接收單元

應答錯誤

Acknowledgment

傳送端在應答間隙所監視的位不為顯性,即邏輯0,傳送器就檢測到一個應答錯誤。

資料幀(ACK slot)

遠端幀(ACK slot)

傳送單元

  1. 錯誤計數

下面是錯誤計數表:

 

錯誤條件

Transmit Error Counter

Receive Error Counter

1

RECEIVER端偵測到一個位Error錯誤,除了傳送ACTIVE ERROR FLAG 和OVERLOAD FLAG

-

+1

2

TRANSMITIER 傳送ERROR FLAG

+8

 

3

TRANSMITTER傳送ACTIVE ERROR FLAG OVERFLAG時偵測到BIT ERROR

+8

 

4

當RECEIVER傳送ACTIVE ERROR FLAG或OVERFLAG時偵測到BIT ERROR

+8

 

5

一個幀被成功傳送之後(取得ACK並且知道END OF FRAME完成都沒有錯誤)

-1 IF TEC=0,TEC will not be changed

-

6

一個幀被成功接收(知道ACK域都沒有檢測到錯誤,併成功傳送ACK位元)

-

1. if 1 <= REC <= 127 -> REC-1

2. if REC = 0 -> REC = 0

3. if REC > 127 -> REC = a value

Between 119 to 127

7

在總線上檢測到128此連續的11個1,"bus off"的節點允許變成不再是"bus off"

Cleared to TEC = 0

Cleared to REC = 0

 

  1. 錯誤抑制

 

為防止某些節點自身出錯而一直髮送錯誤幀,干擾其他節點通訊,CAN協議規定了節點的3種狀態及行為,如下圖:

一個節點掛到CAN總線上之後,處於ACTIVE狀態;TEC>127或者REC>127導致節點進入passive狀態;TEC>255之後節點處於bus off狀態,就是不允許再往bus上傳送東西了;處於bus off狀態的節點,在檢測到128個連續的11個1之後將回到active狀態。