CAN總線定義:
CAN(Control Area Network)屬于現(xiàn)場總線的范疇,是一種高性能、高可靠性、易于開發(fā)和低成本的串行總線。
CAN是由德國Bosch公司在1986年為汽車監(jiān)測和控制而設(shè)計的。由于其高性能、高可靠性、實時性等優(yōu)點,隨后也廣泛用于工業(yè)自動化、多種控制設(shè)備、交通工具、醫(yī)療儀器以及建筑、環(huán)境控制等多種領(lǐng)域,其在每個領(lǐng)域的廣泛使用促進(jìn)了標(biāo)準(zhǔn)化的進(jìn)程。
1991年9月PHILIPS SEMICONDUCTORS制訂并發(fā)布了CAN技術(shù)規(guī)范V2.0,該技術(shù)規(guī)范包括A和B兩部分。2.0A曾在CAN技術(shù)規(guī)范1.2中定義的CAN報文格式,提供11位地址;而2.0B給出了標(biāo)準(zhǔn)和擴(kuò)展的兩種報文格式,提供29位地址。此后ISO在1993年11月也正式發(fā)布了CAN的國際標(biāo)準(zhǔn)ISO11898。其中ISO11898-1定義了CAN數(shù)據(jù)鏈路層;ISO11898-2定義了非容錯CAN物理層;ISO11898-3定義了11898-3的容錯物理層。CAN總線協(xié)議只定義了物理層和數(shù)據(jù)鏈路層,要將CAN總線應(yīng)用于實際的工程項目和產(chǎn)品開發(fā)中必須制定上層應(yīng)用協(xié)議。目前汽車上應(yīng)用的協(xié)議有:ISO15675(傳輸層協(xié)議)、ISO14229(應(yīng)用層協(xié)議)等。
CAN總線的特點
1、 多主控制方式。在總線空閑時,所有單元都可往總線上發(fā)送消息(多主控制)。最先訪問總線的單元可獲得發(fā)送權(quán)(采用CSMA/CA方式)。當(dāng)多個單元同時發(fā)送時,CANID小的節(jié)點獲得發(fā)送權(quán)。
2、 非破壞性總線仲裁技術(shù)。當(dāng)總線發(fā)生沖突時,高優(yōu)先級報文可以不受影響的進(jìn)行傳輸,保證高優(yōu)先級的實時性要求;而低優(yōu)先級的報文退出傳輸。
3、 高可靠性。每幀都有位填充,CRC校驗等多種錯誤檢測,保證了極低的錯誤率;發(fā)送期間丟失仲裁或者由于錯誤而破壞了的數(shù)據(jù)幀可自動重發(fā)(這一點由CAN控制器自己重發(fā),無需人為重新裝載發(fā)送數(shù)據(jù))。
4、 自動關(guān)閉總線。CAN控制器可以檢測和判斷總線上的錯誤類型,是短暫的數(shù)據(jù)錯誤(如外部噪聲),還是持續(xù)數(shù)據(jù)錯誤(如單元內(nèi)部故障、驅(qū)動器故障、短路故障等)。當(dāng)錯誤為持續(xù)性故障時,CAN控制器可自動關(guān)閉,脫離總線,以免影響總線上的其他節(jié)點正常通信。
CAN總線拓?fù)鋱D
CAN控制器根據(jù)兩根線上的電位差來判斷總線電平??偩€電平分為顯性和隱性電平,二者必居其一。發(fā)送方通過使總線電平變化,將消息發(fā)送給接收方。下圖1是一個CAN總線連接示意圖。
下圖1由兩個CAN網(wǎng)絡(luò)組成,其中一個網(wǎng)絡(luò)通信速率為500K,另外一個為125K。每個CAN網(wǎng)絡(luò)由CANH和CANL兩根線組成,各個節(jié)點(ABS、SAS、ETM、ECM)分別連接在CANH和CAHL上。在每個CAN網(wǎng)絡(luò)的頭尾分別連接了兩個終端電阻,終端電阻的大小為120歐姆。
下圖1左邊陰影部分是某個節(jié)點的內(nèi)部電路模塊,包含CPU、CAN控制器(CAN Controller,一般單片機(jī)都集成了CAN控制器模塊)以及CAN收發(fā)器(CAN transceiver)。其中CPU負(fù)責(zé)將需要發(fā)送的數(shù)據(jù)傳遞給CAN控制器,以及接收從CAN控制器中解析的數(shù)據(jù);CAN控制器將Rx腳的二進(jìn)制的0/1轉(zhuǎn)換為具體的報文,然后將報文傳遞給CPU,以及將CPU需要發(fā)送的報文轉(zhuǎn)換為二進(jìn)制0/1,然后通過Tx腳傳遞給CAN收發(fā)器。CAN控制器的主要功能是電平轉(zhuǎn)換,將CANH和CANL上的電平轉(zhuǎn)換為Rx腳上的0/1,將Tx腳上的0/1在CANH和CANL進(jìn)行轉(zhuǎn)換。

圖1
信號電平
高速CAN,定義 當(dāng)CANH 和 CANL 電壓相同(CANH = CANL = 2.5V)時為邏輯“1”,CANH和CANL 電壓相差 2V(CANH = 3.5V, CANL = 1.5V) 時為邏輯“0”。高速CAN收發(fā)器在共模電壓范圍內(nèi)(-12V ~ 12V),將CANH和CANL電壓相差大于 0.9V 解釋為顯性狀態(tài)(Dominant),而將CANH和CANL電壓相差小于 0.5V 解釋為為隱性狀態(tài)(Recessive)。
CAN總線采用不歸零碼位填充技術(shù),也就是說CAN總線上的信號有兩種不同的信號狀態(tài),分別是顯性的(Dominant)邏輯0和隱形的(recessive)邏輯1,信號每一次傳輸完后不需要返回到邏輯0(顯性)的電平。
CAN信號傳輸

圖2 a
發(fā)送過程: CAN控制器將CPU傳來的報文轉(zhuǎn)換為邏輯電平(即邏輯0-顯性電平或者邏輯1-隱性電平)通過Tx腳傳遞給CAN收發(fā)器。CAN收發(fā)器接收邏輯電平之后,再將其轉(zhuǎn)換為差分電平輸出到CAN總線上。

圖2 b
接收過程: CAN收發(fā)器將CAN_H 和 CAN_L 線上傳來的差分電平轉(zhuǎn)換為邏輯電平輸出到CAN控制器的Rx腳,CAN控制器再把該邏輯電平轉(zhuǎn)化為相應(yīng)報文發(fā)送到CPU上。

圖2 c
報文傳輸
幀類型
CAN總線在報文傳輸中,可傳輸以下4種不同類型的幀報文:
數(shù)據(jù)幀:數(shù)據(jù)幀裝載的是發(fā)送數(shù)據(jù),它將數(shù)據(jù)從發(fā)送節(jié)點傳輸?shù)浇邮展?jié)點;
遠(yuǎn)程幀:遠(yuǎn)程幀請求具有相同標(biāo)識符(CANID)的數(shù)據(jù)幀的發(fā)送,實際很少使用;
錯誤幀:任何節(jié)點檢測到總線錯誤時都可以發(fā)送錯誤幀。由于總線錯誤幀沒有CANID,所以當(dāng)檢測到錯誤幀時,只知道有錯誤,但無法定位該錯誤幀是哪個模塊發(fā)送的;
過載幀:過載幀用于在先行的和后續(xù)的數(shù)據(jù)幀之間提供附加的延時。
幀格式
在CAN2.0B規(guī)范中,數(shù)據(jù)幀和遠(yuǎn)程幀有兩種幀格式,其區(qū)別主要在于標(biāo)識符(即CANID)的長度:具有11位標(biāo)識符的稱為標(biāo)準(zhǔn)幀,而具有29位的幀稱為擴(kuò)展幀,如下圖3所示。數(shù)據(jù)幀和遠(yuǎn)程幀都可以使用標(biāo)準(zhǔn)幀或遠(yuǎn)程幀格式。幀與幀之間是通過幀間隔進(jìn)行分開。
數(shù)據(jù)幀格式
數(shù)據(jù)幀由7部分組成:幀起始、仲裁段、控制段、數(shù)據(jù)段、CRC段、ACK段、幀結(jié)束。

圖3
幀起始
長度為1位,幀起始(SOF)表示數(shù)據(jù)幀的起始,由一個單獨的顯性位組成。CAN節(jié)點發(fā)送數(shù)據(jù)的原則是先監(jiān)聽后發(fā)送,即如果CAN節(jié)點需要發(fā)送數(shù)據(jù),先監(jiān)聽總線是否空閑,如果總線空閑,則往總線發(fā)送幀起始(SOF),獲得發(fā)送權(quán),否則一直等待直到總線空閑才發(fā)送幀起始(SOF)。
仲裁段
標(biāo)準(zhǔn)幀和擴(kuò)展幀的仲裁段不同,長度分別是12bit和32bit。如上圖3所示,在標(biāo)準(zhǔn)幀格式中,仲裁段由11位標(biāo)識符(CANID)和遠(yuǎn)程發(fā)送請求位(RTR)組成。在擴(kuò)展幀中,仲裁段由29位標(biāo)識符(CANID)、代替遠(yuǎn)程請求位(SRR)、擴(kuò)展位(IDE)、遠(yuǎn)程發(fā)送請求位(RTR)組成。擴(kuò)展幀標(biāo)識符由11位基本ID和18位擴(kuò)展ID組成。在標(biāo)準(zhǔn)幀中,遠(yuǎn)程發(fā)送請求位(RTR)和IDE固定位0。而擴(kuò)展幀中,代替遠(yuǎn)程請求位(SRR)和IDE固定為1, 遠(yuǎn)程發(fā)送請求位(RTR)固定位0。
標(biāo)識符(CANID):用于區(qū)分發(fā)送數(shù)據(jù)內(nèi)容,比如我們定義ID 234發(fā)送某傳感器采集到的溫度值,ID 235發(fā)送某傳感器采集到的電流值。對于發(fā)送節(jié)點來講,當(dāng)它需要發(fā)送溫度數(shù)據(jù)值,只需要將溫度值裝入ID為234的報文,需要發(fā)送電流數(shù)據(jù)時,只需要將采集到的電流數(shù)據(jù)裝入ID為235的報文。對報文接收節(jié)點來講,一旦收到ID為234時,就知道里面裝載的是溫度值,一收到ID為235時,就知道里面裝載的是電流值。
代替遠(yuǎn)程請求位(SRR):SRR是一個隱性位。在擴(kuò)展幀中11位標(biāo)識符的下一位是SRR位,而在標(biāo)準(zhǔn)幀中11位標(biāo)識符的下一位是RTR位,因此SRR稱作代替遠(yuǎn)程請求位。當(dāng)標(biāo)準(zhǔn)幀和擴(kuò)展幀沖突時,并且擴(kuò)展幀的基本標(biāo)識符與標(biāo)準(zhǔn)幀的標(biāo)識符相同時,標(biāo)準(zhǔn)幀優(yōu)先級高于擴(kuò)展幀。
標(biāo)識符擴(kuò)展位(IDE):表示該報文為標(biāo)準(zhǔn)格式或擴(kuò)展格式。為顯性時,表示為標(biāo)準(zhǔn)幀,為隱性時,表示為擴(kuò)展幀。
注:如前所述,CAN模塊采用先監(jiān)聽后發(fā)送的原則,即如果CAN模塊需要發(fā)送數(shù)據(jù)時,先監(jiān)聽總線,如果發(fā)現(xiàn)總線空閑,則開始發(fā)送報文。如果網(wǎng)絡(luò)上兩個CAN模塊剛好同時需要發(fā)送報文,他們同時檢測到總線空閑。且同時發(fā)送幀起始(SOF)。那么CANID小的模塊發(fā)送優(yōu)先級高,搶占發(fā)送權(quán)。
控制段
控制段表示數(shù)據(jù)段的數(shù)據(jù)段的長度,由保留位和數(shù)據(jù)長度碼共6bit組成,如下圖3所示。發(fā)送數(shù)據(jù)段的長度是可變的,具體長度由控制段決定。長度位0-8字節(jié)。DLC編碼和數(shù)據(jù)段長度對應(yīng)關(guān)系如下表所示。

表1
保留位:在標(biāo)準(zhǔn)格式由R1(顯性)和R0(隱形)組成。
CRC段
包括CRC序列(15bit)和CRC界定符(1位,固定為隱性),圖下圖3所示。
CRC序列:該序列是對幀起始、幀仲裁段、控制段、數(shù)據(jù)段的進(jìn)行CRC計算。
CRC界定符:CRC界定符是一個位隱性位。
ACK段
ACK段包含2bit,包括應(yīng)答位和應(yīng)答界定符。
在ACK段,發(fā)送節(jié)點發(fā)送兩個隱性位。當(dāng)接收節(jié)點正確接收到有效報文后,接收模塊就會在ACK段的第一位發(fā)送隱性位來告知發(fā)送模塊數(shù)據(jù)被正常接收了。應(yīng)答界定符固定為高電平。
幀結(jié)束(EOF):
幀結(jié)束由7個隱性位組成,每個數(shù)據(jù)幀和遠(yuǎn)程幀都必須包含完整的幀結(jié)束分。
標(biāo)準(zhǔn)數(shù)據(jù)幀的長度
因此一幀報文最大長度為:1(SOF)+11(ID)+1(RTR)+6(控制段)+64(數(shù)據(jù)段)+15(CRC)+1(CRC界定符)+2(ACK)+7(EOF)+3(幀間隔)=111位。在不考慮位填充的情況下,一幀8個字節(jié)的標(biāo)準(zhǔn)幀,需要占用111位。
當(dāng)考慮位填充時,通過示波器測量數(shù)據(jù)和ID全位0和全位1的數(shù)據(jù)幀占用總線時間。
當(dāng)ID和Data全為1時,波特率位500K,報文占用總線時間為254us。
當(dāng)ID和Data全為0時,波特率位500K,報文占用總線時間為252us。
通過以上測試,可以看出當(dāng)我們需要以最快速度在CAN總線上傳輸報文時,最快速度大概是250us每幀報文,也就說最快1s能夠傳輸不到4000條報文。
遠(yuǎn)程幀格式
包含幀起始、仲裁段、控制段、CRC段、ACK段、幀結(jié)束。與數(shù)據(jù)幀相比,RTR位為1,且缺少數(shù)據(jù)段。

圖4
錯誤幀格式
錯誤幀由兩部分組成:錯誤標(biāo)志,錯誤界定符。錯誤標(biāo)志長度為6個位,由于總線網(wǎng)絡(luò)中有多個節(jié)點,每個檢測到錯誤的節(jié)點都會發(fā)送錯誤幀,考慮到錯誤疊加,錯誤標(biāo)志長度位6-12位。根據(jù)錯誤節(jié)點所處的狀態(tài)不同,錯誤標(biāo)志也是不一樣的。當(dāng)節(jié)點處于主動錯誤時,發(fā)送的錯誤標(biāo)志為顯性,當(dāng)節(jié)點處于被動錯誤時,發(fā)送的錯誤標(biāo)識為隱性。錯誤界定符由8個隱性位組成。
注:當(dāng)某個節(jié)點因為本身原因,持續(xù)檢測到錯誤,為了防止該節(jié)點一直發(fā)送錯誤幀而對其他正常工作的節(jié)點正常工作產(chǎn)生影響,所以該節(jié)點進(jìn)入被動錯誤后,節(jié)點發(fā)送的錯誤幀為隱性,這樣就不會影響其他節(jié)點正常工作。

圖5
過載幀格式
過載幀由兩部分組成:過載標(biāo)志和過載界定符。
以下3中情況,都會引發(fā)過載幀的發(fā)送。
1、 CAN控制器要求延遲下一個數(shù)據(jù)幀或遠(yuǎn)程幀的發(fā)送。
2、 在幀間隔段的第1和第2位檢測到顯性(數(shù)據(jù)幀或者遠(yuǎn)程幀的發(fā)送需要等到3位長度的幀間隔發(fā)送完后才可以嘗試發(fā)送);
3、 如果一個CAN節(jié)點在出錯界定符或者過載界定符的第8位(最后1位)采樣到1個顯性位,節(jié)點就會發(fā)送一個過載幀(而非錯誤幀),此時錯誤計數(shù)器不會增加(數(shù)據(jù)幀或者遠(yuǎn)程幀的發(fā)送需要等錯誤界定符或者過載界定符發(fā)送完畢后,再等3個位長都的幀間隔才能發(fā)送數(shù)據(jù))。
注:由上述1-3可以看出,為了阻止后續(xù)數(shù)據(jù)幀、遠(yuǎn)程幀的發(fā)送可以插入過載幀。
過載標(biāo)志由6個顯性位組成。過載標(biāo)志和主動錯誤標(biāo)志一樣。過載標(biāo)志的形式破壞了幀間隔,因此,所有其他節(jié)點檢測到上述過載條件將發(fā)出過載標(biāo)志。如果在幀間隔段的第3位檢測到一個顯性位,則該位將解釋為幀起始。
過載界定符由8位隱性位組成。過載界定符的形式和錯誤界定符的形式一樣。在過載標(biāo)志位被發(fā)送后,節(jié)點一直檢測總線,直到檢測到一個從顯性到隱性位的跳變。此時,總線上的每個節(jié)點都完成了過載標(biāo)志的發(fā)送,并開始同時發(fā)送剩余的隱性位。

圖6
幀間隔的格式
數(shù)據(jù)幀和遠(yuǎn)程幀通過幀間隔與總線上的其他幀(數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀和過載幀)分隔開。過載幀和錯誤幀與他們之前的幀之間沒有幀間隔,多個超載幀之間也沒有幀間隔。
幀間隔包含間隔和總線空閑。對于處于被動錯誤狀態(tài)的節(jié)點來說,其間隔幀除了包含間歇、總線空閑外,還包含延時發(fā)送。間歇包含3個隱性位。間歇期間,所有節(jié)點均不允許發(fā)送數(shù)據(jù)幀和遠(yuǎn)程幀,其唯一的作用是標(biāo)示一個過載條件(第三位除外)。
總線空間的時長可以是任意長度。在此期間,總線被認(rèn)為是空閑的,任何需要發(fā)送報文的節(jié)點在此期間都可以發(fā)送報文。一條因為其他報文正在發(fā)送而被掛起的報文,將在其延時結(jié)束后的第1位(如果此時總線還是空閑的情況下)開始發(fā)送,此時檢測到總線的一個顯性位將認(rèn)為一個幀起始
延時傳送是指節(jié)點發(fā)送一個報文后,在開始發(fā)送下一報文或者認(rèn)可總線處于空閑前,在間隔后發(fā)出8個隱性位。如果在此期間由其他節(jié)點開始發(fā)送報文。延時傳送降低了被動錯誤節(jié)點向總線發(fā)送報文的優(yōu)先級,這樣做是為了降低被動錯誤狀態(tài)節(jié)點因自生故障干擾總線的可能性。

圖7
數(shù)據(jù)發(fā)送優(yōu)先級
在總線空閑時,最先開始發(fā)送的節(jié)點獲得發(fā)送權(quán)。
當(dāng)多個節(jié)點同時開始發(fā)送時,各發(fā)送節(jié)點從仲裁段的第一位開始進(jìn)行仲裁。連續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送。仲裁過程如下圖所示,節(jié)點1仲裁失敗。

圖8
位填充
由于CAN總線傳輸時,沒有類似其他串行通信的CLK線,所以如果連續(xù)傳輸多個相同位時會有時鐘誤差的累加。為了解決此問題,引入位填充的概念。當(dāng)同樣的電平持續(xù)5位時添加一個位的反型數(shù)據(jù),當(dāng)電平發(fā)生跳變時,進(jìn)行再同步,以解決時鐘誤差累加問題。位填充的構(gòu)成如下圖所示。

圖9
錯誤種類
位錯誤
CAN節(jié)點在發(fā)送位的同時也會對總線進(jìn)行監(jiān)測,如果所發(fā)送的位值與所檢測到的位值不相符,則認(rèn)為檢測到一個位錯誤。位錯誤是由總線上發(fā)出數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀、過載幀的節(jié)點和發(fā)出ACK的節(jié)點檢測到的。但以下情況除外:在仲裁段發(fā)出隱性電平,但是實際檢測到顯性電平,將被認(rèn)為仲裁失敗而非位錯誤;在仲裁段作為位填充發(fā)出隱性電平,但實際檢測到顯性電平,將被認(rèn)為填充錯誤,而非位錯誤。發(fā)送節(jié)點在發(fā)送ACK段發(fā)送隱性電平,但檢測到顯性電平是,將判定位其他接收單元發(fā)送的ACK應(yīng)答,而非位錯誤。發(fā)送被動錯誤(6個隱性位)但檢測出顯性電平,間不被認(rèn)為位錯誤。
檢測節(jié)點:發(fā)送節(jié)點和接收節(jié)點
填充錯誤
如果在報文發(fā)送期間,檢測出6個連續(xù)顯性或者隱性位,則將認(rèn)為是一個填充錯誤。
檢測節(jié)點:發(fā)送節(jié)點和接收節(jié)點
CRC錯誤
如果接收節(jié)點在接收數(shù)據(jù)過程中計算的CRC值與發(fā)節(jié)點發(fā)送的CRC不一致,則接收節(jié)點會發(fā)送一個錯誤幀。
檢測節(jié)點:接收節(jié)點
格式錯誤
當(dāng)一個固定形式的位檢測出1個或多個非法位,則被認(rèn)為是格式錯誤。具體包括數(shù)據(jù)幀和遠(yuǎn)程幀的CRC界定符、ACK界定符、EOF界定符以及錯誤界定符、超載界定符。
檢測節(jié)點:接收節(jié)點
ACK錯誤
只要在應(yīng)答間隙檢測到顯性,則發(fā)送節(jié)點認(rèn)為這是一個ACK錯誤。
檢測節(jié)點:發(fā)送節(jié)點
錯誤幀發(fā)送時間點
當(dāng)任意節(jié)點檢測到錯誤時,將會輸出錯誤幀。處于主動錯誤的節(jié)點輸出主動錯誤,處于被動錯誤的節(jié)點輸出被動錯誤。
當(dāng)節(jié)點檢測到位錯誤、填充錯誤、格式錯誤、ACK錯誤,從檢測出錯誤的下1位開始發(fā)送錯誤標(biāo)志。
當(dāng)節(jié)點檢測到CRC錯誤時,在ACK界定符后的下1位發(fā)送錯誤標(biāo)志。
注意:對于數(shù)據(jù)幀和遠(yuǎn)程幀來講,需要在各種幀(數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀、過載幀)發(fā)送結(jié)束后的再插入一個間隔幀,才可以數(shù)據(jù)幀。所以我們可以大致計算出當(dāng)一幀數(shù)據(jù)發(fā)送失敗后,大概多長時間CAN控制器才會才重發(fā)這幀報文(即錯誤幀長度再加上一個幀間隔,根據(jù)發(fā)送節(jié)點所處的是主動錯誤還是被動錯誤狀態(tài),幀間隔長度會不一樣,所以計算時需要注意)。
錯誤計數(shù)器的加減規(guī)則
具體如下表。

表2
注:第3點當(dāng)發(fā)送節(jié)點發(fā)送一個錯誤標(biāo)志時,發(fā)送錯誤計數(shù)器值加8。這里有兩個例外情況:一是當(dāng)發(fā)送節(jié)點處于被動錯誤時,并檢測到一個應(yīng)答錯誤或者發(fā)送被動錯誤標(biāo)志期間沒有檢測到顯性位(這種情況是因為整個網(wǎng)絡(luò)中只有發(fā)送節(jié)點一個節(jié)點存在,所以不能因為只有發(fā)送節(jié)點存在而一直將發(fā)送錯誤計數(shù)器往上加,直至發(fā)送節(jié)點進(jìn)入bus off狀態(tài))二是發(fā)送節(jié)點因為仲裁期間發(fā)生填充錯誤而發(fā)送錯誤標(biāo)志。以上兩種情況,發(fā)送錯誤計數(shù)器值不變。
錯誤狀態(tài)變化
當(dāng)節(jié)點的發(fā)送錯誤計數(shù)器值在0-127之間且接收錯誤計算器值在0-127之間時,節(jié)點處于主動錯誤狀態(tài);
當(dāng)節(jié)點的發(fā)送錯誤計數(shù)器值在128-255之接或者接收錯誤計數(shù)器值在128-255之間,節(jié)點處于被動錯誤。
當(dāng)發(fā)送錯誤計數(shù)器值大于255時候,節(jié)點進(jìn)入總線關(guān)閉(bus off),接收錯誤用于不會大于255,即接收錯誤不會使節(jié)點進(jìn)入bus off。
注:只有發(fā)送錯誤才能讓節(jié)點進(jìn)入總線關(guān)閉。另外需要注意,當(dāng)總線關(guān)閉可以設(shè)置CAN控制器時自動恢復(fù)(即檢測到128次11個連續(xù)隱性位自動恢復(fù)到主動錯誤狀態(tài))還是不自動恢復(fù)。在汽車行業(yè),一般都是不讓CAN控制器自動恢復(fù),而是人為控制進(jìn)入快慢恢復(fù)過程。

圖10
位時間要求
標(biāo)稱位時間
標(biāo)稱位時間,是指理想情況下發(fā)送1位所需要的時間,例如對于速率為500k的CAN總線,標(biāo)稱為時間=1/500k=2us
一個標(biāo)稱位時間可以劃分為4個不重疊的段,分別為同步段(SS)、傳播時間段(PTS)、相位緩沖段1(PBS1)、相位緩沖段2(PBS2)。
同步段(SS):多個連接在總線上的節(jié)點通過此段實現(xiàn)位時序調(diào)整,同步每個位的發(fā)送和接收工作。由隱性到顯性或者顯性到隱性電平變換最好發(fā)生在這個段中。
傳播時間段(PTS):用于吸收網(wǎng)絡(luò)上的物理延遲的段。所謂網(wǎng)絡(luò)上的物理延時指發(fā)送節(jié)點的輸出延遲、總線上信號的傳播延遲、接收單元的輸入延遲。這個段的時間為以上各延時時間的和的兩倍。
相位緩沖段1(PBS1)和相位緩沖段2(PBS2):當(dāng)信號邊沿不能包含于SS段中時,可在此段進(jìn)行補(bǔ)償。由于各發(fā)送節(jié)點、接收節(jié)點以各自獨立的內(nèi)部時鐘工作,細(xì)微的時鐘誤差會累計起來,PBS段可用于吸收此誤差。通過對相位緩沖段加減SJW。
如下圖所示,假設(shè)1個位由10個Tq組成,可以通過改變PTS和PBS1以及PBS2段的大小來實現(xiàn)不同的采樣點。一般情況下傳輸速率越高采樣點越低。對于500K傳輸速率來講,采樣點一般選擇在75%-81.25%之間。采樣點分為單點采樣和多點采樣,一般情況下,單點采樣就可以滿足要求。
注:一般直接選擇單片機(jī)的外部晶振作為CAN總線的時鐘源,而非PLL倍頻再分頻的時鐘作為時鐘源。

圖11
采樣點:所謂采樣點是讀取總線電平,并將讀取到的電平作為位值的點。位置在PBS1結(jié)束處。
硬件同步
接收單元在空閑狀態(tài)檢測出幀起始時進(jìn)行的同步調(diào)整。在檢測出邊沿時不考慮SJW的值而認(rèn)為是SS段。硬同步如下圖所示。

圖12
再同步
在接收過程中檢測出總線上的電平變化時進(jìn)行的同步調(diào)整。每當(dāng)檢測出邊沿時,根據(jù)邊沿出現(xiàn)的位置加長PBS1段或者縮短PBS2段,以調(diào)整同步。調(diào)整的幅度大小為SJW。
如下圖所示,當(dāng)邊沿出現(xiàn)在SS段后時,說明接收節(jié)點的SS段早于發(fā)送節(jié)點的SS段,接收節(jié)點為了在盡可能靠近發(fā)送節(jié)點的采樣點處進(jìn)行采樣,在PBS1插入一個SJW。

圖13
如下圖所示,當(dāng)邊沿出現(xiàn)在SS段前時,說明接收節(jié)點的SS段晚于發(fā)送節(jié)點的SS段,接收節(jié)點為了在盡可能靠近發(fā)送節(jié)點的采樣點處進(jìn)行采樣,再將上1位的PBS2減少一個SJW。

圖14
硬同步和再同步的規(guī)則
1、1個位中只進(jìn)行一次同步調(diào)整
2、只有當(dāng)上次采樣點的總線值和邊沿后的總線值不同時,該邊沿才能用于調(diào)整同步(即電平發(fā)生變化)
3、在總線空閑且存在隱性電平到顯性電平邊沿,則一定要進(jìn)行硬件同步。
4、在總線非空閑檢測到的隱性電平到顯性電平的邊沿如果滿足條件1和2,將進(jìn)行再同步。