CAN學習方法(知乎)

做者:心機之花
連接:https://www.zhihu.com/question/26776219/answer/244433861
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

說下個人學習過程。剛到公司的時候我根本不知道什麼是CAN,甚至連以太網和串口通信都不懂。領導把USBCAN分析儀拿給我,把銅線短接上,用軟件在CAN1窗口點下發送,CAN2窗口立刻接收到了發送出來的數據,ok,成功了。這就是CAN通信。因此第一點,你想學汽車CAN總線,你首先要有個USBCAN分析儀。不然你沒法看到CAN總線的原始數據。示波器?須要購買有CAN總線數據分析功能的示波器。html

1.一個USBCAN分析儀(買或者本身作)

分析儀這東西我看知乎上仍是土豪居多。USBCAN分析儀屬於舶來品,原產於歐洲,咱們國內用的較多的有VN1630A(Vector出品,用CANoe軟件),PCAN-USB(PEAK公司出品,國內用量大),Kvaser的USBCAN(瑞典知名公司),USB2CAN(IXXAT公司,德國),NI本身的USBCAN。其特色是昂貴但功能強大,Peak最便宜的無隔離版本也要2000多塊,Vector的硬件價格更是極高。做爲學生黨買不起,何談學習?接下來講下國產貨,ZLG做爲知名的嵌入式龍頭企業有不少CAN設備賣,但一樣的,價格上也是1200-2200人民幣不等,小貴。最後是平民價位的CAN分析儀,淘寶和京東都有,200-600元不等,這個價位你們仍是能夠接受的。在這裏不推薦你們購買250元如下的分析儀。很便宜的分析儀大可能是USB轉串口,再轉CAN,這樣的分析儀接收高負載數據時會出現丟幀的現象,以後咱們也會說下如何自制一臺這樣的USB轉串口轉CAN分析儀。別圖便宜,看下淘寶銷量排行,不要省那100元錢,用很差還要退貨,麻煩。總結下,初學CAN,若是有足量科研經費,應該優先採購歐洲設備,畢竟軟件功能多,性能好;如囊中羞澀,先買平價國產分析儀接收數據徹底能夠知足須要。附:USBCAN的百度詞條安全

USB-CAN_百度百科網絡

2.基礎知識掃盲

第一點完畢。第二點是足額的CAN技術掃盲,來源是書和度娘。入門書籍的選擇很重要。在這裏推薦的是《項目驅動:CAN-bus現場總線基礎教程 周立功 新華書店正版暢銷圖書》。這書實在便宜還好用。推薦你們花時間把前兩章反覆看幾遍。數據結構

高速CAN的電平信號(有差分電壓表示0,沒有則表示1) CAN總線標準數據幀的結構(無需過多瞭解)

你說我不喜歡看書,直接上資料?有的。清華PPT和大衆PPT是典範,連接在下面。ide

清華大學教程――CAN總線原理及應用_圖文_百度文庫函數

【圖文】上海大衆帕薩特CAN數據總線的結構原理_百度文庫工具

一汽大衆CAN-BUS培訓資料_圖文_百度文庫性能

你說我是搞ARM的,最近公司讓我用STM32開發CAN接口設備,下面是初級入門用的材料。學習

連接: 密碼:84sd測試

連接: 密碼:zdgq

這個是野火和正點原子兩家的開發手冊,翻到CAN總線那部分,推薦直接使用ST的庫函數,先實現功能,有餘力再看寄存器,省得走彎路。這手冊裏面的CAN總線更側重於開發和使用,基礎的東西講得少。

3.找個CAN設備測量數據

第三點是實際操做,在實際測試中鞏固理論知識。

CAN總線不是空中樓閣。無論你測什麼東西的CAN信號都行,重要的是,你要接收到那些寶貴的CAN總線數據。舉個例子,你的汽車,大家項目組租的車,你導師的車都行。反正我能想到的最方便的資源就是你身邊的車,只要是09年以後的車都帶CAN總線。我當時是測我本身的速騰車,但OBD接口的CAN被閹割了,沒有數據。後來從汽車之家論壇中發現空調CAN線能引出來,這樣才引出了兩條寶貴的100K波特率溫馨CAN總線,測出了不少數據。

汽車的CAN分爲動力CAN和溫馨CAN,具體能夠看PPT。我測的速騰溫馨CAN內容很豐富,車門、尾箱打開仍是關閉,安全帶,檔位,油量,手剎,方向盤轉角等等包羅萬象,但都是CAN總線源碼,你不知道哪一個信號是車門信號。這個就叫作逆向破解了。你須要頻繁的開關車門來肯定車門信號所對應的幀ID和幀數據。你動,它跟着動,你不動,它也不動,那就是它了。

什麼是幀ID?在實際應用中,CAN總線一個幀主要由幀信息幀ID幀數據組成。CAN總線又分爲3種,高速CAN、容錯CAN、單線CAN。媽呀,啥是高速CAN?高速CAN有別於容錯CAN和單線CAN,高速CAN的電平靜默2.5V,上下限是3.5V和1.5V,容錯CAN顯性時則爲1V和4V,故可用萬用表量出。容錯CAN和單線CAN的市場佔有率小,可暫時不學。附錄:高速CAN、容錯CAN、單線CAN區別
高速CAN,低速CAN, 單線CAN 比較

幀信息:四類,標準數據幀(汽油車、電機)、標準遠程幀(少見)、擴展數據幀(廣大柴油車、部分汽油車)、擴展遠程幀(少見)

有童鞋常常會問到CAN2.0A和CAN2.0B是啥,2.0A是標準的意思,幀ID11位,也即0x000-0x7FF。2.0B是擴展的意思,幀ID最高29位,也即0x0000 0000-0x1FFF FFFF,要注意2.0B已經包含了2.0A,他們倆是包含與被包含的關係。

幀ID是什麼?通俗講是CAN的一種「地址」。CAN有個特色是競爭機制幀ID越小越有佔用總線資源的權利,越會優先發送。舉個例子,燈光信號幀ID0x555,發動機溫度傳感器幀ID0x111,那麼當兩個信號同時發出時,發動機的信號會優先發送,燈光在後面排隊。一般在一個CAN系統中,不一樣的設備,發出CAN信號的幀ID都是不同的,或者說,CAN信號的每一個幀ID都有一個固定的用途。若是CAN信號的幀ID的用途被肯定下來,並在一個文檔中獲得瞭解釋,那麼咱們管這個叫CAN總線的應用層協議,或者高層協議。常見的有ISO15765-4,SAE J1939,CANopen(電機和挖溝機控制器用)。而這個文檔在車輛行業中叫DBC文件,它對車輛CAN總線上的每一個幀ID及每一個幀數據都作了註釋。

11位和29位是什麼意思呢?如今說下,11位指的是標準幀的幀ID範圍是0x000-0x7FF(0x是十六進制的意思),7FF翻譯成二進制是111 1111 1111,對吧,十一個「1」。同理,29位指擴展幀的幀ID範圍是0x0000 0000-0x1FFF FFFF,1FFF FFFF翻譯成二進制是29個1。大體明白了吧。29位的分配ID能力比11位的強,11位總有些地方不夠之感。

幀數據很簡單了,說下特點吧。與串口相比,CAN的幀數據只有8個字節,即64個位,不會再多了。固然,CAN FD做爲新型總線解決了僅有8字節這個問題。有興趣你們能夠了解下CAN FD。

波特率忘了,CAN的波特率都是整數,要注意。常見的車輛波特率有500K,250K,125K,100K。波特率這東西和收音機頻率同樣,若是兩個CAN設備的通訊波特率不一致的話,是不能進行通信的。

常見CAN高層協議及其波特率

終端電阻,CAN和RS485同樣,要在終端減小差分信號的反射。我記得最經典的一張圖是這麼畫的,水流在試管(平躺)的尾部受阻,水也就涌了回來。差分信號也是如此,你不在兩個終端加電阻,信號會反彈回來影響通信。詳細的看書吧,不細講了。這東西總線上要有兩個,兩個120歐姆的電阻,並聯,最遠的兩端一邊一個。多了不行少了也不行。你不肯定的話,用萬用表量一下,CANH和CANL之間60歐姆左右最好。

CAN總線的終端電阻

好的,如今你應該已經明白,幀ID幀信息幀數據都是什麼,知道CAN總線波特率是什麼,終端電阻是什麼,重要的是,你收到一個陌生設備發出的CAN總線數據了。你成功的邁出了學習CAN總線最重要的一步。若是你鏈接不上你的車或其餘CAN設備,那屬於鏈接問題,請參閱指導文檔
https://jingyan.baidu.com/article/3a2f7c2e213d1d26afd61197.htm

4.理解CAN高層協議

第四點,你須要找一個高層協議來進行CAN數據與實際含義對號入座。好比ISO15765-4協議和SAE J1939協議,看文檔,明白CAN總線是如何在某個幀ID中傳遞轉速等模擬量,傳遞燈光信號等數字量。

舉個例子,J1939柴油車協議中,0x18F00402這個幀ID表示EEC1,它的第四個和第五個幀數據,假如是0x02,0x03,那麼發動機轉速如何表示呢,轉速=2x0.125+3x32=96.25,這個就是真實的發動機轉速值。它是有公式在裏面的,這個事情是在協議中規定好的。用第四個幀的十進制數據乘以0.125,再加上第五個幀的十進制數據乘以32,你就獲得了實際的發動機轉速。對CAN總線協議的理解就說到這裏。知道幀ID和幀數據的意思,你就能夠對複雜的CAN總線16進制數據瞭如指掌。

SAE J1939協議截圖 大衆某車型的CAN數據含義

咱們再看一個例子,上圖是大衆某暢銷車的數據解析結果,幀ID爲0x390的標準數據幀,第三個幀數據若是爲0x40說明左前車門關閉,若是爲0x41說明左前車門打開。這個有什麼意義呢?若是咱們作一款中控車機,咱們知道有一個功能叫車輛狀態讀取,若是車門未關但車輛已開始行駛,車機須要知道左前門目前的狀態,經過什麼呢?就是CAN總線。車機會讀取CAN總線的信息,得知車體的門信息、安全帶信息、手剎信息等,經過語音模塊給予駕駛員必要的提醒。話說我有時真的會忘記放手剎,真的很感謝德賽西威的車機及時提醒我。

不少上了年紀的工程師,常常甩給我一個某某車廠零部件的通訊協議,說:」我發什麼數據給它,它才能動做啊?車廠的人只給了我這個通訊協議,我也看不懂。」其實通訊協議上面寫明瞭幀ID和幀數據意思,按圖索驥,你就能夠發一條CAN數據,啓動汽車的某個部件,很神奇。

5.作些關於CAN總線的項目(硬件接口或上位機)

第五點,作些實際的項目吧,能夠幫助身邊的親們作些CAN總線有關的外延工做。好比我作的是CAN總線的接收設備。由於公司有一些新品測試工做,這些工做絕大多數都須要檢測CAN口的好壞,因此我用stm32設計了一個簡易的反彈信號電路,若是測試不經過會亮紅燈。被嘉立創收了不少貼片的錢之後,實體電路板上線了,同事用的很開心。在這裏強烈推薦硬件基礎弱的同窗直接用立創EDA,這個EDA軟件的封裝啊、部分原理圖都是共享的,選件的時候還能夠考慮貼片的問題,不少小電阻、小電容什麼的能夠直接貼在你設計好的電路板上,極大程度上節省你的時間。我除了接插件和主芯片不用它家貼,其餘都是直接讓嘉立創貼好再給我郵過來。

學CAN總線仍是須要用項目來背書的,若是你軟件方面牛,能夠用第三方的CAN分析儀當硬件,本身開發上位機軟件,開發一些有特殊功能的軟件,我國目前缺乏診斷、數據分析、協議分析等方面的軟件,尤爲是汽車方面,絕大多數爲英文的,須要從國外購買。我能想到的有電動車充電管理系統,車輛信息讀取軟件,CAN Bootloader軟件等。我平常接觸的比較常見的軟件有BMS電池管理系統、消防信號管理系統、伺服電機管理系統什麼的。CAN不算是新鮮貨,主要的應用領域集中在汽車、BMS、電機控制等幾個方向內。

若是你硬件方面不錯,能夠嘗試下汽車類CAN總線設備的開發,ARM9,Cortex M3,DSP均可以的,懂些CAN總線終歸是好的。這方面有市場,朗仁作汽車診斷儀,格尼希爾作遠程啓動,騰訊前些年有騰訊路寶,還有鐵將軍,BMS相關企業,甚至是無人駕駛,都離不開CAN總線的相關開發。

 
 

想要學習汽車CAN總線,首先要了解汽車CAN總線概述、汽車誤撞診斷協議的發展、基於UDS的ISO15765協議等這些關於CAN總線的前世此生。

汽車診斷協議的發展

當今車輛的電控系統愈來愈多,好比發動機系統ABS、SRS、電動車窗、懸掛、電動箱子等等。與此同時,監控已經遍及於車身的各類傳感器,咱們可以獲取實時狀態信息,並將這些信息發送到相應的控制單元當中。每一個控制單元同時能夠接受各類各樣的信息,並對各類信息進行處理、分析,隨後發出相關的指令。好比發動機系統能夠接受來自進氣壓力傳感器、發動機溫度傳感器、油門踏板位置傳感器、發動機轉速傳感器等信息,通過分析和處理以後會發送相應的指令來控制噴油嘴的噴油量,好比說噴油時間、噴油脈寬及點火提早角等。

其餘的控制單元工做原理同發動機系統相似,車身上的這些控制單元並非獨立工做,而是做爲汽車這樣一個總體,它須要信息的共享,所以存在一個信息傳遞的過程。CAN總線就是把之前一線一用的專線制改爲一線多用制,這樣能夠大大減小汽車上電線的數量,也能夠簡化整個汽車的佈線。在造成OBD-II標準以前,各廠商的汽車診斷座均不相同。好比奔馳爲38幀,美洲車12幀,歐寶爲10幀,豐田爲17幀,寶馬爲20幀,本田爲3幀,澳大利亞西亞款6腳等。

 

各類各樣的診斷插頭

 

各類類型的診斷協議

 

因爲各廠商汽車診斷座與診斷協議差異巨大,致使汽車發生故障時其類型難以斷定。所以,SAE(美國機動車工程師學會)制定了OBD-II標準,實行標準檢測程序,而且具備嚴格的排放針對性,用於實時監測汽車尾氣排放狀況。

 

OBD-II標準診斷座

 

在CAN總線造成標準協議前,歐洲和大部分亞洲汽車採用ISO9141協議,美國通用汽車(GM)使用SAE J1850 VPW通信協議電路,福特(FORD)汽車則採用SAE J1850 PWM通信協議電路。能夠看出此前以KWP2000協議居多,KWP2000協議最初是基於K線的診斷協議,但因爲K線的物理層和數據鏈路層在網絡管理和通信數據上的侷限性,K線逐漸沒法知足日益複雜的車載診斷網絡的需求。而CAN總線因爲其非破壞性的網絡仲裁機制、較高的通信數據和靈活可靠的通信方式,在車載網絡廣受青睞,絕大多數車場目前都是採用CAN總線的方式。因此基於K線的KWP2000物理層和數據鏈路層的協議逐步被基於CAN線的KWP2000協議,也就是ISO15765協議所取代。

 

K線與CAN總線的比較

K線通訊速率較慢,最大達10.4 Kbit/s。此前有一款老款的寶馬車是115200bit/s的波特率,可是這種很是罕見。CAN線通訊速率可達到1 Mbit/s,其中以500 Kbit/s和250 Kbit/s爲主。在傳輸方面,K線採用單線傳輸的方式,以字節爲單位進行傳輸,CAN線則以差分信號傳輸的方式,以CAN幀爲單位進行傳輸。在出錯處理中,K線必需要由開發者,如tester,ECU等來完成相應的仲裁處理。而CAN線在物理層面具備完善的通訊錯誤處理機制和總線仲裁機制。報文長度方面,K線最大255個字節,CAN線則是4096字節(指數據域)。

 

物理層基於K線

對於OSI分層中的應用層,它的加強型的診斷是基於ISO 14230-3協議,此外還有一些由廠商自行進行定義。而與排放相關的診斷是基於ISO 15031-5協議。

ISO14230協議

 

KWP2000協議的數據結構由幀頭、數據字節和校驗和三部分組成。幀頭包括起始字節、原碼、目的地址和幀長。數據字節包括SourceID與有效字節,共255個字節,最後是累加校驗和。這三部分就組成了一幀的數據進行通信。

KWP2000協議因爲是以字節爲單位,因此會涉及到時間。從下圖中能夠看出它共有四個時間:Tester的字節時間,ECU 1與ECU 2的字節時間,以及ECU收到Tester以後的幀間隔時間。

 

通常狀況下,P4Tester的字節時間通常默認是20ms左右。P2表示ECU間隔Tester的時間,通常默認是50ms。ECU的P1字節時間默認也是20ms。假設Tester發送8個字節數據,ECU也回覆8個字節,P2的間隔時間是50ms,那麼得到一幀數據須要320ms的時間,這樣獲取汽車ECU的數據時間就比較長,效率比較低下。

 

物理層基於CAN線

基於CAN線的OSI分層結構,其加強型的診斷是基於ISO 14229-1協議與ISO 15765-3協議。而它的排放標準與K線相同,都是基於ISO 15031-5協議。

 

 

ISO 15765協議

 

汽車CAN總線概述

簡介

CAN總線最初並非用於功能開發,而是一種串行的通信方式,它有着很高的安全等級。特性:

  1. 報文可區分優先級,經過ID號進行區分;
  2. 保證延遲時間;
  3. 設置很是靈活;
  4. 時間同步的多點接收;
  5. 系統內數據的連貫性;
  6. 多主機(任何一個節點均可以當主機);
  7. 錯誤檢測和錯誤標定;
  8. 只要總線一處於空閒,它就將自動破壞的報文從新進行傳輸。
  9. 能夠將節點的暫時性錯誤和永久性錯誤區分開來。
差分信號採用雙角線CAN H和CAN L

 

汽車CAN總線網絡拓撲結構

從下圖總線中能夠看到,在總線中通常掛有不少的ECU,相關的ECU就近採集相關傳感器的數據,經過總線來進行傳輸,這樣就能夠大幅減小汽車整車的佈線。

 

 

報文傳輸

報文的傳輸中幀格式分爲11位識別符的標準幀與29位識別符的擴展幀。幀類型則分爲數據幀、遠程幀、錯誤幀和過載幀,這裏主要討論數據幀。

報文濾波的做用是經過設置硬件的濾波器從而過濾不須要被接受的CAN報文。汽車上的節點很是多,但對於每一個節點來說並非須要全部的數據。好比在ABS系統並不須要掌握髮動機的參數信息,此時就能夠經過設置濾波器而過濾掉這些數據,起到濾波器的做用。

數據幀由七個不一樣的位場組成:幀起始(Start of Frame)、仲裁場(Arbitration Frame)、控制場(Control Frame)、數據場(Data Frame)、CRC場(CRC Frame)、應答場(ACK Frame)、幀結尾(End of Frame)。仲裁幀能夠用來區分該幀是11位的標準幀仍是29位的擴展幀,以及是數據幀仍是遠程幀。

 

 

基於UDS的CAN總線ISO 15765協議

Network layer protocol data units

 

 

網絡層的ISO15765協議最多能夠發送或接收4096個字節。

從上圖中能夠看到PDU有四組數據類型,分別是單幀的SF N_PDU,首幀的FF N_PDU,連續幀的CF N_PDU和流體控制幀的FC N_PDU。

單幀第一個字節的高四位是0,低四位表示幀長,即這一幀有幾個字節的有效數據。

首幀第一個字節的高四位是1,第一個字節低四位與第二個字節一同組成幀長,因此最大的是4095個字節。

連續幀第一個字節的高四位是2,SN表示計數器。

流體控制幀第一個字節的高四位是3,低四位是FS(FlowStatus),當FS爲0的時候表示繼續發送,1表示等待,2則表示溢出。BS爲0表示ECU或Tester能夠持續回覆連續幀數據,BS值非0表示回覆連續幀的幀間隔之間能夠插入一幀流體控制幀。STmin能夠控制連續幀的幀間隔時間,當一些控制器速度達不到要求時,能夠經過控制連續幀的幀間隔時間,使其存儲到緩衝器中,進行處理。

 

CAN的UDS

基於CAN的UDS,就是基於ISO 14229-1協議。從下圖中能夠看到ISO 14229-1協議有不一樣的Service Id,能夠支持不一樣的服務需求。

好比10表示可進行Diagnoistic Session Control操做,11表示能夠對ECU進行Reset操做,27表示可進行Security Access操做等等。

此外還有一些sub-function,不一樣的sub-function支持不一樣的功能。好比說Security Access由兩幀組成,假設01表示是訪問seed,獲取種子,在獲取到種子以後發送,獲取到解析的種子協議再返還回去纔可以安全訪問。

22表示讀取數據信息,23表示可進行Memory By Address操做,19是讀取故障碼信息,14是清除故障碼信息,還能夠對ECU進行上傳、下傳數據等各類操做。

 

ISO 15031-5協議

基於排放標準的OBD協議,排放標準是ISO 15031協議共有七個章節,每一個章節定義不一樣的內容,主要是以第五章爲主。

 

排放標準的ISO 15031-5協議共有九個服務,不一樣的服務有不一樣的功能,在下圖均都描述。

 

 

 

咱們以Service$01: Request Current Powertrain Diagnostic data(請求動力系當前數據)來解析ISO 15031-5協議。

每個PID表示一個傳感器,也能夠說表示一個數據流,數據流既有狀態值,也有數據值。但並非全部的車都支持全部的PID。首先訪問00,若是ECU獲得的數據用bit的形式來表示,若是是1表示支持當前的PID,0則表示不支持當前的PID。

全部基於排放標準的ECU,均支持Service$01,即請求動力系當前數據的D00組數據,也就是說若是想獲取相關00組的數據,絕大部分車是支持的。

在獲取支持有效PID後,就能夠訪問實際的PID值,每一次能夠訪問六個PID。

 

 

上圖表示00組能夠支持01—20組的PID,20能夠支持21—40組的PID,以此類推。

 

上圖表示發送0100後ECU的回覆。回覆41+40,01+40或41表示當前請求動力系當前數據,00表示訪問PID獲取有效的PID。能夠看到第一個字節BF是1011111,即當前ECU支持PID的數據爲01及03—08,這7個PID數據,如下相似。

在獲取到有效的PID後,咱們須要進一步讀取當前PID的實際內容,每次最多能夠讀取六個PID值。15表示Bank 1 – Sensor 2,01表示當前的故障燈狀態及故障碼數量;05表示冷卻液溫度等等,如上圖所示。

 

回覆值的順序與初始發送的數據並不必定相同,可是會先發送PID的組號,再補充PID當前組號的實際內容。經過上圖能夠知道,41表示請求動力幀回覆;05表示冷卻液溫度;61表示冷卻液溫度的實際值,其餘相似。

15031-5協議的Mode 1

 

上圖爲Mode 01中PID的一部分。第一列表示PID的序號,後面有不一樣數據流內容的描述。好比第一個是前文提到的故障碼狀態與故障碼數量,PID2表示凍結的故障碼,第三個是Fuel system status。12表示發動機轉速,對於轉速的最小值、最大值、單位、公式都有具體的規定。

 

汽車診斷協議的獲取一般有三種方式獲取騎車診斷協議:

  1. ISO 15031-5,因爲目前全部車都支持ISO 15031-5協議,因此經過ISO 15031-5協議能夠獲取大部分的數據信息;
  2. 廠家原廠協議,適用於部分不在15031-5內,由廠家自行定義的協議;
  3. 第三方工具破解診斷協議。當拿不到原廠協議,須要獲取的信息也不在ISO 15031-5裏時,只能經過第三方工具進行破解,好比原廠診斷儀和綜合診斷儀等。

 

原廠診斷儀:日產Consult診斷儀、豐田GTS診斷儀、本田HDS診斷儀、大衆5053/5054診斷儀等。

綜合診斷儀廠家:元徵、金奔騰、朗仁、道通AUTEL、BOSCH等。

 

汽車診斷儀破解過程:

Step 1:

利用第3方工具採集實車診斷數據;

Step 2:

編寫汽車模擬程序,即模擬汽車ECU和汽車診斷工序進行通信;

Step 3:

破解診斷協議,目前基本上均爲手動破解;

Step 4:

編寫汽車診斷程序;

Step 5:

實車測試。

相關文章
相關標籤/搜索