K課堂 | CAN總線基礎(chǔ)知識匯總, 一文搞懂! (下篇)
本篇內(nèi)容根據(jù)Kvaser《CAN協(xié)議教程》內(nèi)容進行整理?!禖AN協(xié)議教程》簡要闡述ISO 11898-1和ISO 11898-2標(biāo)準(zhǔn),主要介紹CAN在汽車設(shè)計、工業(yè)自動化控制和許多其它應(yīng)用中的基礎(chǔ)知識,希望能對CAN總線技術(shù)的學(xué)習(xí)者有所幫助。
內(nèi)容框架如下:
上篇(已更新,進入Kvaser主頁專欄查看)
介紹CAN總線
CAN報文
CAN報文/?報文類型/?標(biāo)準(zhǔn)CAN vs.擴展CAN/?基本CAN和完整CAN/?總線仲裁和報文優(yōu)先級/?報文尋址和標(biāo)識/?標(biāo)識符值注意事項
CAN物理層
CAN總線/?不同的物理層/?最大總線速度/?最小總線速度/?最大電纜長度/?總線端接/?電纜/?CAN連接器
下篇(本篇內(nèi)容)
CAN示波器圖片
CAN連接器
9 針 DSUB/ 5 針Mini-C/ 6針 Deutsch DT04-6P
CAN位時序
位布局/ 時鐘同步/ 位時序寄存器計算
CAN錯誤處理
CAN 怎樣處理錯誤/ 錯誤檢測機制/ 錯誤限制機制/ 總線故障模式
高層協(xié)議
不同的高層協(xié)議/ 其他相關(guān)協(xié)議和標(biāo)準(zhǔn)

圖1是一幅來自最普通的 ISO11898CAN 總線的圖片,以 1Mbps 速率運行。收發(fā)器是82C251。也就是說,物理層是由 ISO 11898 指定的。

測量在 CAN_H(CAN 高位)和 GND(接地)之間進行。注意,靜態(tài)和隱性總線電壓約為 2.5V。
傳送顯性位時,電壓升高到約 3.5V。
圖2是同一總線,但是測量在 CAN_L(CAN 低位)和 GND(接地)之間進行:

圖3是另一個報文,以 125kbps 速率發(fā)送。報文的(11 位)標(biāo)識符是 300,或十六進制12c。仔細查看就可識別報文中的第一個位。

圖4這是一幅更復(fù)雜的圖片。它顯示與上面例子相同的報文。仍然是 11 位標(biāo)識符 300,速率仍然是 125kbps,但是 CAN 總線上沒有端接。CAN 電纜是短扁平帶狀線纜。

那么,發(fā)生了什么情況?
這是 125kbps,所以一位是 8 微秒。
? 首先傳送節(jié)點發(fā)送一個起始位。這是一個邏輯‘0’,即一個顯性電平。
??然后傳送標(biāo)識符。十進制 300 是十六進制 12c,或者二進制 001 0010 1100。前兩個 0 會順利傳送。這解釋了圖片中看到的 24 微秒的顯性電平。
??然后應(yīng)該傳送一個‘1’。但是因為總線沒有端接,所以斜率上升不是預(yù)期的結(jié)果。傳送節(jié)點現(xiàn)在會認(rèn)為它在總線上看到的是‘0’。
??因為這種情況發(fā)生在仲裁階段,所以傳送節(jié)點將停止傳送,其認(rèn)為有其它節(jié)點正在傳送??偩€現(xiàn)在將變?yōu)殡[性狀態(tài),因為實際上沒有節(jié)點在傳送。
??在 6 個隱性位之后,傳送節(jié)點和接收節(jié)點都將檢測到填充錯誤,并開始進行錯誤處理。這時已經(jīng)過了 80 微秒(1 個起始位,2 個‘0’,1 個誤解位和 6 個隱性位,總共 10 個位,等于80 微秒)。
??檢測到填充錯誤的所有節(jié)點現(xiàn)在將開始傳送錯誤幀。這種情況下錯誤幀為被動模式,因為在捕獲到上方圖像之前產(chǎn)生了許多錯誤,所以傳送節(jié)點是被動錯誤模式。被動型錯誤幀和主動型錯誤幀相似,但是使用隱性電平進行傳送,所以在總線上不可見。
??被動型錯誤幀占用 6 位時間。
??然后所有節(jié)點等待 8 個隱性位的周期,稱為錯誤定界符。
??然后所有節(jié)點等待 3 個隱性位的周期,稱為間歇。
??對以上數(shù)字求和,結(jié)果是 1+6+6+8+3 = 24 個隱性位 = 192 微秒(如圖)
? 經(jīng)驗:始終端接 CAN總線!反射不一定有害,但是損壞的邊緣形狀將破壞通信。
圖5是同一 CAN 總線在另一時間尺度中的情況:

CAN 總線大約長 2 厘米(8 英寸)。下沖和震蕩是可見的,但是在這種情況中顯然不重要。這次,平緩的上升斜率是問題所在。
圖6里是相同的設(shè)置,但是這次傳送節(jié)點和接收節(jié)點都是主動錯誤模式:

發(fā)生了什么情況?
??如上圖所示,傳送了三個‘0’(耗時 24 微秒),下一位被誤解,所以傳送節(jié)點認(rèn)為它已經(jīng)失去了仲裁。
??傳送節(jié)點等待 6 位,然后檢測到一個填充錯誤。誤解的位和這 6 個位需 56 微秒。
??傳送節(jié)點和接收節(jié)點現(xiàn)在開始傳送錯誤幀。它是 6 個顯性位(48 微秒)。
??傳送錯誤幀的節(jié)點現(xiàn)在等待 8 個隱性位,但隨著上升斜率的壞處,第一個位被誤解。節(jié)點將認(rèn)為這是另一個節(jié)點在傳送錯誤幀,所以將忽略它。
??當(dāng)總線回到隱性電平時,所有節(jié)點等待 8 位。
??然后是 3 個隱性位的間歇。
? 3+9 = 12 位 = 96 微秒,如圖所示。
??然后傳送節(jié)點重新嘗試并得到相同的結(jié)果。一段時間以后傳送節(jié)點進入被動錯誤模式,并將按照前面所述那樣運行。
圖7是另一幅圖片。在此設(shè)置中,CAN 總線上只有一個節(jié)點(正確端接)。該節(jié)點試圖傳送一條報文,但是沒有其它節(jié)點在偵聽。

那么會發(fā)生什么情況?
??首先傳送節(jié)點發(fā)送整個報文。
??傳送節(jié)點期望在 ACK 時隙中填充一個顯性電平。但是,因為沒有其它節(jié)點在偵聽,沒有任何ACK 到達,所以傳送節(jié)點檢測到一個確認(rèn)錯誤。
??然后傳送節(jié)點傳送一個被動錯誤標(biāo)志(上圖中,嘗試發(fā)送了幾秒鐘,所以不再是主動錯誤模式,而是被動模式)。
??被動錯誤標(biāo)志后面跟隨一個錯誤定界符和間歇。
??因為這個節(jié)點嘗試發(fā)送一個報文但是操作失敗,它必須再等待 8 位才能開始新的傳送。這種情況在 CAN 規(guī)范中稱為“暫停傳送”。
??傳送節(jié)點還必須將其傳送錯誤計數(shù)增加 8。但是這是 CAN 規(guī)范中的特殊情況,只有當(dāng)傳送節(jié)點是主動錯誤模式時才會發(fā)生。當(dāng)傳送節(jié)點進入被動錯誤模式時,它不會增加其傳送節(jié)點錯誤計數(shù)(這種情況中),而是會不斷重試傳送。
所以你在上圖中看到的是一個正在發(fā)送的報文,然后是短暫停頓,它是錯誤標(biāo)志、錯誤定界符、間歇和暫停傳送的總和。然后報文被不斷重傳……

1.?9 針 DSUB
CiA推薦使用這種連接器布局,幾乎是行業(yè)標(biāo)準(zhǔn)。

如果供電,電壓范圍應(yīng)該為+7至+13V,額定電流為100mA。模塊提供一個公接頭,內(nèi)部必須連接引腳3和6。

引腳編號適用于接頭側(cè)視圖的公接頭或焊接側(cè)視圖的母接頭。為了方便記住引腳編號,可留意CAN_LOW 的引腳號小,而 CAN_HIGH 的引腳號大。
2.?5 針 Mini-C
DeviceNet 和 SDS 都使用這種接頭,并且這兩種協(xié)議恰好兼容。

模塊含公接頭。輸入電壓為 24V+/-1%。
注意:在 DeviceNet 規(guī)范版本 1.x 中,圖 9.13 中母接頭的編號順序錯誤。規(guī)范 2.0 及更高版本的編號順序正確。
3.?6 針 Deutsch DT04-6P
CANHUG 推薦將其用移動液壓應(yīng)用場合中。
模塊端為公接頭,總線端為母接頭。目前對于供電沒有建議值。


1.?位布局
出于時序目的,CAN 總線上的每一位都劃分成至少 4 個時間份額。時間份額邏輯上劃分成四組或四段:
? 同步段
??傳播段
??相位段1
??相位段2
以下是 CAN 數(shù)據(jù)位的圖片:

總是一個時間份額長的同步段用于時鐘同步??偩€上的數(shù)據(jù)改變時,預(yù)計會出現(xiàn)一個位邊界。需要傳播段來補償總線線路中的延遲。
如果需要保持時鐘同步,相位段可能會縮短(相位段 1)或延長(相位段 2)。
在相位段 1 和相位段 2 之間的邊界采樣總線電平。
大部分 CAN 控制器還提供在一個位期間進行三次采樣選項。這種情況中,在采樣點之前的兩個時間份額的邊界上進行采樣,結(jié)果取決于擇多譯碼(至少是 82527 的情況)。
2.?時鐘同步
為了調(diào)整片上總線時鐘,CAN 控制器可以將一個位的長度縮短或延長整數(shù)個時間份額。這些位時間調(diào)整的最大值稱為同步跳轉(zhuǎn)寬度(SJW)。
硬同步在起始位從隱性到顯性轉(zhuǎn)換時產(chǎn)生。位時間從該邊界重新開始。
當(dāng)報文中的同步段內(nèi)不發(fā)生位邊沿時,會發(fā)生重新同步。其中一個相位段被縮短或延長,取決于信號中的相位誤差;可以使用的最大量由“同步跳轉(zhuǎn)寬度”參數(shù)確定。
3.?位時序寄存器計算
大多數(shù) CAN 控制器允許編程器使用以下參數(shù)設(shè)置位時序:
??時鐘預(yù)分頻器值
??采樣點前的時間份額數(shù)
??采樣點后的時間份額數(shù)
??同步跳轉(zhuǎn)寬度(SJW)中的時間份額數(shù)
通常為此提供兩個寄存器:btr0 和 btr1。但是,不同控制器之間略有差異,因此請仔細閱讀數(shù)據(jù)表。
恩智浦(恩飛公司)82c200 和 SJA1000 的寄存器布局如下:
??BRP0..BRP5 設(shè)置時鐘預(yù)分頻器值
??SJW0..SJW1 設(shè)置 SJW 的長度
??TSEG10..TSEG13 設(shè)置采樣點之前的時間份額數(shù)(不包含起始位)
??TSEG20..TSEG22 設(shè)置采樣點之后的時間份額數(shù)
??如果要獲取三個樣本,則 SAM 設(shè)置為 1,如果一個樣本就已足夠,則設(shè)置為 0。
注意:這些參數(shù)的實際值比寫入寄存器的值多1。
示例:如果提供給 SJA1000 的振蕩器信號是 16MHz,并且我們想要 250kbps 的比特率,采樣點接近整個位的 62%,以及 SJW 為 2 個時間份額,那么我們可以設(shè)置:
BRP=4,其給出時間份額長度為 2*4/16000000s= 500ns,并且
TSEG1=5,其給出采樣點前有 5 個時間份額,并且
TSEG2=3,其給出采樣點后有 3 個時間份額。
每個位將包含 5+3=8 個時間份額,這樣所需的比特率為 1/(8*500ns)=250kbps。寄存器值應(yīng)該為:
btr0 = (SJW - 1) * 64 + (BRP -1) =
(2-1)*64 + (4-1) =
67 =
0×43
btr1 = SAM * 128 + (TSEG2 - 1)* 16 + (TSEG1 - 1) =
0*128 + (3-1)*16 + (4-1) = ("4″ 因為起始位不包括在內(nèi))
35 =
0×23
采樣點為位的 5/8=62.5%。

1.?CAN 怎樣處理錯誤
錯誤處理內(nèi)建在 CAN 協(xié)議中,對 CAN 系統(tǒng)的運行十分重要。錯誤處理的目標(biāo)是檢測 CAN 總線上出現(xiàn)的報文中的錯誤,從而傳送節(jié)點可以重傳出錯的報文??偩€上的每個 CAN 控制器都會嘗試檢測報文中的錯誤。如果發(fā)現(xiàn)錯誤,發(fā)現(xiàn)節(jié)點將傳送一個錯誤標(biāo)志,從而中斷總線通信。其它節(jié)點將檢測錯誤標(biāo)志導(dǎo)致的錯誤(如果它們尚未檢測到初始錯誤)并采取合適的措施,例如丟棄當(dāng)前報文。
每個節(jié)點維護兩個錯誤計數(shù)器:傳送錯誤計數(shù)器和接收錯誤計數(shù)器。有幾條規(guī)則規(guī)定這些計數(shù)器如何遞增或遞減。實質(zhì)上,檢測到故障的傳送節(jié)點增加其傳送錯誤計數(shù)器比偵聽節(jié)點增加其接收錯誤計數(shù)器要快。這是因為很有可能是傳送節(jié)點發(fā)生了故障!當(dāng)任何錯誤計數(shù)器增加到超過某個值時,節(jié)點將首先進入“被動錯誤”,也就是說,它在檢測到錯誤時不會主動阻止總線通信,然后“離開總線”,這意味著節(jié)點根本不參與總線通信。
使用錯誤計數(shù)器,CAN 節(jié)點不但可以檢測故障,而且可以執(zhí)行錯誤限制。
2.?錯誤檢測機制
CAN 協(xié)議定義了五種以上不同的方法來檢測錯誤。其中兩種在位級別工作,另外三種在報文級別工作。
??位監(jiān)控
??位填充
??幀檢查
??確認(rèn)檢查
??循環(huán)冗余檢查
01. 位監(jiān)控
CAN 總線上的每個傳送節(jié)點都會監(jiān)控(也就是回讀)傳送的信號電平。如果位級別實際讀取的與傳送的不同,則發(fā)出信號指示位錯誤。(仲裁過程中不會發(fā)出位錯誤)。
02. 位填充
當(dāng)一個節(jié)點已經(jīng)發(fā)送了相同級別的五個連續(xù)位時,它將向輸出位流添加相反電平的第六位。接收方將刪除這個額外的位。這樣做是為了避免總線上出現(xiàn)過度的直流電成分,但它同時也給予了接收方檢測錯誤的額外機會:如果總線上出現(xiàn)五個以上相同級別的連續(xù)位,會發(fā)出信號指示填充錯誤。
03. 幀檢查
CAN 報文的一些部分具有固定的格式,也就是說,標(biāo)準(zhǔn)明確定義了何種級別和何時必須發(fā)生。(那些部分是 CRC 定界符、ACK 定界符、幀結(jié)束以及間歇,但是間歇還有一些另外的特殊錯誤檢查規(guī)則)。如果 CAN 控制器在這些固定字段中的一個中檢測到無效值,將發(fā)出組成錯誤。
04. 確認(rèn)檢查
正確接收報文的總線上的所有節(jié)點(不管這些節(jié)點是否對報文內(nèi)容“感興趣”)預(yù)期將在報文中所謂的確認(rèn)時隙中發(fā)送一個顯性電平。發(fā)送節(jié)點在此將發(fā)送隱性電平。如果發(fā)送節(jié)點無法在確認(rèn)時隙中檢測到顯性電平,會發(fā)出確認(rèn)錯誤的信號。
05. 循環(huán)冗余檢查
每個報文都包含一個15位的循環(huán)冗余校驗和(CRC)。節(jié)點如果在報文中檢測到與自己計算所得不同的 CRC,將發(fā)出 CRC 錯誤的信號。
3
錯誤限制機制
總線上的每個 CAN 控制器都將在每個報文中嘗試檢測以上列出的錯誤。如果發(fā)現(xiàn)錯誤,發(fā)現(xiàn)節(jié)點將傳送一個錯誤標(biāo)志,從而中斷總線通信。其它節(jié)點將檢測錯誤標(biāo)志導(dǎo)致的錯誤(如果它們尚未檢測到初始錯誤)并采取合適的措施,例如丟棄當(dāng)前報文。
每個節(jié)點維護兩個錯誤計數(shù)器:傳送錯誤計數(shù)器和接收錯誤計數(shù)器。有幾條規(guī)則規(guī)定這些計數(shù)器如何遞增或遞減。實質(zhì)上,檢測到故障的傳送節(jié)點增加其傳送錯誤計數(shù)器比偵聽節(jié)點增加其接收錯誤計數(shù)器要快。這是因為很有可能是傳送節(jié)點發(fā)生了故障!
節(jié)點開始時處于主動錯誤模式。當(dāng)兩個錯誤計數(shù)器中的任何一個計數(shù)超過 127 時,節(jié)點將進入稱為被動錯誤狀態(tài)。當(dāng)傳送錯誤計數(shù)器達到 255 以上時,節(jié)點將進入總線關(guān)閉狀態(tài)。
??主動錯誤節(jié)點將在檢測到錯誤時發(fā)送主動錯誤標(biāo)志
??被動錯誤節(jié)點將在檢測到錯誤時發(fā)送被動錯誤標(biāo)志
??總線關(guān)閉節(jié)點不會在總線上傳送任何內(nèi)容
增加和減少錯誤計數(shù)器的規(guī)則略顯復(fù)雜,但是原理比較簡單:傳送錯誤給出 8 個錯誤點,而接收錯誤給出 1 個錯誤點。正確傳送和/或接收的報文會導(dǎo)致計數(shù)器減少。
示例(略簡化):假設(shè)總線上節(jié)點 A 運氣不好。每當(dāng) A 嘗試發(fā)送報文時,它都會失?。o論什么原因)。每次發(fā)生這種情況,它將其發(fā)送錯誤計數(shù)器增加 8 并發(fā)送主動錯誤標(biāo)志。然后它將嘗試重傳報文,但是一直失敗。
當(dāng)傳送錯誤計數(shù)器超過 127 時(也就是在 16 次嘗試之后),節(jié)點 A 進入被動錯誤模式。不同之處在于它現(xiàn)在將在總線上傳輸被動錯誤標(biāo)志。被動錯誤標(biāo)志包含 6 個隱性位,不會破壞其它總線通信,所以其它節(jié)點不會偵聽到有關(guān)總線錯誤的反饋。但是,A 繼續(xù)增加其發(fā)送錯誤計數(shù)器。當(dāng)它升高到 255 以上時,節(jié)點 A 最終放棄傳送并進入總線關(guān)閉模式。
其它節(jié)點怎樣響應(yīng)節(jié)點 A?對于 A 傳送的每個主動錯誤標(biāo)志,其它節(jié)點將其自身接收錯誤計數(shù)器增加 1。當(dāng) A 進入總線關(guān)閉時,其他節(jié)點的接收錯誤計數(shù)器的計數(shù)遠低于錯誤被動極限值 127。
每次正確收到一條報文,這個計數(shù)將減 1。但是,節(jié)點 A 將停留在總線關(guān)閉模式。
大部分 CAN 控制器將為兩種狀態(tài)提供狀態(tài)位(和相應(yīng)的中斷):
??“錯誤警告” – 一個或兩個錯誤計數(shù)器的計數(shù)超過 96
??“總線關(guān)閉”,如上所述。
部分是這樣,但不是所有!控制器還為被動錯誤狀態(tài)提供了一個位。一些控制器還可以直接訪問錯誤計數(shù)器。
CAN 控制器在發(fā)生錯誤時自動重傳報文的特性有時候會很煩人。市場上至少有一種控制器(飛利浦公司生產(chǎn)的 SJA1000)允許對錯誤處理完全人工控制。
4.?總線故障模式
ISO11898 標(biāo)準(zhǔn)列出了 CAN 總線電纜的幾種故障模式:
??CAN_H 中斷
??CAN_L 中斷
??CAN_H 短路到電池電壓
??CAN_L 短路到接地
??CAN_H 短路到接地
??CAN_L 短路到電池電壓
??CAN_L 短路到 CAN_H 線路
??CAN_H 和 CAN_L 在同一個位置中斷
??丟失到終端網(wǎng)絡(luò)的連接
對于故障 1-6 和 9,建議減小 S/N 比率保持總線繼續(xù)工作。對于故障 8,建議保持產(chǎn)生的子系統(tǒng)繼續(xù)工作。對于故障 7,可以選擇減小 S/N 比率繼續(xù)工作。
實踐中,使用 82C250 類型收發(fā)器的 CAN 系統(tǒng)無法在發(fā)生故障 1-7 時繼續(xù)工作,在發(fā)生故障 8-9時可能無法繼續(xù)工作。
但是,存在諸如 TJA1053 等有容錯能力的驅(qū)動程序可以處理所有故障。通常,獲得這種容錯能力的代價是最大速度受到限制。對于 TJA1053,最大速度是 125kbps。

CAN 標(biāo)準(zhǔn)在基本級定義硬件(“物理層” - 有幾種)和通信(“數(shù)據(jù)鏈路層”)。CAN 協(xié)議本身只是規(guī)定如何使用共享通信介質(zhì)將小數(shù)據(jù)包從 A 點傳輸?shù)?B 點。它不包含流量控制,數(shù)據(jù)傳輸大于可容納 8 字節(jié)的報文,節(jié)點地址,通信建立等。
為了管理系統(tǒng)內(nèi)的通信,需要更高層協(xié)議(HLP)。術(shù)語 HLP 來源于 OSI 模型及其七個層次。HLP通常規(guī)定如下:
??啟動行為
??如何在系統(tǒng)內(nèi)不同的節(jié)點中分發(fā)報文標(biāo)識符
??如何編譯數(shù)據(jù)幀的內(nèi)容
??系統(tǒng)內(nèi)的狀態(tài)報告
1.?不同的高層協(xié)議
CAN 總線有很多(幾十種)高層協(xié)議。最常見的如下:
??CanKingdom
??CANopen
??CCP/XCP
??DeviceNet
??MilCAN
??NMEA 2000?
??OSEK/VDX
??SDS
??J1939:?簡介和標(biāo)準(zhǔn)概述
2.?其他相關(guān)協(xié)議和標(biāo)準(zhǔn)
和 CAN 關(guān)系密切的協(xié)議和標(biāo)準(zhǔn)非常多。下面列出了幾種:
??LIN 總線
??J1587?
??J1708?
??J2534?
??RP1210A, RP1210 B
