1.CAN協(xié)議
1.1 幀類型
通訊時(shí)使用下面5個(gè)類型的幀:
數(shù)據(jù)幀
遙控幀
錯(cuò)誤幀
過載幀
幀間空隙
在所有這些幀中,,數(shù)據(jù)幀和遙控幀由用戶設(shè)置,,而其它幀則由CAN硬件設(shè)置。
數(shù)據(jù)和遙控幀有兩種格式:標(biāo)準(zhǔn)和擴(kuò)展格式,。標(biāo)準(zhǔn)格式有11bit的ID,,而擴(kuò)展格式則是29bit的ID,。
每個(gè)幀的用處見表6,每個(gè)幀的結(jié)構(gòu)見圖10到圖14
表6 幀類型和每種類型幀的作用
2.2 數(shù)據(jù)幀
數(shù)據(jù)幀由發(fā)送單元使用,,用來發(fā)送信息給接收單元,,這是用戶操作的基本幀。
數(shù)據(jù)幀有7個(gè)域組成,。圖15顯示了數(shù)據(jù)幀的結(jié)構(gòu),。
(1)幀開始(SOF):這個(gè)域表示數(shù)據(jù)幀的開始。
(2)仲裁域:這個(gè)域表示一個(gè)幀的優(yōu)先級(jí)
(3)控制域:這個(gè)域表示保留位和數(shù)據(jù)字節(jié)數(shù)
(4)數(shù)據(jù)域:這是數(shù)據(jù)內(nèi)容,,0-8個(gè)字節(jié)的數(shù)據(jù)能被發(fā)送
(5)CRC域:這個(gè)域用于檢查幀的傳輸錯(cuò)誤,。
(6)ACK域:是對(duì)幀已經(jīng)被正常接收的一個(gè)證實(shí)。
(7)幀結(jié)束:指示數(shù)據(jù)幀結(jié)束
(1)幀開始(SOF),,對(duì)標(biāo)準(zhǔn)的或擴(kuò)展的格式都是一樣的,。它指示一幀的開始,由1bit的顯性位組成,。
顯性電平和隱性電平:
總線上的電平有顯性電平和隱性電平兩種,。
總線上執(zhí)行邏輯上的線“與”時(shí),顯性電平的邏輯值為“0”,,隱性電平為“1”,。
“顯性”具有“優(yōu)先”的意味,只要有一個(gè)單元輸出顯性電平,,總線上即為顯性電平,,并且,,“隱性”具有“包容”的意味,只有所有的單元都輸出隱性電平,,總線上才為隱性電平,。(顯性電平比隱性電平更強(qiáng))
(2)仲裁域,這個(gè)域表示數(shù)據(jù)的優(yōu)先級(jí)別,。這個(gè)域的結(jié)構(gòu),,對(duì)標(biāo)準(zhǔn)和擴(kuò)展的格式是有差別的。
注1:關(guān)于ID:
標(biāo)準(zhǔn)格式的ID有11bit,,從ID28到ID18被依次發(fā)送,,禁止高7位全為隱性。(禁止設(shè)定:ID=1111111xxxx),。這樣總共有(2048-16)個(gè)ID能被使用,。
擴(kuò)展格式的ID有29個(gè)bit?;綢D從ID28到ID18,,擴(kuò)展ID由ID17到ID0表示,基本ID和標(biāo)準(zhǔn)格式ID相同,,禁止高7bit全都為隱性,,(禁止設(shè)定:基本ID=1111111xxxx)。這樣總共有(2048-16)個(gè)ID能被使用,。
在任何情況下,,總線上不可能有多個(gè)設(shè)備在同一時(shí)刻使用同一個(gè)ID傳輸數(shù)據(jù)幀。
(3)控制域,,占6個(gè)bit,,指示要傳輸信息的數(shù)據(jù)字節(jié)數(shù),這個(gè)域的結(jié)構(gòu),,對(duì)標(biāo)準(zhǔn)和擴(kuò)展的格式是有差別的,。如圖18所示
注1:保留位(r0,r1),,保留位必須以顯性電平傳送,,然而,在接收側(cè)可以接收顯性,、隱性集任意組合的電平,。
注2:數(shù)據(jù)長(zhǎng)度碼(DLC),數(shù)據(jù)長(zhǎng)度碼與數(shù)據(jù)的字節(jié)對(duì)應(yīng)關(guān)系見表7所示,。數(shù)據(jù)的字節(jié)數(shù)必須是0-8個(gè)字節(jié),,但接收方對(duì)DLC=9-15的情況并不視為錯(cuò)誤。
(4)數(shù)據(jù)域,,對(duì)標(biāo)準(zhǔn)的或擴(kuò)展的格式都是一樣的,。這個(gè)域是傳輸?shù)臄?shù)據(jù),,可以是0到8個(gè)字節(jié),字節(jié)數(shù)載控制域中指明,。數(shù)據(jù)輸出開始于MSB,。如圖19所示:
(5)CRC域,對(duì)標(biāo)準(zhǔn)的或擴(kuò)展的格式都是一樣的,。這個(gè)域用來檢查幀是否有傳輸錯(cuò)誤,,它由15bit CRC碼和一個(gè)bitCRC定界符(delimiter)(separating bit分隔bit)
CRC的產(chǎn)生方法是采用下面的多項(xiàng)式:,CRC的計(jì)算范圍是SOF,、仲裁域,、控制域,、數(shù)據(jù)域,。在接收側(cè),會(huì)對(duì)接收到的數(shù)據(jù)幀的這些域進(jìn)行CRC計(jì)算,,如果計(jì)算結(jié)果與收到的CRC不一致,,則表明存在傳輸錯(cuò)誤。
(6)ACK域,,是對(duì)一幀已被正常接收的一個(gè)確認(rèn)信號(hào),,由2個(gè)bit組成,一個(gè)是ACK的slot,,一個(gè)是ACK的定界符(delimiter),,如圖21所示:
注1:發(fā)送單元的ACK域,發(fā)送單元以隱性bit發(fā)送ACK slot和ACK 的delimiter,。
注2:接收單元的ACK域,,正確接收到信息的接收單元在接收幀的ACK slot里發(fā)送一個(gè)顯性bit,以通知發(fā)送單元其已經(jīng)正確接收完畢,,這又稱“sending ACK”或“returning ACK”,。
“Returning an ACK”:
所有接收單元只要不是處于bus-off或休眠狀態(tài),只有正確接收信息的單元才能發(fā)送ACK,。發(fā)送單元并不發(fā)送ACK,。如果總線上除了發(fā)送單元,沒有其它 單元能接收信息,,則No ACK被返回,。為了通訊的建立,除了發(fā)送單元外,,至少需要有一個(gè)單元能夠接收信息,。如果總線上有2個(gè)或更多個(gè)單元能接收到信息,如果它們中任意一個(gè)正常接 收到信息,,則會(huì)有ACK被返回,。
(7)幀結(jié)束,,指示一幀結(jié)束,由7個(gè)隱性位組成,。如圖22
1.3 遙控幀
遙控幀是接收單元請(qǐng)求發(fā)送單元發(fā)送一個(gè)信息,,遙控幀有6個(gè)域組成。如圖23顯示的那樣,,除了沒有數(shù)據(jù)域外其它與數(shù)據(jù)幀的結(jié)構(gòu)是一樣的,。
(1) 幀開始(SOF):這個(gè)域表示數(shù)據(jù)幀的開始。
(2) 競(jìng)爭(zhēng)域:這個(gè)域表示數(shù)據(jù)的優(yōu)先級(jí),,具有同樣ID的數(shù)據(jù)幀被請(qǐng)求,。
(3) 控制域:這個(gè)域表示保留位和數(shù)據(jù)字節(jié)數(shù)
(4) CRC域:這個(gè)域用于檢查幀的傳輸錯(cuò)誤。
(5) ACK域:是對(duì)幀已經(jīng)被正常接收的一個(gè)證實(shí),。
(6) 幀結(jié)束:指示遙控幀的結(jié)束
遙控幀和數(shù)據(jù)幀:
數(shù)據(jù)幀和遙控幀之間的不同
遙控幀沒有數(shù)據(jù)域,,在仲裁域里的RTR位是隱性電平,而數(shù)據(jù)幀RTR則為顯性的,。
沒有數(shù)據(jù)的數(shù)據(jù)幀與遙控幀可以通過RTR為來區(qū)分
遙控幀沒有數(shù)據(jù)域,,其數(shù)據(jù)長(zhǎng)度碼用來干什么?
遙控幀的數(shù)據(jù)長(zhǎng)度碼的值表示對(duì)應(yīng)請(qǐng)求的數(shù)據(jù)幀的數(shù)據(jù)長(zhǎng)度碼,。
沒有數(shù)據(jù)域的數(shù)據(jù)幀用來干什么,?
例如,數(shù)據(jù)幀可以被各單元用來作為周期連接確認(rèn)/應(yīng)答,,或者仲裁域本身帶有實(shí)質(zhì)性信息,。
1.4 錯(cuò)誤幀
這個(gè)幀用來通知在傳輸期間發(fā)生了一個(gè)錯(cuò)誤,錯(cuò)誤幀由一個(gè)錯(cuò)誤標(biāo)志和一個(gè)錯(cuò)誤定界符組成,,錯(cuò)誤幀由CAN的硬件來發(fā)送,。圖24顯示了錯(cuò)誤幀的結(jié)構(gòu)。
(1) 錯(cuò)誤標(biāo)志:有2種錯(cuò)誤標(biāo)志類型:主動(dòng)錯(cuò)誤和被動(dòng)錯(cuò)誤標(biāo)志
a)主動(dòng)錯(cuò)誤標(biāo)志:6個(gè)顯性位
b) 被動(dòng)錯(cuò)誤標(biāo)志:6個(gè)隱性位
(2) 錯(cuò)誤定界符:由8個(gè)隱性位組成,。
注1:錯(cuò)誤標(biāo)志重疊:取決于連接到總線上的各單元檢測(cè)出錯(cuò)誤的時(shí)間,,錯(cuò)誤標(biāo)志可能一個(gè)重疊在另一個(gè)上,總共可達(dá)12bit長(zhǎng)度,。
注2:主動(dòng)錯(cuò)誤標(biāo)志:處于主動(dòng)錯(cuò)誤狀態(tài)的單元檢測(cè)出錯(cuò)誤時(shí)輸出的錯(cuò)誤標(biāo)志,。
注3:被動(dòng)錯(cuò)誤標(biāo)志:處于被動(dòng)錯(cuò)誤狀態(tài)的單元檢測(cè)出錯(cuò)誤時(shí)輸出的錯(cuò)誤標(biāo)志。
1.5 過載幀
這個(gè)幀被接收單元用來通知還沒有準(zhǔn)備好接收幀,。它由一個(gè)過載標(biāo)志和一個(gè)過載定界符組成,。圖25顯示了錯(cuò)誤幀的結(jié)構(gòu)。
(1) 過載標(biāo)志:由6個(gè)顯性位組成,,過載標(biāo)志與錯(cuò)誤幀的主動(dòng)錯(cuò)誤標(biāo)志具有相同的結(jié)構(gòu),。
(2) 過載定界符:由8個(gè)隱性位組成,過載定界符與錯(cuò)誤幀的錯(cuò)誤定界符具有相同的結(jié)構(gòu),。
注1:錯(cuò)誤標(biāo)志重疊:向錯(cuò)誤標(biāo)志一樣,,取決于時(shí)間,,過載標(biāo)志可能一個(gè)重疊在另一個(gè)上,總共可達(dá)12bit長(zhǎng)度,。
1.6 幀間間隔
這個(gè)幀用來隔開數(shù)據(jù)幀和遙控幀,。數(shù)據(jù)和遙控幀可通過插入幀間間隔與前面?zhèn)鬏數(shù)娜魏螏〝?shù)據(jù)幀、遙控幀,、錯(cuò)誤幀,、過載幀)分開。
過載幀和錯(cuò)誤幀前不能插入幀間間隔,。如圖26所示,。
(1)間隔:由3個(gè)隱性位組成。在間隔期間如果檢測(cè)到顯性電平,,則必須發(fā)送過載幀,,然而,如果間隔的第3bit是顯性電平,,間隔被認(rèn)為是SOF
(2)總線空閑:是隱性電平,,長(zhǎng)度沒有限制(它可以是0bit長(zhǎng)),。當(dāng)總線處于這種狀態(tài)的時(shí)候,,總線被認(rèn)為是自由空閑的,任何單元都可以啟動(dòng)發(fā)送信息,。
(3)暫停傳輸(傳輸暫停期):有8個(gè)隱性位組成,。只在處于被動(dòng)錯(cuò)誤狀態(tài)的單元?jiǎng)偘l(fā)送一個(gè)消息后的幀間隔中包含的段。
1.7 優(yōu)先級(jí)的決定
在總線空閑狀態(tài),,最先開始發(fā)送消息的單元獲得發(fā)送權(quán),。
多個(gè)單元同時(shí)開始發(fā)送時(shí),各發(fā)送單元從仲裁域的第一位開始進(jìn)行仲裁,。連續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送,。丟失競(jìng)爭(zhēng)的單元在下一bit進(jìn)入接收操作。
仲裁的過程如圖27所示,。
(1)數(shù)據(jù)幀和遙控幀的優(yōu)先級(jí)
具有相同 ID 的數(shù)據(jù)幀和遙控幀在總線上競(jìng)爭(zhēng)時(shí),,仲裁段的最后一位(RTR)為顯性位的數(shù)據(jù)幀具有優(yōu)先權(quán),可繼續(xù)發(fā)送,。
數(shù)據(jù)幀和遙控幀的仲裁過程如圖28所示,。
(2)標(biāo)準(zhǔn)格式和擴(kuò)展格式的優(yōu)先級(jí)
標(biāo)準(zhǔn)格式 ID 與具有相同ID 的遙控幀或者擴(kuò)展格式的數(shù)據(jù)幀在總線上競(jìng)爭(zhēng)時(shí),標(biāo)準(zhǔn)格式的RTR 位為顯性位的具有優(yōu)先權(quán),,可繼續(xù)發(fā)送,。
標(biāo)準(zhǔn)格式和擴(kuò)展格式的仲裁過程如圖29所示。
1.8 位填充
位填充是一種周期性重同步收/發(fā)操作的功能,,為了防止接收節(jié)點(diǎn)間時(shí)序由于累積而導(dǎo)致的錯(cuò)誤,,如果5個(gè)bit持續(xù)了同樣的電平,,則添加1個(gè)bit的反向數(shù)據(jù)位。
如圖30顯示的位填充機(jī)制:
(1)發(fā)送單元的操作
在發(fā)送數(shù)據(jù)幀和遙控幀的時(shí)候,,SOF-CRC段間的數(shù)據(jù),,相同電平如果持續(xù)5bit,在下一bit(第6bit)則要插入1bit與前5bit反向的電平,。
(2)接收單元的操作
在接收數(shù)據(jù)幀和遙控幀的時(shí)候,,SOF-CRC段間的數(shù)據(jù),相同電平如果持續(xù)5bit,,需要?jiǎng)h除下一bit(第6bit)再接收,。如果這第6bit的電平與前5bit相同,則被視為錯(cuò)誤,,且發(fā)送錯(cuò)誤幀,。
1.9 錯(cuò)誤的種類
有5種類型的錯(cuò)誤,可能有2個(gè)或更多的錯(cuò)誤同時(shí)發(fā)生:
位錯(cuò)誤
填充錯(cuò)誤
CRC錯(cuò)誤
格式錯(cuò)誤
ACK錯(cuò)誤
表8列出了這些錯(cuò)誤的種類,、內(nèi)容,、錯(cuò)誤檢測(cè)幀和檢測(cè)單元。
位錯(cuò)誤由向總線上輸出數(shù)據(jù)幀,、遙控幀,、錯(cuò)誤幀、過載幀的單元和輸出ACK的單元,、輸出錯(cuò)誤的單元來檢測(cè),。
在仲裁段輸出隱性電平,但檢測(cè)出顯性電平時(shí),,將被視為仲裁失利,,而不是位錯(cuò)誤。
在仲裁段作為填充位輸出隱性電平時(shí),,但檢測(cè)出顯性電平時(shí),,將不視為位錯(cuò)誤,而是填充錯(cuò)誤,。
發(fā)送單元在ACK 段輸出隱性電平,,但檢測(cè)到顯性電平時(shí),將被判斷為其它單元的ACK 應(yīng)答,,而非位錯(cuò)誤,。
輸出被動(dòng)錯(cuò)誤標(biāo)志(6 個(gè)位隱性位)但檢測(cè)出顯性電平時(shí),將遵從錯(cuò)誤標(biāo)志的結(jié)束條件,,等待檢測(cè)出連續(xù)相同6 個(gè)位的值(顯性或隱性),,并不視為位錯(cuò)誤。
(2) 格式錯(cuò)誤
即使接收單元檢測(cè)出EOF(7 個(gè)位的隱性位)的最后一位(第8 個(gè)位)為顯性電平,也不視為格式錯(cuò)誤,。
即使接收單元檢測(cè)出數(shù)據(jù)長(zhǎng)度碼(DLC)中9~15 的值時(shí),,也不視為格式錯(cuò)誤。
1.10 錯(cuò)誤幀的輸出時(shí)序
檢測(cè)到發(fā)生錯(cuò)誤的單元輸出一個(gè)錯(cuò)誤標(biāo)志,,以通知其它單元,。
處于主動(dòng)錯(cuò)誤狀態(tài)的單元輸出的錯(cuò)誤標(biāo)志為主動(dòng)錯(cuò)誤標(biāo)志;處于被動(dòng)錯(cuò)誤狀態(tài)的單元輸出的錯(cuò)誤標(biāo)志為被動(dòng)錯(cuò)誤標(biāo)志,。
發(fā)送單元發(fā)送完錯(cuò)誤幀之后,,將再次發(fā)送數(shù)據(jù)幀或遙控幀。
錯(cuò)誤標(biāo)志輸出時(shí)序如表9:
1.11 位時(shí)序
在沒有重新同步情況下,,發(fā)送單元每秒傳輸?shù)奈粩?shù)稱之為位速率,。1位由下面4個(gè)段組成。
同步段(SS)
傳播時(shí)間段(PTS)
相位緩沖段1(PBS1)
相位緩沖段2(PBS2)
這些段又由稱之為Time Quantum(以下稱為Tq)的最小時(shí)間單位構(gòu)成,。
1位分為4個(gè)段,,每個(gè)段由若干個(gè)Tq構(gòu)成,這稱為位時(shí)序,。
1位由多少個(gè)Tq構(gòu)成,、每個(gè)段由多少個(gè)Tq構(gòu)成等是可以設(shè)定的。通過設(shè)置bit時(shí)序,。使得可以設(shè)定一個(gè)采樣點(diǎn)以使總線上多個(gè)單元可同時(shí)采樣,,所謂采樣點(diǎn)就是在這一時(shí)刻總線上的電平被鎖存,這個(gè)鎖存的電平作為位的值,。采樣點(diǎn)的位置在PBS1的結(jié)束處,。
表10描述了各段的作用和Tq 數(shù)。1個(gè)位的構(gòu)成如圖31所示,。
注1:IPT代表信息處理時(shí)間,是以采樣點(diǎn)作為起始的時(shí)間段,,用于計(jì)算后續(xù)位的位電平,。這是硬件在一個(gè)采樣點(diǎn)后立刻改變位的電平所必須要的。這個(gè)時(shí)間等于或小于2Tq,,,。
注2:因?yàn)椴蓸狱c(diǎn)是處于PBS1結(jié)束處,所以IPT和PBS2重疊,。當(dāng)IPT = 2Tq時(shí),,PBS2不可能選為1,因此,,PBS2必須是2到8Tq,。
注3:重新同步的結(jié)果使相位緩沖段1增長(zhǎng),或使相位緩沖段2 縮短,。相位緩沖段加長(zhǎng)或縮短的數(shù)量有一個(gè)上限,,此上限由SJW(重新同步跳轉(zhuǎn)寬度)給定,。重新同步跳轉(zhuǎn)寬度應(yīng)設(shè)置于1和最小值之間(此最小值為4*PBS1)。
可以從一位值轉(zhuǎn)換到另一位值的過渡過程得到時(shí)鐘信息,。這里有一個(gè)屬性,,即:只有后續(xù)位的一固定最大數(shù)值才具有相同的數(shù)值。這個(gè)屬性使總線單元在幀期間重新同步于位流成為可能,??捎糜谥匦峦降膬蓚€(gè)過渡過程之間的最大的長(zhǎng)度為29個(gè)位時(shí)間。
1.12 同步是如何獲得的,?
CAN總線的通訊是采用NRZ(Non-Return to Zero,,非歸0)碼,數(shù)據(jù)本身并不攜帶時(shí)鐘信息,,也即在每一位的開始或結(jié)束沒有同步信號(hào),,發(fā)送單元以位時(shí)序同步的方式開始發(fā)送幀數(shù)據(jù),接收單元根據(jù)總線電平的變化進(jìn)行同步并進(jìn)行接收工作,。
然而,,發(fā)送器和接收器之間由于彼此的時(shí)鐘誤差或傳輸路徑的相位誤差可能會(huì)失去同步關(guān)系,因此接收單元在接收幀的時(shí)候,,必須通過硬件同步或重新同步調(diào)整它的操作時(shí)序,。
1.13 硬件同步
在總線空閑狀態(tài)時(shí),接收單元檢測(cè)到SOF,,就會(huì)執(zhí)行這個(gè)同步調(diào)整過程,。“隱式”電平跳變到“顯式”電平的邊緣的時(shí)間點(diǎn)被認(rèn)為是SS,,而不管SJW的值
圖32顯示了硬件同步機(jī)制,。
如果沿出現(xiàn)在SS里,沿的相位誤差e=0,;
如果沿位于采集點(diǎn)(PBS1結(jié)束之前)之前,,e>0;
如果沿位于采集點(diǎn)之后,,e<0,;
1.14 重新同步機(jī)制
在接收過程中檢測(cè)到總線電平發(fā)生了改變時(shí)執(zhí)行重新同步操作。
每當(dāng)檢測(cè)到一個(gè)邊沿(總線電平的改變),,收發(fā)單元根據(jù)SJW值通過增加PBS1段或減少PBS2段,,來調(diào)整同步。但,,如果發(fā)生了超出SJW值的誤差時(shí),,最大調(diào)整量不能超過SJW值。
圖33顯示了重新同步機(jī)制。
1.15 調(diào)整同步的規(guī)則
硬件同步和再同步的執(zhí)行遵從如下規(guī)則:
1) 在1個(gè)位時(shí)間里(或者說在2個(gè)采樣點(diǎn)之間),,只允許一個(gè)同步(或者說只進(jìn)行一次同步調(diào)整),。
2) 只有當(dāng)采樣點(diǎn)之前的總線電平和邊沿后的總線電平不同時(shí),該邊沿才能用于調(diào)整同步,。
3) 如果出現(xiàn)隱性電平到顯性電平變化的邊沿,,且條件(1)和(2)滿足,將進(jìn)行同步,。
4) 如果在幀間間隙期間發(fā)生隱性電平到顯性電平的信號(hào)邊沿(除了間隙里的第一位),,則總會(huì)執(zhí)行硬件同步。
5) 如果發(fā)生從所有其它隱性電平到顯性電平的信號(hào)邊沿,,則執(zhí)行再同步,。
6) 如果發(fā)送單元自身輸出的顯性電平被檢測(cè)到有延遲,則不執(zhí)行再同步,。