CAN總線定義:
CAN(Control Area Network)屬于現場總線的范疇,是一種高性能、高可靠性、易于開發和低成本的串行總線。
CAN是由德國Bosch公司在1986年為汽車監測和控制而設計的。由于其高性能、高可靠性、實時性等優點,隨后也廣泛用于工業自動化、多種控制設備、交通工具、醫療儀器以及建筑、環境控制等多種領域,其在每個領域的廣泛使用促進了標準化的進程。
1991年9月PHILIPS SEMICONDUCTORS制訂并發布了CAN技術規范V2.0,該技術規范包括A和B兩部分。2.0A曾在CAN技術規范1.2中定義的CAN報文格式,提供11位地址;而2.0B給出了標準和擴展的兩種報文格式,提供29位地址。此后ISO在1993年11月也正式發布了CAN的國際標準ISO11898。其中ISO11898-1定義了CAN數據鏈路層;ISO11898-2定義了非容錯CAN物理層;ISO11898-3定義了11898-3的容錯物理層。CAN總線協議只定義了物理層和數據鏈路層,要將CAN總線應用于實際的工程項目和產品開發中必須制定上層應用協議。目前汽車上應用的協議有:ISO15675(傳輸層協議)、ISO14229(應用層協議)等。
CAN總線的特點
1、 多主控制方式。在總線空閑時,所有單元都可往總線上發送消息(多主控制)。最先訪問總線的單元可獲得發送權(采用CSMA/CA方式)。當多個單元同時發送時,CANID小的節點獲得發送權。
2、 非破壞性總線仲裁技術。當總線發生沖突時,高優先級報文可以不受影響的進行傳輸,保證高優先級的實時性要求;而低優先級的報文退出傳輸。
3、 高可靠性。每幀都有位填充,CRC校驗等多種錯誤檢測,保證了極低的錯誤率;發送期間丟失仲裁或者由于錯誤而破壞了的數據幀可自動重發(這一點由CAN控制器自己重發,無需人為重新裝載發送數據)。
4、 自動關閉總線。CAN控制器可以檢測和判斷總線上的錯誤類型,是短暫的數據錯誤(如外部噪聲),還是持續數據錯誤(如單元內部故障、驅動器故障、短路故障等)。當錯誤為持續性故障時,CAN控制器可自動關閉,脫離總線,以免影響總線上的其他節點正常通信。
CAN總線拓撲圖
CAN控制器根據兩根線上的電位差來判斷總線電平。總線電平分為顯性和隱性電平,二者必居其一。發送方通過使總線電平變化,將消息發送給接收方。下圖1是一個CAN總線連接示意圖。
下圖1由兩個CAN網絡組成,其中一個網絡通信速率為500K,另外一個為125K。每個CAN網絡由CANH和CANL兩根線組成,各個節點(ABS、SAS、ETM、ECM)分別連接在CANH和CAHL上。在每個CAN網絡的頭尾分別連接了兩個終端電阻,終端電阻的大小為120歐姆。
下圖1左邊陰影部分是某個節點的內部電路模塊,包含CPU、CAN控制器(CAN Controller,一般單片機都集成了CAN控制器模塊)以及CAN收發器(CAN transceiver)。其中CPU負責將需要發送的數據傳遞給CAN控制器,以及接收從CAN控制器中解析的數據;CAN控制器將Rx腳的二進制的0/1轉換為具體的報文,然后將報文傳遞給CPU,以及將CPU需要發送的報文轉換為二進制0/1,然后通過Tx腳傳遞給CAN收發器。CAN控制器的主要功能是電平轉換,將CANH和CANL上的電平轉換為Rx腳上的0/1,將Tx腳上的0/1在CANH和CANL進行轉換。
圖1
信號電平
高速CAN,定義 當CANH 和 CANL 電壓相同(CANH = CANL = 2.5V)時為邏輯“1”,CANH和CANL 電壓相差 2V(CANH = 3.5V, CANL = 1.5V) 時為邏輯“0”。高速CAN收發器在共模電壓范圍內(-12V ~ 12V),將CANH和CANL電壓相差大于 0.9V 解釋為顯性狀態(Dominant),而將CANH和CANL電壓相差小于 0.5V 解釋為為隱性狀態(Recessive)。
CAN總線采用不歸零碼位填充技術,也就是說CAN總線上的信號有兩種不同的信號狀態,分別是顯性的(Dominant)邏輯0和隱形的(recessive)邏輯1,信號每一次傳輸完后不需要返回到邏輯0(顯性)的電平。
CAN信號傳輸
圖2 a
發送過程: CAN控制器將CPU傳來的報文轉換為邏輯電平(即邏輯0-顯性電平或者邏輯1-隱性電平)通過Tx腳傳遞給CAN收發器。CAN收發器接收邏輯電平之后,再將其轉換為差分電平輸出到CAN總線上。
圖2 b
接收過程: CAN收發器將CAN_H 和 CAN_L 線上傳來的差分電平轉換為邏輯電平輸出到CAN控制器的Rx腳,CAN控制器再把該邏輯電平轉化為相應報文發送到CPU上。
圖2 c
報文傳輸
幀類型
CAN總線在報文傳輸中,可傳輸以下4種不同類型的幀報文:
數據幀:數據幀裝載的是發送數據,它將數據從發送節點傳輸到接收節點;
遠程幀:遠程幀請求具有相同標識符(CANID)的數據幀的發送,實際很少使用;
錯誤幀:任何節點檢測到總線錯誤時都可以發送錯誤幀。由于總線錯誤幀沒有CANID,所以當檢測到錯誤幀時,只知道有錯誤,但無法定位該錯誤幀是哪個模塊發送的;
過載幀:過載幀用于在先行的和后續的數據幀之間提供附加的延時。
幀格式
在CAN2.0B規范中,數據幀和遠程幀有兩種幀格式,其區別主要在于標識符(即CANID)的長度:具有11位標識符的稱為標準幀,而具有29位的幀稱為擴展幀,如下圖3所示。數據幀和遠程幀都可以使用標準幀或遠程幀格式。幀與幀之間是通過幀間隔進行分開。
數據幀格式
數據幀由7部分組成:幀起始、仲裁段、控制段、數據段、CRC段、ACK段、幀結束。
圖3
幀起始
長度為1位,幀起始(SOF)表示數據幀的起始,由一個單獨的顯性位組成。CAN節點發送數據的原則是先監聽后發送,即如果CAN節點需要發送數據,先監聽總線是否空閑,如果總線空閑,則往總線發送幀起始(SOF),獲得發送權,否則一直等待直到總線空閑才發送幀起始(SOF)。
仲裁段
標準幀和擴展幀的仲裁段不同,長度分別是12bit和32bit。如上圖3所示,在標準幀格式中,仲裁段由11位標識符(CANID)和遠程發送請求位(RTR)組成。在擴展幀中,仲裁段由29位標識符(CANID)、代替遠程請求位(SRR)、擴展位(IDE)、遠程發送請求位(RTR)組成。擴展幀標識符由11位基本ID和18位擴展ID組成。在標準幀中,遠程發送請求位(RTR)和IDE固定位0。而擴展幀中,代替遠程請求位(SRR)和IDE固定為1, 遠程發送請求位(RTR)固定位0。
標識符(CANID):用于區分發送數據內容,比如我們定義ID 234發送某傳感器采集到的溫度值,ID 235發送某傳感器采集到的電流值。對于發送節點來講,當它需要發送溫度數據值,只需要將溫度值裝入ID為234的報文,需要發送電流數據時,只需要將采集到的電流數據裝入ID為235的報文。對報文接收節點來講,一旦收到ID為234時,就知道里面裝載的是溫度值,一收到ID為235時,就知道里面裝載的是電流值。
代替遠程請求位(SRR):SRR是一個隱性位。在擴展幀中11位標識符的下一位是SRR位,而在標準幀中11位標識符的下一位是RTR位,因此SRR稱作代替遠程請求位。當標準幀和擴展幀沖突時,并且擴展幀的基本標識符與標準幀的標識符相同時,標準幀優先級高于擴展幀。
標識符擴展位(IDE):表示該報文為標準格式或擴展格式。為顯性時,表示為標準幀,為隱性時,表示為擴展幀。
注:如前所述,CAN模塊采用先監聽后發送的原則,即如果CAN模塊需要發送數據時,先監聽總線,如果發現總線空閑,則開始發送報文。如果網絡上兩個CAN模塊剛好同時需要發送報文,他們同時檢測到總線空閑。且同時發送幀起始(SOF)。那么CANID小的模塊發送優先級高,搶占發送權。
控制段
控制段表示數據段的數據段的長度,由保留位和數據長度碼共6bit組成,如下圖3所示。發送數據段的長度是可變的,具體長度由控制段決定。長度位0-8字節。DLC編碼和數據段長度對應關系如下表所示。
表1
保留位:在標準格式由R1(顯性)和R0(隱形)組成。
CRC段
包括CRC序列(15bit)和CRC界定符(1位,固定為隱性),圖下圖3所示。
CRC序列:該序列是對幀起始、幀仲裁段、控制段、數據段的進行CRC計算。
CRC界定符:CRC界定符是一個位隱性位。
ACK段
ACK段包含2bit,包括應答位和應答界定符。
在ACK段,發送節點發送兩個隱性位。當接收節點正確接收到有效報文后,接收模塊就會在ACK段的第一位發送隱性位來告知發送模塊數據被正常接收了。應答界定符固定為高電平。
幀結束(EOF):
幀結束由7個隱性位組成,每個數據幀和遠程幀都必須包含完整的幀結束分。
標準數據幀的長度
因此一幀報文最大長度為:1(SOF)+11(ID)+1(RTR)+6(控制段)+64(數據段)+15(CRC)+1(CRC界定符)+2(ACK)+7(EOF)+3(幀間隔)=111位。在不考慮位填充的情況下,一幀8個字節的標準幀,需要占用111位。
當考慮位填充時,通過示波器測量數據和ID全位0和全位1的數據幀占用總線時間。
當ID和Data全為1時,波特率位500K,報文占用總線時間為254us。
當ID和Data全為0時,波特率位500K,報文占用總線時間為252us。
通過以上測試,可以看出當我們需要以最快速度在CAN總線上傳輸報文時,最快速度大概是250us每幀報文,也就說最快1s能夠傳輸不到4000條報文。
遠程幀格式
包含幀起始、仲裁段、控制段、CRC段、ACK段、幀結束。與數據幀相比,RTR位為1,且缺少數據段。
圖4
錯誤幀格式
錯誤幀由兩部分組成:錯誤標志,錯誤界定符。錯誤標志長度為6個位,由于總線網絡中有多個節點,每個檢測到錯誤的節點都會發送錯誤幀,考慮到錯誤疊加,錯誤標志長度位6-12位。根據錯誤節點所處的狀態不同,錯誤標志也是不一樣的。當節點處于主動錯誤時,發送的錯誤標志為顯性,當節點處于被動錯誤時,發送的錯誤標識為隱性。錯誤界定符由8個隱性位組成。
注:當某個節點因為本身原因,持續檢測到錯誤,為了防止該節點一直發送錯誤幀而對其他正常工作的節點正常工作產生影響,所以該節點進入被動錯誤后,節點發送的錯誤幀為隱性,這樣就不會影響其他節點正常工作。
圖5
過載幀格式
過載幀由兩部分組成:過載標志和過載界定符。
以下3中情況,都會引發過載幀的發送。
1、 CAN控制器要求延遲下一個數據幀或遠程幀的發送。
2、 在幀間隔段的第1和第2位檢測到顯性(數據幀或者遠程幀的發送需要等到3位長度的幀間隔發送完后才可以嘗試發送);
3、 如果一個CAN節點在出錯界定符或者過載界定符的第8位(最后1位)采樣到1個顯性位,節點就會發送一個過載幀(而非錯誤幀),此時錯誤計數器不會增加(數據幀或者遠程幀的發送需要等錯誤界定符或者過載界定符發送完畢后,再等3個位長都的幀間隔才能發送數據)。
注:由上述1-3可以看出,為了阻止后續數據幀、遠程幀的發送可以插入過載幀。
過載標志由6個顯性位組成。過載標志和主動錯誤標志一樣。過載標志的形式破壞了幀間隔,因此,所有其他節點檢測到上述過載條件將發出過載標志。如果在幀間隔段的第3位檢測到一個顯性位,則該位將解釋為幀起始。
過載界定符由8位隱性位組成。過載界定符的形式和錯誤界定符的形式一樣。在過載標志位被發送后,節點一直檢測總線,直到檢測到一個從顯性到隱性位的跳變。此時,總線上的每個節點都完成了過載標志的發送,并開始同時發送剩余的隱性位。
圖6
幀間隔的格式
數據幀和遠程幀通過幀間隔與總線上的其他幀(數據幀、遠程幀、錯誤幀和過載幀)分隔開。過載幀和錯誤幀與他們之前的幀之間沒有幀間隔,多個超載幀之間也沒有幀間隔。
幀間隔包含間隔和總線空閑。對于處于被動錯誤狀態的節點來說,其間隔幀除了包含間歇、總線空閑外,還包含延時發送。間歇包含3個隱性位。間歇期間,所有節點均不允許發送數據幀和遠程幀,其唯一的作用是標示一個過載條件(第三位除外)。
總線空間的時長可以是任意長度。在此期間,總線被認為是空閑的,任何需要發送報文的節點在此期間都可以發送報文。一條因為其他報文正在發送而被掛起的報文,將在其延時結束后的第1位(如果此時總線還是空閑的情況下)開始發送,此時檢測到總線的一個顯性位將認為一個幀起始
延時傳送是指節點發送一個報文后,在開始發送下一報文或者認可總線處于空閑前,在間隔后發出8個隱性位。如果在此期間由其他節點開始發送報文。延時傳送降低了被動錯誤節點向總線發送報文的優先級,這樣做是為了降低被動錯誤狀態節點因自生故障干擾總線的可能性。
圖7
數據發送優先級
在總線空閑時,最先開始發送的節點獲得發送權。
當多個節點同時開始發送時,各發送節點從仲裁段的第一位開始進行仲裁。連續輸出顯性電平最多的單元可繼續發送。仲裁過程如下圖所示,節點1仲裁失敗。
圖8
位填充
由于CAN總線傳輸時,沒有類似其他串行通信的CLK線,所以如果連續傳輸多個相同位時會有時鐘誤差的累加。為了解決此問題,引入位填充的概念。當同樣的電平持續5位時添加一個位的反型數據,當電平發生跳變時,進行再同步,以解決時鐘誤差累加問題。位填充的構成如下圖所示。
圖9
錯誤種類
位錯誤
CAN節點在發送位的同時也會對總線進行監測,如果所發送的位值與所檢測到的位值不相符,則認為檢測到一個位錯誤。位錯誤是由總線上發出數據幀、遠程幀、錯誤幀、過載幀的節點和發出ACK的節點檢測到的。但以下情況除外:在仲裁段發出隱性電平,但是實際檢測到顯性電平,將被認為仲裁失敗而非位錯誤;在仲裁段作為位填充發出隱性電平,但實際檢測到顯性電平,將被認為填充錯誤,而非位錯誤。發送節點在發送ACK段發送隱性電平,但檢測到顯性電平是,將判定位其他接收單元發送的ACK應答,而非位錯誤。發送被動錯誤(6個隱性位)但檢測出顯性電平,間不被認為位錯誤。
檢測節點:發送節點和接收節點
填充錯誤
如果在報文發送期間,檢測出6個連續顯性或者隱性位,則將認為是一個填充錯誤。
檢測節點:發送節點和接收節點
CRC錯誤
如果接收節點在接收數據過程中計算的CRC值與發節點發送的CRC不一致,則接收節點會發送一個錯誤幀。
檢測節點:接收節點
格式錯誤
當一個固定形式的位檢測出1個或多個非法位,則被認為是格式錯誤。具體包括數據幀和遠程幀的CRC界定符、ACK界定符、EOF界定符以及錯誤界定符、超載界定符。
檢測節點:接收節點
ACK錯誤
只要在應答間隙檢測到顯性,則發送節點認為這是一個ACK錯誤。
檢測節點:發送節點
錯誤幀發送時間點
當任意節點檢測到錯誤時,將會輸出錯誤幀。處于主動錯誤的節點輸出主動錯誤,處于被動錯誤的節點輸出被動錯誤。
當節點檢測到位錯誤、填充錯誤、格式錯誤、ACK錯誤,從檢測出錯誤的下1位開始發送錯誤標志。
當節點檢測到CRC錯誤時,在ACK界定符后的下1位發送錯誤標志。
注意:對于數據幀和遠程幀來講,需要在各種幀(數據幀、遠程幀、錯誤幀、過載幀)發送結束后的再插入一個間隔幀,才可以數據幀。所以我們可以大致計算出當一幀數據發送失敗后,大概多長時間CAN控制器才會才重發這幀報文(即錯誤幀長度再加上一個幀間隔,根據發送節點所處的是主動錯誤還是被動錯誤狀態,幀間隔長度會不一樣,所以計算時需要注意)。
錯誤計數器的加減規則
具體如下表。
表2
注:第3點當發送節點發送一個錯誤標志時,發送錯誤計數器值加8。這里有兩個例外情況:一是當發送節點處于被動錯誤時,并檢測到一個應答錯誤或者發送被動錯誤標志期間沒有檢測到顯性位(這種情況是因為整個網絡中只有發送節點一個節點存在,所以不能因為只有發送節點存在而一直將發送錯誤計數器往上加,直至發送節點進入bus off狀態)二是發送節點因為仲裁期間發生填充錯誤而發送錯誤標志。以上兩種情況,發送錯誤計數器值不變。
錯誤狀態變化
當節點的發送錯誤計數器值在0-127之間且接收錯誤計算器值在0-127之間時,節點處于主動錯誤狀態;
當節點的發送錯誤計數器值在128-255之接或者接收錯誤計數器值在128-255之間,節點處于被動錯誤。
當發送錯誤計數器值大于255時候,節點進入總線關閉(bus off),接收錯誤用于不會大于255,即接收錯誤不會使節點進入bus off。
注:只有發送錯誤才能讓節點進入總線關閉。另外需要注意,當總線關閉可以設置CAN控制器時自動恢復(即檢測到128次11個連續隱性位自動恢復到主動錯誤狀態)還是不自動恢復。在汽車行業,一般都是不讓CAN控制器自動恢復,而是人為控制進入快慢恢復過程。
圖10
位時間要求
標稱位時間
標稱位時間,是指理想情況下發送1位所需要的時間,例如對于速率為500k的CAN總線,標稱為時間=1/500k=2us
一個標稱位時間可以劃分為4個不重疊的段,分別為同步段(SS)、傳播時間段(PTS)、相位緩沖段1(PBS1)、相位緩沖段2(PBS2)。
同步段(SS):多個連接在總線上的節點通過此段實現位時序調整,同步每個位的發送和接收工作。由隱性到顯性或者顯性到隱性電平變換最好發生在這個段中。
傳播時間段(PTS):用于吸收網絡上的物理延遲的段。所謂網絡上的物理延時指發送節點的輸出延遲、總線上信號的傳播延遲、接收單元的輸入延遲。這個段的時間為以上各延時時間的和的兩倍。
相位緩沖段1(PBS1)和相位緩沖段2(PBS2):當信號邊沿不能包含于SS段中時,可在此段進行補償。由于各發送節點、接收節點以各自獨立的內部時鐘工作,細微的時鐘誤差會累計起來,PBS段可用于吸收此誤差。通過對相位緩沖段加減SJW。
如下圖所示,假設1個位由10個Tq組成,可以通過改變PTS和PBS1以及PBS2段的大小來實現不同的采樣點。一般情況下傳輸速率越高采樣點越低。對于500K傳輸速率來講,采樣點一般選擇在75%-81.25%之間。采樣點分為單點采樣和多點采樣,一般情況下,單點采樣就可以滿足要求。
注:一般直接選擇單片機的外部晶振作為CAN總線的時鐘源,而非PLL倍頻再分頻的時鐘作為時鐘源。
圖11
采樣點:所謂采樣點是讀取總線電平,并將讀取到的電平作為位值的點。位置在PBS1結束處。
硬件同步
接收單元在空閑狀態檢測出幀起始時進行的同步調整。在檢測出邊沿時不考慮SJW的值而認為是SS段。硬同步如下圖所示。
圖12
再同步
在接收過程中檢測出總線上的電平變化時進行的同步調整。每當檢測出邊沿時,根據邊沿出現的位置加長PBS1段或者縮短PBS2段,以調整同步。調整的幅度大小為SJW。
如下圖所示,當邊沿出現在SS段后時,說明接收節點的SS段早于發送節點的SS段,接收節點為了在盡可能靠近發送節點的采樣點處進行采樣,在PBS1插入一個SJW。
圖13
如下圖所示,當邊沿出現在SS段前時,說明接收節點的SS段晚于發送節點的SS段,接收節點為了在盡可能靠近發送節點的采樣點處進行采樣,再將上1位的PBS2減少一個SJW。
圖14
硬同步和再同步的規則
1、1個位中只進行一次同步調整
2、只有當上次采樣點的總線值和邊沿后的總線值不同時,該邊沿才能用于調整同步(即電平發生變化)
3、在總線空閑且存在隱性電平到顯性電平邊沿,則一定要進行硬件同步。
4、在總線非空閑檢測到的隱性電平到顯性電平的邊沿如果滿足條件1和2,將進行再同步。