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"- 低電平。
下面將差分訊號和顯隱性之間對應關係總結為下表:
狀態 |
邏輯訊號 |
電壓範圍 |
顯性Dominant |
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