前言
CAN總線的應(yīng)用在現(xiàn)在看來(lái)越來(lái)越廣泛,我廠設(shè)備從最初的ARM9與ARM7平臺(tái)、期間升級(jí)過(guò)度到CortexA8與Cortex M3平臺(tái),再到現(xiàn)在的Cortex M4平臺(tái),圍繞CAN進(jìn)行了一系列產(chǎn)品的開發(fā),CAN總線的穩(wěn)定性是毋庸置疑的。
CAN總線物理結(jié)構(gòu)與特性
CAN總線網(wǎng)絡(luò)
CAN總線網(wǎng)絡(luò)主要掛在CAN_H和CAN_L,各個(gè)節(jié)點(diǎn)通過(guò)這兩條線實(shí)現(xiàn)信號(hào)的串行差分傳輸,為了避免信號(hào)的反射和干擾,還需要在CAN_H和CAN_L之間接上120歐姆的終端電阻,但是為什么是120歐姆呢?那是因?yàn)?span style="background-color:#FFFF00;">電纜的特性阻抗為120歐。
CAN收發(fā)器
CAN收發(fā)器的作用是負(fù)責(zé)邏輯電平和信號(hào)電平之間的轉(zhuǎn)換。
即從CAN控制芯片輸出邏輯電平到CAN收發(fā)器,然后經(jīng)過(guò)CAN收發(fā)器內(nèi)部轉(zhuǎn)換將邏輯電平轉(zhuǎn)換為差分信號(hào)輸出到CAN總線上,CAN總線上的節(jié)點(diǎn)都可以決定自己是否需要總線上的數(shù)據(jù)。具體的管教定義如下:
信號(hào)表示
CAN總線采用不歸零碼位填充技術(shù),也就是說(shuō)CAN總線上的信號(hào)有兩種不同的信號(hào)狀態(tài),分別是顯性的(Dominant)邏輯0和隱形的(recessive)邏輯1,信號(hào)每一次傳輸完后不需要返回到邏輯0(顯性)的電平。
位填充規(guī)則:發(fā)送器只要檢測(cè)到位流里有5個(gè)連續(xù)相同值的位,便自動(dòng)在位流里插入補(bǔ)充位。
觀察下圖:
可以看到上圖中的當(dāng)?shù)谝欢螢殡[性(recessive),CAN_H和CAN_L電平幾乎一樣,也就是說(shuō)CAN_H和CAN_L電平很接近甚至相等的時(shí)候,總線表現(xiàn)隱性的,而兩線點(diǎn)位差較大時(shí)表現(xiàn)為顯性的,按照定義的:
-
CAN_H-CAN_L < 0.5V 時(shí)候?yàn)殡[性的,邏輯信號(hào)表現(xiàn)為"邏輯1"- 高電平。
-
CAN_H-CAN_L > 0.9V 時(shí)候?yàn)轱@性的,邏輯信號(hào)表現(xiàn)為"邏輯0"- 低電平。
下面將差分信號(hào)和顯隱性之間對(duì)應(yīng)關(guān)系總結(jié)為下表:
狀態(tài)
邏輯信號(hào)
電壓范圍
顯性Dominant
0
CAN_H-CAN_L > 0.9
隱性recessive
1
CAN_H-CAN_L < 0.5
由上面的分析我們可以知道:
CAN總線采用的"線與"的規(guī)則進(jìn)行總線沖裁。即1&0=0;所以0為顯性。
這句話隱含的意思是,如果總線上只要有一個(gè)節(jié)點(diǎn)將總線拉到低電平(邏輯0)即顯性狀態(tài),總線就為低電平(邏輯0)即顯性狀態(tài)而不管總線上有多少節(jié)點(diǎn)處于傳輸隱性狀態(tài)(高電平或是邏輯1),只有所有節(jié)點(diǎn)都為高(隱性),總線才為高,即隱性。
通訊速率與通訊距離
下面的SAE J2411為美國(guó)汽車標(biāo)準(zhǔn)。
類型
標(biāo)準(zhǔn)
最高速率
描述
高速CAN
CAN/ISO 11839-2
1Mbit/秒
最通用的CAN總線類型
低速CAN
ISO/ISO 11839-3
125Kbit/秒
容錯(cuò),在一條總線短路的時(shí)候仍然能工作
單線CAN
SAE J2411
50Kbit/秒
高速模式可達(dá)到100Kbit/s主要用在汽車上,例如通用公司
CAN總線上任意兩個(gè)節(jié)點(diǎn)的最大傳輸距離與其位速率有關(guān),如下表:
位速率/kbps
1000
500
250
125
100
50
20
10
5
最大距離/m
40
130
270
530
620
1300
3300
6700
10000
這里的最大通信距離指的是同一條總線上兩個(gè)節(jié)點(diǎn)之間的距離??梢钥吹剿俾试降屯ㄓ嵕嚯x就越遠(yuǎn),也就是說(shuō)CAN總線的通訊距離和波特率成反比。在位速率為5千比特位每秒的時(shí)候達(dá)到最大的傳輸距離10公里。其中一般的工程中比較常用的為500K每秒的通訊速率。這個(gè)速率在實(shí)際測(cè)試的時(shí)候也是非??煽康?。
如果想要更遠(yuǎn)的傳輸(大于10公里);可以考慮用多個(gè)CAN控制器連接或是加其他通訊協(xié)議(如485或是TCP/IP)的接口芯片組成的一個(gè)設(shè)備,這樣就可實(shí)現(xiàn)長(zhǎng)距離的通訊需求。
CAN總線關(guān)鍵概念
仲裁
只要總線空閑,總線上任何節(jié)點(diǎn)都可以發(fā)送報(bào)文,如果有兩個(gè)或兩個(gè)以上的節(jié)點(diǎn)開始傳送報(bào)文,那么就會(huì)存在總線訪問(wèn)沖突的可能。但是CAN使用了標(biāo)識(shí)符的逐位仲裁方法可以解決這個(gè)問(wèn)題。
在仲裁期間,每一個(gè)發(fā)送器都對(duì)發(fā)送的電平與被監(jiān)控的總線電平進(jìn)行比較。如果電平相同,則這個(gè)單元可以繼續(xù)發(fā)送。如果發(fā)送的是一"隱性"電平而監(jiān)視到的是一"顯性"電平,那么這個(gè)節(jié)點(diǎn)失去了仲裁,必須退出發(fā)送狀態(tài)。如果出現(xiàn)不匹配的位不是在仲裁期間則產(chǎn)生錯(cuò)誤事件。
幀ID越小,優(yōu)先級(jí)越高。由于數(shù)據(jù)幀的RTR位為顯性電平,遠(yuǎn)程幀為隱性電平,所以幀格式和幀ID相同的情況下,數(shù)據(jù)幀優(yōu)先于遠(yuǎn)程幀;由于標(biāo)準(zhǔn)幀的IDE位為顯性電平,擴(kuò)展幀的IDE位為隱形電平,對(duì)于前11位ID相同的標(biāo)準(zhǔn)幀和擴(kuò)展幀,標(biāo)準(zhǔn)幀優(yōu)先級(jí)比擴(kuò)展幀高。
CAN總線協(xié)議
CAN 總線是一個(gè)廣播類型的總線,所以任何在總線上的節(jié)點(diǎn)都可以監(jiān)聽總線上傳輸?shù)臄?shù)據(jù)。也就是說(shuō)總線上的傳輸不是點(diǎn)到點(diǎn)的,而是一點(diǎn)對(duì)多點(diǎn)的傳輸,這里多點(diǎn)的意思是總線上所有的節(jié)點(diǎn)。但是總線上的節(jié)點(diǎn)如何知道那些數(shù)據(jù)是傳送給自己的呢?CAN總線的硬件芯片提供了一種叫做本地過(guò)濾的功能,通過(guò)這種本地過(guò)濾的功能可以過(guò)濾掉一些和自己無(wú)關(guān)的數(shù)據(jù),而保留一些和自己有關(guān)的信息。
CAN消息機(jī)制
CAN標(biāo)準(zhǔn)定義了四種消息類型,每條消息用一種叫做比特位仲裁(Arbitration)機(jī)制來(lái)控制進(jìn)入CAN總線,并且每條消息都標(biāo)記了優(yōu)先權(quán)。另外CAN標(biāo)準(zhǔn)還定義了一系列的錯(cuò)誤處理機(jī)制。
CAN報(bào)文的四種消息類型:
-
數(shù)據(jù)幀:數(shù)據(jù)幀將數(shù)據(jù)從發(fā)送器傳輸?shù)?a target="_blank">接收器。
-
遠(yuǎn)程幀:總線單元發(fā)出遠(yuǎn)程幀,請(qǐng)求發(fā)送具有同一標(biāo)識(shí)符的數(shù)據(jù)幀。
-
錯(cuò)誤幀:任何單元檢測(cè)到總線錯(cuò)誤就發(fā)出錯(cuò)誤幀。
-
過(guò)載幀:過(guò)載幀用在相鄰數(shù)據(jù)幀或遠(yuǎn)程幀之間的提供附加的延時(shí)。
數(shù)據(jù)幀
下圖為基本的格式:
CAN總線中有標(biāo)準(zhǔn)幀和擴(kuò)展幀兩種格式,兩種格式不同的地方在于仲裁域格式的不同,看下面兩個(gè)表格可以很清楚的看出兩者的不同,下面第一個(gè)表是標(biāo)準(zhǔn)幀(CAN2.0 A),第二個(gè)為擴(kuò)展幀(CAN2.0 B):
下面為擴(kuò)展幀格式(CAN2.0B):
其中
-
SOF為幀開始
-
SRR為"替代遠(yuǎn)程請(qǐng)求位
-
IDE為擴(kuò)展標(biāo)識(shí)符位
-
RTR為遠(yuǎn)程傳輸請(qǐng)求位
-
CRC delimiter 為CRC定界符。
-
ACK delimiter 為應(yīng)答定界符.
我們看到上圖中的基本幀格式可以總結(jié)為以下幾個(gè)域:
域
描述
仲裁域
仲裁域決定了當(dāng)總線上兩個(gè)或是多個(gè)節(jié)點(diǎn)爭(zhēng)奪總線時(shí)的優(yōu)先權(quán)。
數(shù)據(jù)域
包含了0到8字節(jié)的數(shù)據(jù)。
CRC域
包含了15位的校驗(yàn)和,校驗(yàn)和用來(lái)做錯(cuò)誤檢測(cè)。
應(yīng)答槽
任何一個(gè)已經(jīng)正確接收到消息的控制器在每一條消息的末端發(fā)送一個(gè)應(yīng)答位,發(fā)送器檢查消息是否存在應(yīng)答位,如果沒有就重發(fā)消息。
遠(yuǎn)程幀
作為數(shù)據(jù)接收器的站,通過(guò)發(fā)送遠(yuǎn)程幀,可以啟動(dòng)其資源節(jié)點(diǎn)傳送它們各自的數(shù)據(jù)。遠(yuǎn)程幀和數(shù)據(jù)幀非常類似,只是遠(yuǎn)程幀沒有數(shù)據(jù)域。
上圖就是遠(yuǎn)程幀的幀格式,它相對(duì)與數(shù)據(jù)幀沒有遠(yuǎn)程幀,但是要注意發(fā)送遠(yuǎn)程幀的時(shí)候RTR位要置1,表示發(fā)送的是遠(yuǎn)程幀。下圖更加清晰了呈現(xiàn)了這種結(jié)構(gòu)。
錯(cuò)誤幀
錯(cuò)誤幀是當(dāng)總線的某一個(gè)節(jié)點(diǎn)檢測(cè)到錯(cuò)誤后發(fā)送出來(lái)的,它會(huì)引起所有節(jié)點(diǎn)檢測(cè)到一個(gè)錯(cuò)誤,所以當(dāng)有任何一個(gè)節(jié)點(diǎn)檢測(cè)到錯(cuò)誤,總線上的其他節(jié)點(diǎn)也會(huì)發(fā)出錯(cuò)誤幀。CAN總線設(shè)計(jì)了一套詳盡的錯(cuò)誤計(jì)數(shù)機(jī)制來(lái)確保不會(huì)由于任何一個(gè)節(jié)點(diǎn)反復(fù)的發(fā)送錯(cuò)誤幀而導(dǎo)致CAN總線的崩潰。
如上圖所示錯(cuò)誤標(biāo)志和錯(cuò)誤定界符組成,高低代表分別代表隱性和顯性,其中錯(cuò)誤標(biāo)志為所有節(jié)點(diǎn)發(fā)過(guò)來(lái)的錯(cuò)誤標(biāo)志的疊加(Superposition)。下圖更為清楚的看出各個(gè)數(shù)據(jù)位的分布:
下面通過(guò)以下數(shù)據(jù)結(jié)構(gòu)框圖概括各個(gè)部分的定義:
錯(cuò)誤標(biāo)志有兩種形式:
-
主動(dòng)錯(cuò)誤標(biāo)志,它由6個(gè)連續(xù)的顯性位0組成,它是節(jié)點(diǎn)主動(dòng)發(fā)送的錯(cuò)誤標(biāo)志。
-
被動(dòng)錯(cuò)誤標(biāo)志,它由6個(gè)連續(xù)的隱性位1組成,除非被其他節(jié)點(diǎn)的顯性位覆蓋。
剛才說(shuō)到一個(gè)節(jié)點(diǎn)上檢測(cè)到錯(cuò)誤會(huì)導(dǎo)致總線上所有的節(jié)點(diǎn)都會(huì)檢測(cè)到錯(cuò)誤并發(fā)送錯(cuò)誤標(biāo)志,這是為什么呢?
因?yàn)閱我还?jié)點(diǎn)上的錯(cuò)誤標(biāo)志格式違背了從幀起始到CRC界定符的位填充規(guī)則,也破壞了ACK域或幀結(jié)尾的固定格式。下面簡(jiǎn)要說(shuō)下位填充規(guī)則。
位填充規(guī)則:發(fā)送器只要檢測(cè)到位流里有5個(gè)連續(xù)相同值的位,便自動(dòng)在位流里插入補(bǔ)充位。
注意:位填充規(guī)則只是針對(duì)數(shù)據(jù)幀和遠(yuǎn)程幀,錯(cuò)誤幀和過(guò)載幀格式固定。
所以所有其他的節(jié)點(diǎn)會(huì)檢測(cè)到錯(cuò)誤條件并且開始發(fā)送錯(cuò)誤標(biāo)志,因此錯(cuò)誤幀就是各個(gè)站的不同錯(cuò)誤標(biāo)志疊加在一起的結(jié)果。
當(dāng)某個(gè)節(jié)點(diǎn)發(fā)送錯(cuò)誤幀(帶有錯(cuò)誤標(biāo)志),其他節(jié)點(diǎn)收到了錯(cuò)誤幀,檢測(cè)到錯(cuò)誤條件,就通過(guò)發(fā)送"被動(dòng)錯(cuò)誤標(biāo)志"的錯(cuò)誤幀來(lái)提示錯(cuò)誤。
錯(cuò)誤定界符:
傳送了錯(cuò)誤標(biāo)志以后,每一個(gè)站就發(fā)送一個(gè)隱性位,并一直監(jiān)視總線直到檢測(cè)出一個(gè)隱性位為止,然后就開始發(fā)送其余7個(gè)隱性位。
過(guò)載幀
過(guò)載幀是接收節(jié)點(diǎn)用來(lái)向發(fā)送節(jié)點(diǎn)告知自身接收能力的幀。
過(guò)載幀,意思就是某個(gè)接收節(jié)點(diǎn)來(lái)不及處理數(shù)據(jù)了,希望其他節(jié)點(diǎn)慢點(diǎn)發(fā)送數(shù)據(jù)幀或者遠(yuǎn)程幀,所以告訴發(fā)送節(jié)點(diǎn),我已經(jīng)沒有能力處理你發(fā)送過(guò)來(lái)的數(shù)據(jù)了。
過(guò)載幀跟錯(cuò)誤幀結(jié)構(gòu)類似包括過(guò)載標(biāo)志和過(guò)載定界符,有3中情況會(huì)引起過(guò)載:
-
接收器內(nèi)部的原因,它需要延遲下一個(gè)數(shù)據(jù)幀或是遠(yuǎn)程幀。
-
在間歇字段(看下面的幀間空間)的第一位和第二位檢測(cè)到一個(gè)顯性位(間歇字段都是隱性位的)
-
如果CAN節(jié)點(diǎn)在錯(cuò)誤界定符或是過(guò)載界定符的第八位(最后一位)采樣到一個(gè)顯性位邏輯0,節(jié)點(diǎn)會(huì)發(fā)送一個(gè)過(guò)載幀,錯(cuò)誤計(jì)數(shù)器不會(huì)增加。
上圖中很清晰的表示了過(guò)載標(biāo)志有6個(gè)顯性位組成,而疊加部分和"主動(dòng)錯(cuò)誤"標(biāo)志一樣,過(guò)載的標(biāo)志破壞的是間歇域的固定格式。所以導(dǎo)致其他的節(jié)點(diǎn)都檢測(cè)到過(guò)載條件,并一同發(fā)出過(guò)載標(biāo)志。
過(guò)載定界符:
也就是上圖的過(guò)載結(jié)束符,過(guò)載標(biāo)志被傳送以后,節(jié)點(diǎn)就一直監(jiān)聽著總線,直到檢測(cè)到有一個(gè)從顯性位到隱性位的跳變?yōu)橹埂.?dāng)從總線上檢測(cè)到這樣的跳變,則就標(biāo)志著每一個(gè)節(jié)點(diǎn)都完成了各自過(guò)載標(biāo)志的發(fā)送,并開始同時(shí)發(fā)送其余7個(gè)隱性位。
幀間空間(Interframe Space)
幀間空間說(shuō)白了就是幀與幀之間的間隔,但是這種間隔在CAN的幀中只存在于數(shù)據(jù)幀和遠(yuǎn)程幀,其他的幀就不一定是幀間空間隔開的,而是其他形式,或是直接是沒有間隔,例如過(guò)載幀和錯(cuò)誤幀之間就沒幀間空間。過(guò)個(gè)過(guò)載幀之間有間隔但是不是有幀間空間隔開的。
這里所說(shuō)的針間空間包括"間歇"、"總線空閑"的位域。如果是發(fā)送前一報(bào)文的"被動(dòng)錯(cuò)誤"的站,則還包括叫做"掛起傳輸"的位域。
若不是"被動(dòng)錯(cuò)誤"的站,或作為前一報(bào)文的接收器的站,幀間空間格式為下圖:
若是"被動(dòng)錯(cuò)誤"的站,如果想要發(fā)送8個(gè)隱性電平,在發(fā)送其他幀,幀間空間格式為下圖,即包括了掛起傳輸,
可以看到
間歇字段有3個(gè)隱性位。
特別的在間歇期間,所有的節(jié)點(diǎn)都不允許傳送數(shù)據(jù)幀和遠(yuǎn)程幀,唯一看做的是標(biāo)示一個(gè)過(guò)載條件。
總線空閑:
只要總線空閑,任何節(jié)點(diǎn)就可以往總線發(fā)送數(shù)據(jù),并且是開始于間歇之后的第一個(gè)位。一旦總線上檢測(cè)到顯性位即邏輯"0",可以認(rèn)為是幀的開始。
-
掛起傳輸
"被動(dòng)錯(cuò)誤"的節(jié)點(diǎn)發(fā)送報(bào)文之后,在下一個(gè)報(bào)文開始傳送之前或是確認(rèn)總線空閑之前發(fā)出8個(gè)隱性位跟隨在間歇的后面。如果這個(gè)時(shí)候有一個(gè)報(bào)文從其他的節(jié)點(diǎn)發(fā)過(guò)來(lái),則這個(gè)節(jié)點(diǎn)就成為了接收器。
錯(cuò)誤處理機(jī)制
錯(cuò)誤偵測(cè)
下標(biāo)是幾個(gè)錯(cuò)誤類型:
錯(cuò)誤類型
出錯(cuò)條件
出錯(cuò)域
幀測(cè)單元
比特錯(cuò)誤
bit error
發(fā)送的位值與所監(jiān)控的位值不相符合(填充比特和ACK比特除外)
數(shù)據(jù)幀(SOF~EOF)
遠(yuǎn)程幀(SOF~EOF)
錯(cuò)誤幀
過(guò)載幀
發(fā)送單元
接收單元
填充錯(cuò)誤stuff error
偵測(cè)到6個(gè)連續(xù)相同的電平
數(shù)據(jù)幀(SOF~CRC)
遠(yuǎn)程幀(SOF~CRC)
發(fā)送單元
接收單元
CRC 錯(cuò)誤
計(jì)算結(jié)果和接收到的CRC不同
數(shù)據(jù)幀(CRC)
遠(yuǎn)程幀(CRC)
接收單元
格式錯(cuò)誤
Form Error
某個(gè)固定的格式位置出現(xiàn)無(wú)效的比特
數(shù)據(jù)幀:
(CRC Delimiter, ACK Delimiter EOF)
遠(yuǎn)程幀:
(CRC Delimiter,ACK Delimiter)
錯(cuò)誤幀:
(Error Frame Delimiter)
過(guò)載幀:
(Overload Delimiter)
接收單元
應(yīng)答錯(cuò)誤
Acknowledgment
發(fā)送端在應(yīng)答間隙所監(jiān)視的位不為顯性,即邏輯0,發(fā)送器就檢測(cè)到一個(gè)應(yīng)答錯(cuò)誤。
數(shù)據(jù)幀(ACK slot)
遠(yuǎn)程幀(ACK slot)
發(fā)送單元
錯(cuò)誤計(jì)數(shù)
下面是錯(cuò)誤計(jì)數(shù)表:
錯(cuò)誤條件
Transmit Error Counter
Receive Error Counter
1
RECEIVER端偵測(cè)到一個(gè)位Error錯(cuò)誤,除了發(fā)送ACTIVE ERROR FLAG 和OVERLOAD FLAG
-
+1
2
TRANSMITIER 發(fā)送ERROR FLAG
+8
3
TRANSMITTER發(fā)送ACTIVE ERROR FLAG OVERFLAG時(shí)偵測(cè)到BIT ERROR
+8
4
當(dāng)RECEIVER發(fā)送ACTIVE ERROR FLAG或OVERFLAG時(shí)偵測(cè)到BIT ERROR
+8
5
一個(gè)幀被成功發(fā)送之后(取得ACK并且知道END OF FRAME完成都沒有錯(cuò)誤)
-1 IF TEC=0,TEC will not be changed
-
6
一個(gè)幀被成功接收(知道ACK域都沒有檢測(cè)到錯(cuò)誤,并成功發(fā)送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
在總線上檢測(cè)到128此連續(xù)的11個(gè)1,"bus off"的節(jié)點(diǎn)允許變成不再是"bus off"
Cleared to TEC = 0
Cleared to REC = 0
錯(cuò)誤抑制
為防止某些節(jié)點(diǎn)自身出錯(cuò)而一直發(fā)送錯(cuò)誤幀,干擾其他節(jié)點(diǎn)通信,CAN協(xié)議規(guī)定了節(jié)點(diǎn)的3種狀態(tài)及行為,如下圖:
一個(gè)節(jié)點(diǎn)掛到CAN總線上之后,處于ACTIVE狀態(tài);TEC>127或者REC>127導(dǎo)致節(jié)點(diǎn)進(jìn)入passive狀態(tài);TEC>255之后節(jié)點(diǎn)處于bus off狀態(tài),就是不允許再往bus上發(fā)送東西了;處于bus off狀態(tài)的節(jié)點(diǎn),在檢測(cè)到128個(gè)連續(xù)的11個(gè)1之后將回到active狀態(tài)。
-
CAN總線
+關(guān)注
關(guān)注
145文章
1911瀏覽量
130560 -
CAN
+關(guān)注
關(guān)注
57文章
2694瀏覽量
463146
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論