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