CAN匯流排介紹及要點說明
轉載出處:https://www.cnblogs.com/spoorer/p/6649303.html
-
前言
CAN匯流排的應用在現在看來越來越廣泛,我廠裝置從最初的ARM9與ARM7平臺、期間升級過度到CortexA8與Cortex M3平臺,再到現在的Cortex M4平臺,圍繞CAN進行了一系列產品的開發,CAN匯流排的穩定性是毋庸置疑的。
-
CAN匯流排物理結構與特性
-
CAN匯流排網路
-
CAN匯流排網路主要掛在CAN_H和CAN_L,各個節點通過這兩條線實現訊號的序列差分傳輸,為了避免訊號的反射和干擾,還需要在CAN_H和CAN_L之間接上120歐姆的終端電阻,但是為什麼是120歐姆呢?那是因為電纜的特性阻抗為120歐。
-
CAN收發器
CAN收發器的作用是負責邏輯電平和訊號電平之間的轉換。
即從CAN控制晶片輸出邏輯電平到CAN收發器,然後經過CAN收發器內部轉換將邏輯電平轉換為差分訊號輸出到CAN總線上,CAN總線上的節點都可以決定自己是否需要總線上的資料。具體的管教定義如下:
-
訊號表示
CAN匯流排採用不歸零碼位填充技術,也就是說CAN總線上的訊號有兩種不同的訊號狀態,分別是顯性的(Dominant)邏輯0和隱形的(recessive)邏輯1,訊號每一次傳輸完後不需要返回到邏輯0(顯性)的電平。
位填充規則:傳送器只要檢測到位流裡有5個連續相同值的位,便自動在位流裡插入補充位。
狀態 |
邏輯訊號 |
電壓範圍 |
顯性Dominant |
0 |
|
隱性recessive |
1 |
CAN匯流排採用的"線與"的規則進行匯流排衝裁。即1&0=0;所以0為顯性。
型別 |
標準 |
最高速率 |
描述 |
高速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 |
如果想要更遠的傳輸(大於10公里);可以考慮用多個CAN控制器連線或是加其他通訊協議(如485或是TCP/IP)的介面晶片組成的一個裝置,這樣就可實現長距離的通訊需求。
只要匯流排空閒,總線上任何節點都可以傳送報文,如果有兩個或兩個以上的節點開始傳送報文,那麼就會存在匯流排訪問衝突的可能。但是CAN使用了識別符號的逐位仲裁方法可以解決這個問題。
CAN標準定義了四種訊息型別,每條訊息用一種叫做位元位仲裁(Arbitration)機制來控制進入CAN匯流排,並且每條訊息都標記了優先權。另外CAN標準還定義了一系列的錯誤處理機制。
- 資料幀:資料幀將資料從傳送器傳輸到接收器。
- 遠端幀:匯流排單元發出遠端幀,請求傳送具有同一識別符號的資料幀。
- 錯誤幀:任何單元檢測到匯流排錯誤就發出錯誤幀。
- 過載幀:過載幀用在相鄰資料幀或遠端幀之間的提供附加的延時。
域 |
描述 |
仲裁域 |
仲裁域決定了當總線上兩個或是多個節點爭奪匯流排時的優先權。 |
資料域 |
包含了0到8位元組的資料。 |
CRC域 |
包含了15位的校驗和,校驗和用來做錯誤檢測。 |
應答槽 |
任何一個已經正確接收到訊息的控制器在每一條訊息的末端傳送一個應答位,傳送器檢查訊息是否存在應答位,如果沒有就重發訊息。 |
作為資料接收器的站,通過傳送遠端幀,可以啟動其資源節點傳送它們各自的資料。遠端幀和資料幀非常類似,只是遠端幀沒有資料域。
上圖就是遠端幀的幀格式,它相對與資料幀沒有遠端幀,但是要注意傳送遠端幀的時候RTR位要置1,表示傳送的是遠端幀。下圖更加清晰了呈現了這種結構。
如上圖所示錯誤標誌和錯誤定界符組成,高低代表分別代表隱性和顯性,其中錯誤標誌為所有節點發過來的錯誤標誌的疊加(Superposition)。下圖更為清楚的看出各個資料位的分佈:
- 主動錯誤標誌,它由6個連續的顯性位0組成,它是節點主動傳送的錯誤標誌。
-
被動錯誤標誌,它由6個連續的隱性位1組成,除非被其他節點的顯性位覆蓋。
剛才說到一個節點上檢測到錯誤會導致總線上所有的節點都會檢測到錯誤併發送錯誤標誌,這是為什麼呢?
因為單一節點上的錯誤標誌格式違背了從幀起始到CRC界定符的位填充規則,也破壞了ACK域或幀結尾的固定格式。下面簡要說下位填充規則。
位填充規則:傳送器只要檢測到位流裡有5個連續相同值的位,便自動在位流裡插入補充位。
當某個節點發送錯誤幀(帶有錯誤標誌),其他節點收到了錯誤幀,檢測到錯誤條件,就通過傳送"被動錯誤標誌"的錯誤幀來提示錯誤。
傳送了錯誤標誌以後,每一個站就傳送一個隱性位,並一直監視匯流排直到檢測出一個隱性位為止,然後就開始傳送其餘7個隱性位。
過載幀,意思就是某個接收節點來不及處理資料了,希望其他節點慢點發送資料幀或者遠端幀,所以告訴傳送節點,我已經沒有能力處理你傳送過來的資料了。
過載幀跟錯誤幀結構類似包括過載標誌和過載定界符,有3中情況會引起過載:
- 接收器內部的原因,它需要延遲下一個資料幀或是遠端幀。
- 在間歇欄位(看下面的幀間空間)的第一位和第二位檢測到一個顯性位(間歇欄位都是隱性位的)
- 如果CAN節點在錯誤界定符或是過載界定符的第八位(最後一位)取樣到一個顯性位邏輯0,節點會發送一個過載幀,錯誤計數器不會增加。
上圖中很清晰的表示了過載標誌有6個顯性位組成,而疊加部分和"主動錯誤"標誌一樣,過載的標誌破壞的是間歇域的固定格式。所以導致其他的節點都檢測到過載條件,並一同發出過載標誌。
這裡所說的針間空間包括"間歇"、"匯流排空閒"的位域。如果是傳送前一報文的"被動錯誤"的站,則還包括叫做"掛起傳輸"的位域。
若不是"被動錯誤"的站,或作為前一報文的接收器的站,幀間空間格式為下圖:
若是"被動錯誤"的站,如果想要傳送8個隱性電平,在傳送其他幀,幀間空間格式為下圖,即包括了掛起傳輸,
特別的在間歇期間,所有的節點都不允許傳送資料幀和遠端幀,唯一看做的是標示一個過載條件。
只要匯流排空閒,任何節點就可以往匯流排傳送資料,並且是開始於間歇之後的第一個位。一旦總線上檢測到顯性位即邏輯"0",可以認為是幀的開始。
"被動錯誤"的節點發送報文之後,在下一個報文開始傳送之前或是確認匯流排空閒之前發出8個隱性位跟隨在間歇的後面。如果這個時候有一個報文從其他的節點發過來,則這個節點就成為了接收器。
錯誤型別 |
出錯條件 |
出錯域 |
幀測單元 |
|
位元錯誤 bit error |
傳送的位值與所監控的位值不相符合(填充位元和ACK位元除外) |
資料幀(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) |
傳送單元 |
錯誤條件 |
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 |