介紹:CAN總線
CAN總線是廣播類型的總線。這意味著所有節點都可以偵聽到所有傳輸的報文。無法將報文單獨發送給指定節點;所有節點都將始終捕獲所有報文。但是,CAN硬件能夠提供本地過濾功能,讓每個節點對報文有選擇性地做出響應。
總線使用不歸零位填充。模塊以線與邏輯連接到總線:如果只有一個節點向總線傳輸邏輯0,那么不管有多少個節點向總線傳輸邏輯1,整個總線都處于邏輯0狀態。
CAN標準定義四種不同的報文類型。報文使用逐位仲裁智能方案來控制對總線的訪問,每條報文都帶有優先級標記。
CAN標準還為錯誤處理和消除定義了詳細的方案,這在第9節“CAN錯誤處理”(第23頁)中有更詳細的說明。
在本教程第8頁討論位時序和時鐘同步。位時序計算器見此頁面,您可以用它來計算CAN總線參數和寄存器設置。
CAN可以使用不同的物理層來實現(第5頁),這里闡述其中一些。而且,可以使用許多不同種類的連接器。我們還為對報文細節感興趣的用戶提供了許多示波器圖片(第6頁)。
CAN報文(第1頁/共3頁)
CAN總線是廣播類型的總線。這意味著所有節點都可以偵聽到所有傳輸的報文。無法將報文單獨發送給指定節點;所有節點都將始終捕獲所有報文。但是CAN硬件能夠提供本地過濾功能,讓每個節點對報文有選擇性地做出響應。
CAN報文
CAN使用短報文 – 最大實用負載是94位。報文中沒有任何明確的地址;相反,可以認為報文是通過內容尋址,也就是說,報文的內容隱式地確定其地址。
報文類型
CAN總線上有四種不同的報文類型(或“幀”):
數據幀
遠程幀
錯誤幀
過載幀
1. 數據幀
概要:“大家好,這是一些標簽為X的數據,希望滿足您的需要!”
數據幀是最常見的報文類型。由下列主要部分組成(出于簡潔性目的,忽略了一些細節):
仲裁字段。當兩個或多個節點競爭總線時,確定報文的優先級。仲裁字段包含:
對于CAN 2.0A,一個11位的標識符和一個支配數據幀的RTR位。
對于CAN 2.0B,一個29位的標識符(其中還包含兩個隱性位:SRR和IDE)和RTR位。
數據字段。包含0到8字節數據。
CRC字段。包含一個基于報文大部分數據計算得到的15位校驗和。校驗和用于錯誤檢測。
應答時隙。任何能夠正確接收報文的CAN控制器都會在每條報文的末尾發送一個應答位。傳送節點檢查應答位是否存在,如果沒有檢測到應答位,會重新發送報文。
注1:請注意,總線上存在應答位不表示任何目標地址已經收到報文。唯一表示的是,總線上的一個或多個節點已經正確收到報文。
注2:仲裁字段中的標識符不一定標識報文的內容,盡管其名字會讓人如此認為。
2. 遠程幀
概要:“大家好,有沒有人能夠生成標簽為X的數據?”
遠程幀與數據幀十分相似,但是有兩個重要的區別:
它被顯式標記為遠程幀(仲裁字段中的RTR位為隱性),并且
它沒有數據字段。
遠程幀的預期目的是征求傳輸相應的數據幀。例如,如果節點A傳輸一個仲裁字段設置為234的遠程幀,那么節點B(如果已經正確初始化)可能通過一個仲裁字段也設置為234的數據幀進行響應。
遠程幀可以用來實現總線通信管理的請求-響應類型。但是,遠程幀在實踐中很少使用。還有一點值得注意的是,CAN標準沒有規定這里列出的特性。大部分CAN控制器都可以進行編程自動響應遠程幀或通知本地CPU。
關于遠程幀的一個注意事項:數據長度代碼必須設置成預期響應報文的長度。否則仲裁將不起作用。
有時據稱響應遠程幀的節點會在識別標識符后立即開始傳輸,從而“填充”空的遠程幀。但是事實并非如此
概要:“大家好(大聲),讓我們重新試一下”
簡單地說,錯誤幀是一種違背CAN報文幀規則的特殊報文。一個節點咋在檢測到故障時傳送錯誤幀,這將導致所有其它節點也檢測到故障,它們也將發送錯誤幀。然后傳送節點將自動嘗試重傳報文。有一種精準的錯誤計數器方案,可以確保節點無法通過重復傳輸錯誤幀來破壞總線通信。
錯誤幀包含一個錯誤標志。這個錯誤標志是6位長的相同值(因此違背位填充規則)和一個錯誤定界符(8個隱性位)。錯誤定界符提供一些空間,以便總線上其它節點在檢測到第一個錯誤標志時可以發送它們的錯誤標志。
錯誤幀圖示如下:
4. 過載幀
概要:“我是非常繁忙的小型82526,您可以稍等片刻嗎?”
這里,我們僅僅出于知識完整性目的而提及過載幀。在格式方面,過載幀與錯誤幀非常相似,并且由會變得重荷的節點傳送。過載幀并不常用,因為當今的CAN控制器會非常智能化地避免使用過載幀。事實上,會生成過載幀的唯一一種控制器是現在已經過時的82526。
標準CAN和擴展CAN
最初,CAN標準把仲裁字段中標識符的長度定義為11位。后來,客戶的需求推動了該標準得延伸。新格式通常稱為擴展CAN,標識符不允許少于29位。為了區分這兩種幀類型,在控制字段中使用了一個保留位。
標準的正式名稱
是
2.0A,僅支持11位標識符
2.0B,支持完整的29位標識符(也可以混合使用11位標識符)的擴展版本。2.0B節點可以是
“2.0B主動型”,也就是說,它可以發送和接收擴展幀,或者
“2.0B被動型”,也就是說,它將靜默丟棄接收到的擴展幀(但是請參考下述內容)
1.x表示初始規范及其修訂版。
如今的新型CAN控制器通常是2.0B類型。1.x或2.0A類型的控制器如果接收到29個仲裁位的報文會很麻煩。2.0B被動型控制器容許這些報文,如果它們正確的話會進行應答,然后拋棄這些報文。2.0B主動型控制器既可傳送也可接收這些報文。
實現2.0B和2.0A(和1.x)的控制器相互兼容,并且可以在同一總線上使用它們,則只要實現2.0B的控制器不發送擴展幀即可!
有時候人們說標準CAN“優于”擴展CAN,因為擴展CAN報文會產生更多的間接費用。這種說法未必正確。如果您使用仲裁字段來傳送數據,那么擴展CAN實際上的發生的間接費用可能比標準CAN少。CAN報文(第3頁/共3頁)
基本CAN和完整CAN
術語“基本CAN”和“完整CAN”源自CAN的初創年代。歷史上曾經有Intel 82526 CAN控制器,它為程序員提供DPRAM型接口。然后出現了Philips 82C200 CAN控制器,它使用面向FIFO(隊列)的編程模型和有限制的過濾功能。為了區分這兩種編程模型,人們出于某些原因把Intel的模型稱為“完整CAN”,把Philips的模型稱為“基本CAN”。如今,大多數CAN控制器同時支持這兩種編程模型,所以沒有理由繼續使用術語“基本CAN”和“完整CAN”。事實上,這些術語可能會令人迷惑,應當盡量避免。
當然,“完整CAN”控制器可以和“基本CAN”進行通信,反之也可。不存在任何兼容性問題。
總線仲裁和報文優先級
報文仲裁(兩個或多個CAN控制器協商確定誰使用總線的過程)對于數據傳送中真正可用的帶寬非常重要。
任何CAN控制器都可能在檢測到空閑總線時開始傳送數據。這可能會導致兩個或多個控制器(幾乎)同時開始傳送報文。通過下述方法解決這種沖突。傳送節點在發送報文時監視總線。如果節點在自身發送隱性位時檢測到顯性位,它將立即退出仲裁過程并轉變成接收方。仲裁針對整個仲裁字段進行,當該字段已經被發送時,總線上恰好只剩一個傳送節點。這個節點就像什么都沒發生那樣繼續傳送。其它潛在的傳送節點將在總線下次空閑時嘗試重傳它們的報文。仲裁過程不會消耗時間。
這種逐位仲裁成功的重要條件是兩個節點不會傳送相同的仲裁字段。這個規則有一個例外:如果報文不包含任何數據,那么任何節點都可傳送該報文。
因為總線采用線與邏輯,并且顯性位是邏輯0,所以包含數值最低仲裁字段的報文將贏得仲裁。
問:如果一個節點是總線上的唯一節點并且試圖進行傳送,會發生什么情況?
答:當然,節點將贏得仲裁并順利地進行報文傳送。但是,當進行應答的時候,沒有任何節點將在應答時隙(ACK時隙)發送顯性位,所以傳送節點將檢測到ACK錯誤,發送錯誤標志,將傳送錯誤計數器加8并開始重傳。這將發生16次。然后傳送節點將進入錯誤被動狀態。通過錯誤限制算法的特殊規則,如果節點為被動錯誤并且錯誤是ACK錯誤,則傳送錯誤計數器不再增加。所以節點將一直繼續傳送,至少要到有人應答報文。
報文尋址和標識
再次提醒,CAN報文中無顯式地址。每個CAN控制器都會檢查總線上的所有通信,并使用硬件過濾器和軟件的組合來確定是否對該報文“感興趣”。
事實上,CAN中沒有報文地址的概念。報文的內容由存在于報文中某處的標識符進行標識。CAN報文被稱為“內容尋址”的報文。
常規的報文地址類似于“這是發給節點X的報文”。而內容尋址的報文類似于“這是包含標簽為X的數據的報文”。這兩個概念之間的區別很小但是非常重要。
根據標準,仲裁字段的內容用來確定總線上報文的優先級。所有CAN控制器還將在硬件過濾過程中使用整個(一些控制器將只使用一部分)仲裁字段作為主鍵。
標準沒有規定仲裁字段必須用作報文標識符。但是不管怎樣,這是一種常見情況。
標識符值注意事項
我們說過,標識符可以是11位(CAN 2.0A)或29位(CAN 2.0B)。這不完全正確。出于與某種老式CAN控制器(猜猜是哪種)兼容的原因,標識符不得把7個最高有效位都設置為1。所以,對于11位標識符,只剩下0到2031,29位標識符可以使用532676608個不同的值。
注意,所有其它CAN控制器都接受“非法”標識符,所以現代CAN系統標識符2032到2047可以自由使用。
CAN物理層
CAN總線
CAN總線使用不歸零(NRZ)的位填充。有兩種不同的信令狀態:顯性(邏輯0)和隱性(邏輯1)。這些信令狀態對應于所在物理層(存在幾種不同的物理層)的某種電平。模塊以線與邏輯連接到總線:哪怕只有一個節點發送邏輯0使得總線處于顯性狀態,那么不管有多少隱形狀態的節點傳送,則整個總線都處于顯性狀態。
不同的物理層
物理層定義總線上的電平和信令方案、纜線阻抗和類似的方面。
有幾種不同的物理層:
最常見的類型由CAN標準ISO11898-2部分定義的,它是雙線平衡信令方案。有時也稱為“高速CAN”。
同一個ISO標準的另一部分(ISO 11898-3)為低總線速度定義了另一種雙線平衡信令方案。它具有容錯能力,所以即使一條總線線纜斷開或對地短路或連接到備用電池,信號都可以繼續發出。有時也稱為“低速CAN”。
SAE J2411定義單線纜(當然加上接地)物理層。主要用在汽車中 – 例如GM-LAN。
還有幾種專有的物理層。
在沒有CAN驅動程序的早期,RS485修訂版。
有關報文的詳細信息,請轉到第6頁查看多個示波器圖片。
規則規定不同的物理層不能交互操作。某些組合可能在良好的條件下工作,或看上去可以工作。例如,在同一條總線上同時使用“高速”和“低速”收發器,有時可以工作。
大量CAN收發器芯片產自Philips;其它廠商包括Bosch、Infineon、Siliconix和Unitrode。
一種常見的收發器類型是82C250,它實現ISO 11898定義的物理層。82C251是一種改進的版本。
“低速CAN”的一種常見收發器是產自Philips的TJA1054。
最大總線速度
按照標準,CAN總線的最大速度是1 Mbps。然而,一些CAN控制器能夠處理比1Mbps更快的速度,可以在特殊應用場合中使用。
低速CAN(ISO 11898-3,參見上文)最快可以達到125 kbps。
單線CAN在標準模式下可高達約50kbps,并且如果使用特殊的高速模式,諸如用于ECU編程,可以高達約100kbps。
最小總線速度
注意,一些總線收發器不允許低于特定的比特率。例如,使用82C250或82C251時,低于10kbps不會有問題。但是,如果使用TJA1050,則不能低于大約50kbps。請查閱數據表。
最大線纜長度
如果速度為1Mbps,可以使用的最大線纜長度大約為40米(130英尺)。這是因為仲裁方案要求信號的峰值可以到達最遠的節點并且在位采樣之前再次返回。換言之,線纜長度受光速限制。曾有人提出提高光速,但是因為這會產生時空交錯而被駁回。
其它的最大線纜長度是(這些是近似值) –
100米(330英尺),比特率為500kbps
200米(650英尺),比特率為250kbps
500米(1600英尺),比特率為125kbps
6千米(20000英尺),比特率為10kbps
如果使用光耦合器來提供電隔離,那么最大總線長度會相應地減小。提示:使用快速光耦合器并通過設備查看延遲,而不是采用指定的最大比特率。
總線端接
ISO 11898 CAN總線必須進行端接。 通過在總線各端點使用120歐姆的電阻達到這個要求。端接可以達到兩個目的:
消除總線終端處的信號反射。
確??偩€獲得正確的直流電電平。
不管速度快慢,ISO 11898 CAN總線始終都必須進行端接。我將重復這一點:不管速度快慢,ISO 11898 CAN總線始終都必須進行端接。對于實驗性工作,一個端接器可能就已足夠。如果沒有連接任何端接器,但是您的CAN總線仍然能夠正常工作,那么您只是比較幸運而已。
注意,其它物理層(例如“低速CAN”、單線纜CAN和其它物理層)不一定需要進行端接。但是您的常用高速ISO 11898 CAN總線總是需要至少一個端接器。
請參考這篇文章獲取關于CAN總線端接的更多信息。
線纜
ISO11898規定線纜阻抗標稱值為120歐姆,但允許[108-132]歐姆區間的阻抗。
現今市場上滿足這種要求的線纜并不多。允許的阻抗區間將來很有可能會擴大。
ISO 11898針對屏蔽或非屏蔽的雙絞線而定義。單線纜標準SAE J2411的相關工作正在進行之中。
CAN連接器
對于CAN總線連接器,根本沒有任何標準!通常,每種高層協議都會定義一種或一些首選的連接器類型。常見的類型包括
9針DSUB(由iCiA建議)。
DeviceNet和SDS使用的5針Mini-C和/或Micro-C連接器。
由CANHUG提出的用于移動液壓裝置的6針Deutch連接器。
參見第7頁中一些不同的連接器布局。
CAN示波器圖片
這是一幅來自最普通的ISO11898CAN總線的圖片,以1Mbps速率運行。收發器是82C251。也就是說,物理層是由ISO 11898指定的。
測量在CAN_H(CAN高位)和GND(接地)之間進行。注意,靜態和隱性總線電壓在2.5 V左右。傳送顯性位時,電壓升高到3.5V左右。
以下是同一個總線,但是測量在CAN_L(CAN低位)和GND(接地)之間進行:
這是另一個以125 kbps比特率發送的報文。報文的(11位)標識符是300(十六進制值為12c)。如果仔細察看,您應該能夠識別報文中前面的位
這是一幅更復雜的圖片。它顯示與上面例子相同的報文。仍然是11位標識符300,比特率仍然是125kbps,但是CAN總線上沒有端接。CAN線纜是短扁平帶狀線纜。
那么,發生了什么情況?這里,比特率是125kbps,所以一個位的時間是8微秒。
首先傳送節點發送一個起始位。這是一個邏輯’0′,也就是一個顯性電平。
然后傳送標識符。十進制300的十六進制值是12c,或者二進制表示是001 0010 1100。前兩個0會順利傳送。這解釋了圖片中看到的24微秒的顯性電平。
然后應該傳送一個’1′。但是因為總線沒有端接,所以斜率上升不是預期的結果。傳送節點現在將認為它在總線上看到的是’0′。
因為這種情況發生在仲裁階段,所以傳送節點將停止傳送,其認為有其它節點正在傳送??偩€現在將變為隱性狀態,因為實際上沒有節點在傳送。
在6個隱性位之后,傳送節點和接收節點都將檢測到填充錯誤,并開始進行錯誤處理。這時,已經經過了80微秒(一個起始位、兩個2個‘0’、一個誤解位和六個隱性位,總共10個位,等于80微秒)。
檢測到數據錯誤的所有節點現在將開始傳送一個錯誤幀。這種情況下,因為在捕獲到上方圖片之前產生了許多錯誤,錯誤幀為被動型,所以傳送節點是錯誤被動型。被動型錯誤幀和主動型錯誤幀相似,但是使用隱性電平進行傳送,所以在總線上不可見。
被動型錯誤幀持續6位的時間。
然后,所有節點等待8個隱性位的時長(稱為錯誤定界符)。
然后,所有節點等待3個隱性位的時長(稱為間歇)。
對以上時間求和,結果是1+6+6+8+3 = 24個隱性位 = 192微秒(如圖)
經驗提示:始終端接CAN總線!反射不一定有害,但是損壞的邊緣形狀將破壞通信。
這里是同一個CAN總線在另一個時間刻度中的情況:
CAN總線大約2分米(8英寸)長。信號的下沖和振鈴均可見,但是在這種情況中無關緊要。這次,平緩的上升斜率是問題所在。
這里是相同的設置,但是這次傳送節點和接收節點都是錯誤主動型:
發生了什么情況?
如上圖所示,傳送了三個‘0’(花費24微秒),接下去的位被誤解,所以傳送器認為它已經失去仲裁。
傳送節點等待6位,然后檢測到一個填充錯誤。誤解的位和這6個位花費56微秒。
傳送節點和接收節點現在開始傳送錯誤幀。它是6個顯性位(48微秒)。
傳送錯誤幀的節點現在等待8個隱性位。但是,因為上升斜率不對,第一個位被誤解。節點將認為這是另一個節點在傳送錯誤幀,所以將忽略它。
當總線回到隱性電平時,所有節點等待8位。
然后是3個隱性位的間歇。
3+9 = 12個位 = 96微秒(如圖中所示)。
然后,傳送節點重新嘗試并得到相同的結果。一段時間以后,傳送節點進入錯誤被動型狀態,并將如前所述那樣運行。
這里是另一幅圖片。在此設置中,CAN總線上只有一個節點(正確端接)。該節點試圖傳送一條報文,但是沒有其它節點在偵聽。
那么,會發生什么情況?
首先,傳送節點發送整個報文。
傳送節點期望在ACK時隙中填充一個顯性電平。但是,因為沒有其它節點在偵聽,沒有任何ACK到達,所以傳送節點檢測到一個應答錯誤。
然后傳送器傳送一個被動型錯誤標志(上圖中,嘗試發送了幾秒鐘,所以不再是錯誤主動型,而是被動型)。
被動型錯誤標志后面跟隨一個錯誤定界符和間歇。
因為這個節點嘗試發送一個報文但是操作失敗,它必須再等待8位才能開始新的傳送。這種情況在CAN規范中稱為“掛起傳送”。
傳送節點還必須將其傳送錯誤計數加8。但是,這是CAN規范中的特殊情況,只有當傳送節點是錯誤主動型時才會發生。當傳送節點進入錯誤被動型時,它不會增加其傳送節點錯誤計數(這種情況中),而是會不斷重試傳送。
所以,上圖表示,一條報文被傳送,然后短暫停頓(時間為錯誤標志、錯誤定界符、間歇和掛起傳送的總和)。然后報文被不斷重傳……
CAN連接器
9針DSUB
?
1 | – | 保留位 |
2 | CAN_L(CAN低位) | CAN_L總線線路(顯性低位) |
3 | CAN_GND(CAN接地) | CAN接地 |
4 | – | 保留位 |
5 | CAN_SHLD(CAN屏蔽) | 可選 CAN屏蔽 |
6 | GND(接地) | 可選 CAN接地 |
7 | CAN_H(CAN高位) | CAN_H總線線路(顯性高位) |
8 | – | 保留位(錯誤行) |
9 | CAN_V+(CAN電源) | 可選 電源 |
KVASER用戶:請注意,文檔“LAPcan硬件指南”中闡述了如何在KVASER DRVcan驅動器線纜上使用這些引腳,可以在此該文檔。
如果如果供電,電壓范圍應該為+7至+13 V,額定電流為100 mA。模塊提供一個公接頭,內部必須連接引腳3和6。
引腳編號適用于接頭側視圖的公接頭或焊接側視圖的母接頭。為了方便記住引腳編號,可留意CAN_LOW的引腳號小,而CAN_HIGH的引腳號大。
5針迷你C型接頭
DeviceNet和SDS都使用這種接頭,并且這兩種協議碰巧兼容。
?
引腳 | 功能 | DeviceNet顏色 |
1 | 信號輸出 | 無顏色 |
2 | V+ | 紅色 |
3 | V- | 黑色 |
4 | CAN_H | 白色 |
5 | CAN_L | 藍色 |
模塊含公接頭。輸入電壓為24V+/-1%。
注意:在DeviceNet規范版本1.x中,圖9.13中母接頭的編號順序錯誤。規范2.0及后續版本的編號順序正確。
6針德馳DT04-6P
CANHUG建議用在移動液壓應用場合中。
模塊端為公接頭,總線端為母接頭。對于輸入電壓,目前沒有建議的值。
?
引腳 | 功能 | 建議的線纜顏色 |
1 | 電源負極 | 黑色 |
2 | CAN_H | 白色 |
3 | 可選 – 信號接地 | 黃色 |
4 | 可選 – 啟動 | 灰色 |
5 | 電源正極 | 紅色 |
6 | CAN_L | 藍色 |
CAN位時序
位布局
出于時序目的,CAN總線上的每個位都劃分成至少4個時間份額。時間份額邏輯上劃分成四個組或段-
同步段
傳播段
相位段1
相位段2
以下是CAN數據位的圖片:
輔助工具
位時序計算器
指定輸入頻率和總線速度計算所有可能的CAN總線參數集
同步段始終是一個時間份額長,用于時鐘同步??偩€上的數據改變時,預計會出現一個位邊沿。
傳播段用來補償總線線路中的延遲。
如有必要,相位段可以縮短(相位段1)或延長(相位段2),以保持時鐘同步。
在相位段1和相位段2之間的邊沿上對總線電平進行采樣。
大部分CAN控制器還提供選項可以在一個位期間進行三次采樣。這種情況中,在采樣點之前的兩個時間份額的邊沿上進行采樣,擇多譯碼(至少82527是這樣)。
時鐘同步
為了調整片上總線時鐘,CAN控制器可以將位的長度縮短或延長整數倍個時間份額。這些位時間調整的最大值稱為同步跳變寬度(SJW)。
硬同步在起始位從隱性到顯性轉換時產生。位時間從該邊沿重新開始。
重新同步是在報文的同步段中不發生位邊沿時產生。一個相位段被縮短或延長,其縮短值或延長值取決于信號中的相位誤差??梢允褂玫淖畲笾涤赏教儗挾葏禌Q定。
位時序寄存器計算
大部分CAN控制器允許程序員使用下列參數設置位時序:
時鐘預分頻器值
采樣點前的時間份額數
采樣點后的時間份額數
同步跳變寬度(SJW)中的時間份額數
通常為此提供兩個寄存器:btr0和btr1。但是,不同控制器之間略有差異,因此請仔細閱讀數據表。
恩智浦(恩飛公司)82c200和SJA1000的寄存器布局如下:
?
? | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
btr0 | SJW1 | SJW0 | BRP5 | BRP4 | BRP3 | BRP2 | BRP1 | BRP0 |
btr1 | SAM | TSEG22 | TSEG21 | TSEG20 | TSEG13 | TSEG12 | TSEG11 | TSEG10 |
BRP0..BRP5設置時鐘預分頻器值
SJW0..SJW1設置SJW的長度
TSEG10..TSEG13設置采樣點前的時間份額數(不包含起始位)
TSEG20..TSEG22設置采樣點后的時間份額數
如果要獲取三個樣本,則SAM設置為1,如果一個樣本就已足夠,則設置為0。
注意:這些參數的實際值比寫入寄存器的值大1。
示例:如果提供給SJA1000的振蕩器信號是16MHz,我們想要250kbps的比特率,采樣點接近整個位的62%,以及SJW為2個時間份額,那么我們可以設置 –
BRP = 4,指定時間份額長度為2 * 4 / 16000000 s = 500納秒,以及
TSEG1 = 5,指定采樣點之前有5個時間份額,以及
TSEG2 = 3,指定采樣點之后有3個時間份額。
這樣,每個位都將包含5 + 3 = 8個時間份額,最終的比特率為1 / (8 * 500 ns) = 250 kbps。寄存器值應該為
?
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″ 因為不包含起始位) 35 = 0×23 |
采樣點為位的5/8=62.5%。
CAN錯誤處理
CAN怎樣處理錯誤
錯誤處理內建在CAN協議中,對CAN系統的運行十分重要。錯誤處理的目標是檢測CAN總線上出現的報文中的錯誤,從而傳送器可以重傳出錯的報文??偩€上的每個CAN控制器都會嘗試檢測報文中的錯誤。如果發現錯誤,發現節點將傳送一個錯誤標志,從而中斷總線通信。其它節點將檢測錯誤標志導致的錯誤(如果它們尚未檢測到初始錯誤)并采取合適的措施(例如丟棄當前報文)。
每個節點維護兩個錯誤計數器:傳送錯誤計數器和接收錯誤計數器。有幾個規則規定這些計數器怎樣增加和/或減少計數??偟膩碇v,檢測到故障的傳送器增加其傳送錯誤計數器比偵聽節點增加其接收錯誤計數器要快。這是因為,很有可能是傳送器發生了故障!當任何錯誤計數器增加到超過某個值時,節點將首先進入“錯誤被動”,也就是說,它在檢測到錯誤時不會積極地阻止總線通信,然后“離開總線”,這意味著節點根本不參與總線通信。
使用錯誤計數器,CAN節點不但可以檢測故障,而且可以執行錯誤限制。
錯誤檢測機制
CAN協議定義了五種以上不同的方法來檢測錯誤。其中兩種工作在位層次,另外三種工作在報文層次。
位監視
位填充
幀檢查
應答檢查
循環冗余檢查
1. 位監視
CAN總線上的每個傳送器都會監視(也就是回讀)傳送的信號電平。如果真正讀到的位電平與傳送的位電平不同,會發出信號指示位錯誤(仲裁過程中不會發出位錯誤)。
2. 位填充
節點連續發送五個具有相同電平的位后,將在發送出去的位流中加上第六個相反電平的位。接收方將刪除這個額外的位。這樣做是為了避免總線上出現過度的直流電成分,但它同時也給予了接收方檢測錯誤的額外機會:如果總線上出現五個以上相同電平的連續位,會發出信號指示填充錯誤。
3. 幀檢查
CAN報文的一些部分具有固定的格式,也就是說,標準明確定義了何種電平和何時出現這種電平(CRC定界符、ACK定界符、幀結束以及間歇,但是間歇還有一些另外的特殊錯誤檢查規則)。如果一個CAN控制器在這些固定字段中的一個中檢測到無效值,將發出組成錯誤。
4. 應答檢查
總線上正確接收報文的所有節點(不管這些節點是否對報文內容“感興趣”)預期將在報文中所謂的應答時隙中發送一個顯性電平。這是,發送方將發送一個隱性電平。如果發送方無法在應答時隙中檢測到顯性電平,會發出應答錯誤的信號。
5. 循環冗余檢查
每個報文都包含一個15位的循環冗余校驗和(CRC)。節點如果在報文中檢測到與自己計算所得不同的CRC,將發出CRC錯誤的信號。
錯誤限制機制
總線上的每個CAN控制器都將在每個報文中嘗試檢測以上列出的錯誤。如果發現錯誤,發現節點將發送一個錯誤標志,從而停止總線通信。其它節點將檢測到由錯誤標志引發的錯誤(如果它們尚未檢測到原始錯誤)并采取恰當的措施(也就是丟棄當前報文)。
每個節點維護兩個錯誤計數器:傳送錯誤計數器和接收錯誤計數器。有幾個規則規定這些計數器怎樣增加和/或減少計數??偟膩碇v,檢測到故障的傳送器增加其傳送錯誤計數器比偵聽節點增加其接收錯誤計數器要快。這是因為很有可能是傳送器發生了故障!
節點開始時處于主動錯誤模式。當兩個錯誤計數器中的任何一個的計數超過127時,當兩個錯誤計數器中的任何一個計數超過127時,節點將進入稱為被動錯誤的狀態。當傳送錯誤計數器達到255以上時,節點將進入總線離線狀態。
主動錯誤節點將在檢測到錯誤時發送主動錯誤標志。
被動錯誤節點將在檢測到錯誤時發送被動錯誤標志。
總線離線節點不會在總線上傳送任何內容。
增加和減少錯誤計數器的規則略顯復雜,但是原理比較簡單:傳送錯誤的步進為8個錯誤點數,而接收錯誤的步進為1個錯誤點數。正確傳送和/或接收的報文會減小計數器值。
示例(稍加簡化):假設總線上的節點A運氣不好。不管什么時候A發送報文都發生失?。ㄓ捎诜N種原因)。每次失敗時,它的傳送錯誤計數器增加8并發送主動錯誤標志。然后它將嘗試重傳報文,但是一直失敗。
當傳送錯誤計數器超過127時(也就是在16次嘗試之后),節點A進入被動錯誤模式。區別在于,它現在將在總線上傳送被動錯誤標志。被動錯誤標志包含6個隱性位,不會影響其它的總線通信,所以其它節點不會偵聽到有關總線錯誤的反饋。但是,A繼續增加其傳送錯誤計數器。當計數值超過255時,節點A最終放棄傳送并進入總線離線模式。
其它節點怎樣響應節點A?對于A傳送的每個主動錯誤標志,其它節點將為其接收錯誤計數器增加1。當A進入總線離線狀態時,其它節點的接收錯誤計數器的計數大大低于錯誤被動的限制值(127)。每次正確收到一條報文,這個計數值將減1。但是,節點A將停留在總線離線狀態。
大部分CAN控制器將為兩種狀態提供狀態位(和相應的中斷):
“錯誤警告” – 一個或兩個錯誤計數器的計數超過96
“總線離線”,如上所述。
一些控制器(但不是所有)還為被動錯誤狀態提供一個位。一些控制器還可以直接訪問錯誤計數器。
CAN控制器在發生錯誤時自動重傳報文的特性有時候會很煩人。市場上至少有一種控制器(飛利浦公司生產的SJA1000)允許對錯誤處理完全人工控制。
總線故障模式
ISO 11898標準列出了CAN總線線纜的幾種故障模式:
CAN_H中斷
CAN_L中斷
CAN_H短路到電池電壓
CAN_L短路到接地
CAN_H短路到接地
CAN_L短路到電池電壓
CAN_L短路到CAN_H線路
CAN_H和CAN_L在同一個位置中斷
丟失到終端網絡的連接
對于故障1-6和9,建議減小S/N比率保持總線繼續工作。對于故障8,建議保持產生的子系統繼續工作。對于故障7,可以選擇減小S/N比率繼續工作。
實踐中,使用82C250類型收發器的CAN系統無法在發生故障1-7時繼續工作,在發生故障8-9時可能無法繼續工作。
但是,存在諸如TJA1053等容錯能力強的驅動程序可以處理所有故障。通常,獲得這種容錯能力的代價是最大速度受到限制。對于TJA1053,最大速度是125kbps。
高層協議
CAN標準定義的是硬件(物理層 – 有幾種)和通信的基本層面(數據鏈路層)。CAN協議本身只規定如何使用共享的通信介質將小型數據包從A點傳輸到B點。為了管理系統中的通信,需要一種高層協議(HLP)。
高層協議包括常見的標準,例如J1939、CANopen和CCP/XCP等。
評論
查看更多