CAN總線是汽車電子工程師必備基礎(chǔ)知識,如今街上跑的每臺車幾乎都應(yīng)用了CAN總線通信協(xié)議,那什么是CAN總線?它又是如何聯(lián)系汽車上各個電子控制單元的?汽車電子工程師又是如何設(shè)計開發(fā)CAN通信的?下面我們一一道來。
為了大家閱讀有所側(cè)重,以下內(nèi)容用★號做了標(biāo)識:
★★★★★表示汽車電子工程師必須熟悉的
★★★★表示汽車電子工程師推薦了解的
★★★及以下表示專門從事CAN總線開發(fā)的工程師需要知道的
什么是CAN總線?★★★★★
CAN( Area )是二十世紀(jì)八十年代初德國Bosch公司為解決現(xiàn)代汽車中眾多電控單元(ECU)之間的數(shù)據(jù)交換而開發(fā)的一種多主機(jī)局部網(wǎng)絡(luò)串行通信協(xié)議。
1983年 由Bosch和Intel共同開發(fā)
1987年 第一塊CAN控制器芯片(Intel)
1990年 第一輛應(yīng)用CAN的量產(chǎn)車: S-Class
1991年 CAN 2.0發(fā)布(PART A 與 PART B)
1993年 CAN成為ISO標(biāo)準(zhǔn)(ISO 11898)
很多同學(xué)一看這名字就暈了,其實可以簡單把CAN通信理解成開一場電話會議,當(dāng)一個人講話時其他人就聽(廣播),當(dāng)多個人同時講話時則根據(jù)一定規(guī)則來決定誰先講話誰后講話(仲裁),這就好比會議中你和領(lǐng)導(dǎo)同時講話,你肯定會很識趣地讓領(lǐng)導(dǎo)先講。
但值得注意的是,在這場會議中,講話人會確認(rèn)聽話人是否成功接收信息,如果說話人傳遞的信息有誤,聽話人會及時指出錯誤。
CAN總線有哪些優(yōu)勢?★★★★★
隨著通信技術(shù)的發(fā)展,現(xiàn)今通信方式和協(xié)議五花八門,但CAN通信仍然是車載網(wǎng)絡(luò)最安全可靠且應(yīng)用最廣的技術(shù)之一。
過去,汽車通常采用常規(guī)的點(diǎn)對點(diǎn)通信方式將電子控制單元及電子裝置連接起來,但隨著電子設(shè)備的不斷增加,導(dǎo)線數(shù)量也隨之增多,采用CAN總線網(wǎng)絡(luò)結(jié)構(gòu),可以達(dá)到信息共享、減少布線、降低成本以及提高總體可靠性的目標(biāo)。
總的來說CAN總線有以下幾點(diǎn)優(yōu)勢:
① 數(shù)據(jù)傳輸速度相對較高,可達(dá)到1 Mbit/s。(CAN-FD和CAN-XL分別可以達(dá)到2 Mbit/s和10 Mbit/s。)
② 采用差分?jǐn)?shù)據(jù)線,抗干擾能力強(qiáng);
③多主通信模式,大幅減少單點(diǎn)通信線束成本;
④具有錯誤偵聽的自我診斷功能,通信可靠信較高。
CAN總線原理及工作機(jī)制是怎樣的?★★★★★
這一部分內(nèi)容比較多,建議小伙伴們沉下心來閱讀。
(1)CAN通信硬件基礎(chǔ):接口電路
CAN總線節(jié)點(diǎn)有兩種硬件構(gòu)成方案:
① MCU控制器 + 獨(dú)立CAN控制器 + CAN收發(fā)器。(獨(dú)立CAN控制器如NXP半導(dǎo)體的等)使用獨(dú)立CAN控制器程序復(fù)用移植性較好,但占用主控芯片I/O資源。
② 集成CAN控制器的MCU + CAN收發(fā)器。(集成CAN控制器的單片機(jī)如NXP半導(dǎo)體的等)該方案程序復(fù)用性不佳,有很強(qiáng)針對性,但可以使電路更加簡單。
如下圖完整的CAN接口電路包括接收發(fā)送CAN報文的CAN控制器,轉(zhuǎn)換數(shù)字信號和CAN信號的CAN收發(fā)器,消除噪聲的濾波器以及提供合適阻抗的CAN高和CAN低終端電路。
(2)CAN通信機(jī)制:
電信號的傳輸在物理層面都是靠電壓高低區(qū)分來實現(xiàn)的,CAN通信也不例外。CAN總線使用雙絞線進(jìn)行差分電壓傳輸,兩條信號線被稱為CAN高(CAN_H)和CAN低(CAN_L)。
兩條線靜態(tài)時均為2.5V左右,此時狀態(tài)表示為邏輯1,也被稱作隱性。當(dāng)兩條線電壓值出現(xiàn)差異時,通常CAN_H=3.5V和CAN_L=1.5V,此時狀態(tài)表示為邏輯0,也稱作顯性。即:
差分電壓 = 0V,表示邏輯“1”,為隱性;
差分電壓 = 2V,表示邏輯“0”,為顯性;
注:實際開發(fā)中兩條線的電壓都會在標(biāo)準(zhǔn)值上下附近波動,這也是用差分傳輸?shù)暮锰帲瑴p少誤差和噪聲帶來的干擾。
顯性電平用邏輯“0”表示,隱性電平用邏輯“1”表示,這里可能有小伙伴會問為什么“0”是顯性,感官上不應(yīng)該這樣規(guī)定啊?其實這是因為CAN總線采用“線與”規(guī)則進(jìn)行沖突仲裁,即當(dāng)多個CAN信號同時發(fā)送時,有的發(fā)1有的發(fā)0,而只要有0,當(dāng)前總線就是0(1&0 = 0),看上去就是1被0覆蓋了。另一方面,從電位看,高電位為0,當(dāng)1和0同時發(fā)送時,總線處于高電位,顯現(xiàn)出來的是0,所以把0規(guī)定為顯性。
下面我再來說說CAN消息幀(報文)是怎么實現(xiàn)信息交換的。一般書本教材都是先講CAN報文的格式再去談應(yīng)用,但這對于強(qiáng)調(diào)應(yīng)用的工程技術(shù)人員并不友好,所以我們反著來講,先看下在車輛開發(fā)中ECU報文都是如何傳遞有用信息的,開發(fā)工程師常接觸的知識點(diǎn)有哪些。
拿發(fā)動機(jī)控制單元EMS的一條報文舉例,我們要知道哪些關(guān)鍵信息?
這條報文的名稱為,ID為0x100,報文發(fā)送周期是10ms,報文長度為8個byte。上表定義了兩個典型信號:
一個信號為發(fā)動機(jī)轉(zhuǎn)速,數(shù)據(jù)長度8bit,那這8bit如果按照二進(jìn)制與十進(jìn)制單純轉(zhuǎn)換,只能表示 2^{8}-1=255 ,但這遠(yuǎn)遠(yuǎn)不能覆蓋實際發(fā)動機(jī)高達(dá)幾千的轉(zhuǎn)速,所以工程師們想了個辦法can線基本通訊原理圖,讓二進(jìn)制轉(zhuǎn)換來的數(shù)乘上系數(shù)再加上偏置數(shù)來表達(dá)實際值,如例子里面轉(zhuǎn)速范圍為0~7650,這個最大值7650就是 255\ 得來的。
第一個信號是表示數(shù)值,另外一個信號則是常用的標(biāo)志位信號,通常來反映系統(tǒng)所處的狀態(tài)。例子中的表示發(fā)動機(jī)控制單元是否出現(xiàn)錯誤,只占1bit,也就是只有兩個狀態(tài),0b表示運(yùn)行正常,1b表示出現(xiàn)錯誤。
是不是大概理解報文里面工程應(yīng)用的一些關(guān)鍵信息了?那還有沒提到的報文起始字節(jié)和數(shù)據(jù)起始字節(jié)又如何理解?我們先來看一張圖:
這個是汽車電子工程師常用工具CANoe里面報文的一張截圖,關(guān)于CANoe的使用及仿真編程在后面的文章會詳細(xì)介紹,我們先看看這個圖怎么看。第一列從0到7分別表示一幀消息8個byte從低到高的位置,0就是第0個byte,7就是第7個byte,這里要注意第一個byte位置記為0。
第一行從7到0分別表示byte[0]的信號從高到低排列,7就是第7個bit,0就是第0個bit,這里同樣要注意最低位為bit[0]。所以說來說去,CAN報文和所有信號傳輸一樣都是靠0和1組合起來的信息,經(jīng)過一定的CAN協(xié)議就能轉(zhuǎn)換成我們想要的結(jié)果。
說到這里,大家應(yīng)該對整車開發(fā)常用的CAN報文格式有了粗略的印象,但是CAN報文在傳輸中可不只是這8個byte總共64bit在雙絞線上跑,這8個byte只是具有實際工程意義的數(shù)據(jù)場信號,整車幾十個ECU彼此之間要準(zhǔn)確無誤的發(fā)送接收消息則要遵循一定的規(guī)則。
CAN消息幀格式★★★★
相互通信的ECU要想彼此收發(fā)消息,需要使用相同的CAN報文格式,這就好比兩個不同母語的人要對話必須講同一種語言才行,不然就是雞同鴨講了。目前主要有CAN2.0A和CAN2.0B兩種技術(shù)規(guī)范。
CAN2.0A規(guī)定了11位標(biāo)識符的標(biāo)準(zhǔn)幀格式,CAN2.0B在此基礎(chǔ)上又增加了一種具有29位標(biāo)識符的擴(kuò)展幀格式。
CAN消息幀根據(jù)用途不同分為四種類型:數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀、超載幀。
(1)數(shù)據(jù)幀:用于傳送數(shù)據(jù)
幀起始:標(biāo)志一個數(shù)據(jù)幀的開始,僅由一個顯性位構(gòu)成,只有在總線空閑期間才能夠發(fā)送。
仲裁場:在標(biāo)準(zhǔn)幀中,仲裁場由11位標(biāo)識符和RTR位組成;在擴(kuò)展幀中,仲裁場由29位標(biāo)識符、SRR位、IDE位和RTR位組成。
ID(標(biāo)識符)是用來確定一條報文,表明報文含義及優(yōu)先級,如上面舉例的0x100。
RTR(遠(yuǎn)程傳送請求位),數(shù)據(jù)幀RTR位必須為顯性電平(RTR=0),遠(yuǎn)程幀RTR位必須為隱性電平(RTR=1)。
IDE(標(biāo)識符擴(kuò)展位)在標(biāo)準(zhǔn)幀屬于控制場,在擴(kuò)展幀中屬于仲裁場。在標(biāo)準(zhǔn)幀中IDE為顯性電平(IDE=0),在擴(kuò)展幀中IDE為隱性電平(IDE=1)
SRR(遠(yuǎn)程代替請求位)在擴(kuò)展幀中始終為隱性電平(SRR=1)
控制場:由6位組成。在標(biāo)準(zhǔn)幀中,控制場包括IDE(此時為顯性電平0)、保留位r(此時為顯性電平0)以及占4個bit的數(shù)據(jù)場長度碼DLC。在擴(kuò)展幀中,控制場沒有IDE位,而是兩個保留位r0和r1,此時同樣均為顯性電平0。
數(shù)據(jù)場:包含CAN數(shù)據(jù)幀發(fā)送的數(shù)據(jù),0~8個byte,如上面舉例的主要信息就是圍繞數(shù)據(jù)場來說明的can線基本通訊原理圖,這也是整車電子工程師討論得最多的一部分內(nèi)容,如果你不是專門的CAN設(shè)計工程師,其他的格式內(nèi)容僅作了解即可。
CRC場:包括CRC序列CRC界定符DEL,CRC校驗是為了通信雙方的安全可靠性制定的”暗號“,只有發(fā)送方根據(jù)發(fā)送信息計算的CRC值與接收方根據(jù)接收信息計算的CRC值對上,才能判斷這次通信成功了,否則就會報錯。
應(yīng)答場:包括2位,應(yīng)答間隙(ACK)和應(yīng)答界定符(DEL)。發(fā)送節(jié)點(diǎn)發(fā)出的報文中ACK及DEL均為隱性電平1,接收節(jié)點(diǎn)正確接收后會用顯性電平0覆蓋隱性電平,以表示正確接收。總結(jié)說就是,正確接收ACK=0,DEL=1;未正確接收ACK=DEL=1。
幀結(jié)束:7個連續(xù)的隱性位,表示數(shù)據(jù)幀結(jié)束。節(jié)點(diǎn)在檢測到11個連續(xù)的隱性位后認(rèn)為總線空閑。
(2)遠(yuǎn)程幀:向其他節(jié)點(diǎn)請求發(fā)送具有同一標(biāo)識符的數(shù)據(jù)幀,遠(yuǎn)程幀沒有數(shù)據(jù)場,且RTR位為隱性電平。
(3)錯誤幀:當(dāng)節(jié)點(diǎn)監(jiān)測到一個或多個由CAN標(biāo)準(zhǔn)所定義的錯誤時,就會產(chǎn)生一個錯誤幀。錯誤幀由錯誤標(biāo)志和錯誤界定符兩個部分組成。
錯誤標(biāo)志分為主動錯誤標(biāo)志和被動錯誤標(biāo)志:
什么時候發(fā)帶有主動錯誤標(biāo)志的錯誤幀?什么時候發(fā)帶有被動錯誤標(biāo)志的錯誤幀?這里我們先要說下節(jié)點(diǎn)的錯誤狀態(tài)。
節(jié)點(diǎn)的錯誤狀態(tài)有三種,主動錯誤狀態(tài)、被動錯誤狀態(tài)、總線關(guān)閉狀態(tài)。
主動錯誤狀態(tài):節(jié)點(diǎn)處于主動錯誤狀態(tài)可以正常通信,處于主動錯誤狀態(tài)的節(jié)點(diǎn)(可能是接收節(jié)點(diǎn)也可能是發(fā)送節(jié)點(diǎn))在檢測出錯誤時,發(fā)出主動錯誤標(biāo)志。
被動錯誤狀態(tài):節(jié)點(diǎn)處于被動錯誤狀態(tài)可以正常通信,處于被動錯誤狀態(tài)的節(jié)點(diǎn)(可能是接收節(jié)點(diǎn)也可能是發(fā)送節(jié)點(diǎn))在檢測出錯誤時,發(fā)出被動錯誤標(biāo)志。
總線關(guān)閉狀態(tài):節(jié)點(diǎn)處于總線關(guān)閉狀態(tài)不能收發(fā)報文,只能一直等待,在滿足一定條件時才能再次進(jìn)入到主動錯誤狀態(tài)正常收發(fā)報文。
一個CAN節(jié)點(diǎn)在什么情況下處于主動錯誤狀態(tài),什么情況下處于被動錯誤狀態(tài)?根據(jù)CAN協(xié)議的規(guī)定,CAN節(jié)點(diǎn)內(nèi)有兩個計數(shù)器:發(fā)送錯誤計數(shù)器TEC和接收錯誤計數(shù)器REC,CAN節(jié)點(diǎn)就是根據(jù)這兩個計數(shù)器值得大小來判斷處于什么狀態(tài)的。
CAN總線錯誤分類:
CAN節(jié)點(diǎn)計數(shù)器如何計數(shù):
(4)超載幀:超載幀用于在先前和后續(xù)的數(shù)據(jù)幀(或遠(yuǎn)程幀)之間提供一附加延時,超載標(biāo)志由6個顯性位組成,超載界定符由8個連續(xù)的隱性位組成。
CAN總線非破壞性仲裁★★★★★
在CAN總線上發(fā)送的每一條報文都具有唯一的一個11位或29位數(shù)字的ID,當(dāng)節(jié)點(diǎn)同時發(fā)送報文時CAN總線將按”線與“機(jī)制對ID的每一位進(jìn)行判斷,當(dāng)有一個節(jié)點(diǎn)發(fā)送0則總線的狀態(tài)就是0,所以ID的值越小優(yōu)先級就越高,這也是為什么在整車上越重要的報文ID值越小。
如下圖節(jié)點(diǎn)1,2,3同時發(fā)送報文,依次對比ID的每一位,節(jié)點(diǎn)3的ID值最小,最終取得了CAN總線的控制權(quán)。
CAN總線位填充機(jī)制★★★
CAN總線采用多種抗干擾措施以減少消息幀在傳送過程中出錯,位填充技術(shù)是其中很重要的一種。CAN總線規(guī)定信號的跳變沿即為同步信號,所以只要信號發(fā)生變化了,節(jié)點(diǎn)時鐘就會被同步。但如果有連續(xù)相同的信號發(fā)送,沒有跳變發(fā)生,則有可能出現(xiàn)發(fā)送接收節(jié)點(diǎn)不同步,從而導(dǎo)致信號異常。所以當(dāng)檢測到5個連續(xù)相同的位信號時,實際發(fā)送會自動插入一個補(bǔ)碼發(fā)送,然后再接著發(fā)送原有信號。
SOF之前的總線空閑區(qū)域,不需要同步,無需進(jìn)行位填充。CRC之后的位域都是固定格式,不允許位填充操作。
下圖舉例說明了位填充機(jī)制具體是如何操作的,值得注意的是第二個填充位也被包含到了5個連續(xù)相同位的計數(shù)中,因為填充位同樣是被當(dāng)成總線數(shù)據(jù)位處理的。
CAN總線位時序及同步★★★
位定時是指CAN總線上一個數(shù)據(jù)位的持續(xù)時間,主要用于CAN總線上各節(jié)點(diǎn)的通信波特率設(shè)置,同一總線上的通信波特率必須相同。
正常的位時間=1/波特率。(比如1Mbit/s波特率,一個位的發(fā)送時間就是1微秒)
位時間可以分為以下四段:
CAN通信數(shù)據(jù)流中不包含時鐘信息,CAN總線規(guī)范中定義的同步保證報文可以不管節(jié)點(diǎn)間積累的相位誤差正確地譯碼。
CAN的同步方式包括硬同步和重同步兩種:
硬同步發(fā)生在SOF位,所有接收節(jié)點(diǎn)調(diào)整各自當(dāng)前位的同步段,調(diào)整寬度不限。
發(fā)送節(jié)點(diǎn)在發(fā)送SOF位時,SOF位的下降沿在同步(SS)段,這個時候接收節(jié)點(diǎn)發(fā)現(xiàn)自己當(dāng)前位的SS段和發(fā)送節(jié)點(diǎn)SOF位的同步SS段不同步,于是接收強(qiáng)行將自己當(dāng)前位的SS段拉到與SOF位的SS段同步。
重同步發(fā)生在一個報文SOF位之外的其他位場內(nèi),當(dāng)接收節(jié)點(diǎn)當(dāng)前位的下降沿落在了發(fā)送節(jié)點(diǎn)當(dāng)前位的同步段之外時發(fā)生重同步。
發(fā)得晚,收得早,會導(dǎo)致相位緩沖段1延長。發(fā)送節(jié)點(diǎn)當(dāng)前位的SS段產(chǎn)生的時候,接收節(jié)點(diǎn)當(dāng)前位的SS段已經(jīng)早于它產(chǎn)生了,此時接收節(jié)點(diǎn)就要延長一段時間與的采樣點(diǎn)進(jìn)行同步。
發(fā)得早,收得晚,會導(dǎo)致相位緩沖段2縮短。發(fā)送節(jié)點(diǎn)當(dāng)前位的SS段產(chǎn)生時間早于接收節(jié)點(diǎn)的當(dāng)前位SS段產(chǎn)生時間,此時接收節(jié)點(diǎn)要縮短相位緩沖段2,以保證兩者采樣點(diǎn)同步。
到這里,常用的CAN通信原理就介紹完了,希望對各位有所幫助。
參考:
恒潤科技-CAN基礎(chǔ).PDF
2. 恒潤科技-CAN總線快速入門.PDF
3.《汽車CAN總線系統(tǒng)原理、設(shè)計與應(yīng)用》 羅峰 孫澤昌 著
4.《CAN總線嵌入式開發(fā)從入門到實戰(zhàn)》 牛躍聽 周立功 方丹 等編著
5.《CAN入門》 瑞薩
6. CAN總線學(xué)習(xí)筆記(1)~(5) CSDN站點(diǎn)
********************************
打包了一些CAN通信相關(guān)的資料,需要的同學(xué)可以關(guān)注下公眾號回復(fù)”CAN通信“獲取,喜歡文章的話也請一鍵三連,謝謝咯!O(∩_∩)O~~