您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“CAN通信數(shù)據(jù)怎么打包”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“CAN通信數(shù)據(jù)怎么打包”吧!
CAN通信基本介紹
在當(dāng)前的汽車產(chǎn)業(yè)中,出于對(duì)安全性、舒適性、方便性、低公害、低成本的要求,各種各樣的電子控制系統(tǒng)被開發(fā)了出來。由于這些系統(tǒng)之間通信所用的數(shù)據(jù)類型及對(duì)可靠性的要求不盡相同,由多條總線構(gòu)成的情況很多,線束的數(shù)量也隨之增加。為適應(yīng)“減少線束的數(shù)量”、“通過多個(gè) LAN,進(jìn)行大量數(shù)據(jù)的高速通信”的需要, 1986 年德國電氣商博世公司開發(fā)出面向汽車的 CAN 通信協(xié)議。此后, CAN 通過 ISO11898 及 ISO11519 進(jìn)行了標(biāo)準(zhǔn)化,現(xiàn)在在歐洲已是汽車網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。
現(xiàn)在, CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面。
所以由此可見CAN通信是一種應(yīng)用場景很廣且可靠的通信方式。
CAN通信協(xié)議有如下幾個(gè)特性:
1:多主控制??偩€空閑時(shí),所有單元都可發(fā)送消息,而兩個(gè)以上的單元同時(shí)開始發(fā)送消息時(shí),根據(jù)標(biāo)識(shí)符(ID,非地址)決定優(yōu)先級(jí)。兩個(gè)以上的單元同時(shí)開始發(fā)送消息時(shí),對(duì)各消息ID 的每個(gè)位進(jìn)行逐個(gè)仲裁比較。仲裁獲勝(優(yōu)先級(jí)最高)的單元可繼續(xù)發(fā)送消息,仲裁失利的單元?jiǎng)t立刻停止發(fā)送而進(jìn)行接收工作。
2:系統(tǒng)柔軟性。連接總線的單元,沒有類似“地址”的信息,因此,在總線上添加單元時(shí),已連接的其他單元的軟硬件和應(yīng)用層都不需要做改變。
3:速度快,距離遠(yuǎn)。最高1Mbps(距離<40M),最遠(yuǎn)可達(dá)10KM(速率<5Kbps)。
4:具有錯(cuò)誤檢測(cè)、錯(cuò)誤通知和錯(cuò)誤恢復(fù)功能。所有單元都可以檢測(cè)錯(cuò)誤(錯(cuò)誤檢測(cè)功能),檢測(cè)出錯(cuò)誤的單元會(huì)立即同時(shí)通知其他所有單元(錯(cuò)誤通知功能),正在發(fā)送消息的單元一旦檢測(cè)出錯(cuò)誤,會(huì)強(qiáng)制結(jié)束當(dāng)前的發(fā)送。強(qiáng)制結(jié)束發(fā)送的單元會(huì)不斷反復(fù)地重新發(fā)送此消息直到成功發(fā)送為止(錯(cuò)誤恢復(fù)功能)。
我們可以提幾個(gè)問題:
問題一:CAN通信的數(shù)據(jù)是如何打包的?
我們知道,不論是對(duì)設(shè)備發(fā)送指令還是傳輸數(shù)據(jù),都需要按照一定的協(xié)議來將數(shù)據(jù)進(jìn)行打包發(fā)送。
can通信對(duì)數(shù)據(jù)也是按照一定協(xié)議進(jìn)行打包的,打包好的數(shù)據(jù)包稱作"幀"。按照打包的不同格式,數(shù)據(jù)幀可以分為五種:
而各個(gè)數(shù)據(jù)幀的打包格式是需要重點(diǎn)了解的,希望大家好好研究《can入門教程》,上面五個(gè)幀中,比較常用且重要的就是數(shù)據(jù)幀和遙控幀了,
看名字我們便知道,數(shù)據(jù)幀用于向某一設(shè)備發(fā)送數(shù)據(jù);遙控幀則是某一設(shè)備向另一設(shè)備發(fā)送遙控幀后,另一設(shè)備會(huì)返回該設(shè)備所想要的值。而數(shù)據(jù)幀與遙控幀除了一些打包時(shí)的細(xì)節(jié)之處,最大的區(qū)別便在于數(shù)據(jù)幀有數(shù)據(jù)段,而遙控幀沒有(特殊的數(shù)據(jù)幀也可以沒有數(shù)據(jù)段,即數(shù)據(jù)段為空)。
STM32如何打包數(shù)據(jù)幀呢?正點(diǎn)原子的庫函數(shù)里為我們定義了一個(gè)結(jié)構(gòu)體:
該結(jié)構(gòu)體為CAN通信發(fā)送數(shù)據(jù)結(jié)構(gòu)體,我們只需要用此結(jié)構(gòu)體定義一個(gè)結(jié)構(gòu)體變量,并初始化結(jié)構(gòu)體的各個(gè)成員,然后就可以通過一個(gè)32的一個(gè)庫函數(shù)CAN_Transmit(CAN1, &TxMessage);進(jìn)行發(fā)送了。
對(duì)于上面結(jié)構(gòu)體的各個(gè)成員的意義,我們便不多解釋了,只要看過一遍CAN通信相關(guān)協(xié)議介紹的,都可以大致明白。
具體如何發(fā)送的呢?在原子哥的例程里給了我們這樣一個(gè)用戶自定義函數(shù):
1處:該函數(shù)定義了一個(gè)變量,其實(shí)是用來存儲(chǔ)發(fā)送數(shù)據(jù)的郵箱號(hào)的,在STM32的配置中,一個(gè)CAN接口配備了三個(gè)郵箱,發(fā)送數(shù)據(jù)時(shí),4處的發(fā)送庫函數(shù)會(huì)自動(dòng)選擇一個(gè)空的郵箱進(jìn)行發(fā)送數(shù)據(jù)并返回該郵箱的郵箱號(hào),而變量mbox就是用來存放發(fā)送數(shù)據(jù)的郵箱號(hào)的,方便5處進(jìn)行標(biāo)志位的判斷。
2處:定義了一個(gè)發(fā)送數(shù)據(jù)包的結(jié)構(gòu)體變量。
3處:對(duì)該數(shù)據(jù)包的內(nèi)容進(jìn)行了初始化,其內(nèi)容可以由我們自行設(shè)置。
4處:調(diào)用庫函數(shù)將該數(shù)據(jù)幀(或者遙控幀)發(fā)送出去。
5處:進(jìn)行標(biāo)志位的判斷,等待發(fā)送結(jié)束。
而在實(shí)際應(yīng)用中,我們CAN總線上會(huì)掛載很多設(shè)備,我們可以定義很多個(gè)類似上圖函數(shù)一樣的自定義函數(shù),來實(shí)現(xiàn)我們對(duì)不同設(shè)備的數(shù)據(jù)發(fā)送。當(dāng)然也可以寫一個(gè)通用的發(fā)送數(shù)據(jù)函數(shù),而把結(jié)構(gòu)體的定義,初始化部分提出來單獨(dú)定義??傊梢愿鶕?jù)需要靈活變通了。
問題二:CAN通信如何初始化配置?
CAN通信的初始化分為四個(gè)部分:
步驟一:初始化GPIO
這步就不多說了,通過查找CAN接口對(duì)應(yīng)的引腳然后進(jìn)行初始化,都是常規(guī)操作。
步驟二:配置CAN中斷
CAN的中斷由發(fā)送中斷,接收FIFO中斷和錯(cuò)誤中斷構(gòu)成。發(fā)送中斷由三個(gè)發(fā)送郵箱任意一個(gè)為空的事件構(gòu)成。接收FIFO中斷分為FIFO0和FIFO1的中斷,接收FIFO收到心得報(bào)文或報(bào)文溢出的事件可以引起中斷。原子哥的例程使用的是RX0中斷通道即FIFO0中斷通道,當(dāng)FIFO0收到新報(bào)文時(shí),引起中斷。我們就在相應(yīng)的中斷函數(shù)中讀取這個(gè)新報(bào)文。中斷函數(shù)如下:
原子哥的這個(gè)程序僅將接收到的函數(shù)存入到一個(gè)結(jié)構(gòu)體變量中,并將該結(jié)構(gòu)體變量中的數(shù)據(jù)部分進(jìn)行打印。但實(shí)際應(yīng)用中,我們可以對(duì)ID號(hào)或者數(shù)據(jù)部分進(jìn)行判斷,進(jìn)而執(zhí)行相應(yīng)的操作,如下圖程序:
步驟三:配置CAN模式
關(guān)于CAN模式配置,這里就不多說了,下圖來自《STM32庫函數(shù)開發(fā)指南》,實(shí)際應(yīng)用中,其實(shí)復(fù)制粘貼原子哥例程中的那一段配置源碼大部分時(shí)候就可以了。
步驟四:CAN過濾器的配置
根據(jù)前文,我們?cè)诎l(fā)送數(shù)據(jù)幀時(shí),總需要將ID號(hào)打包進(jìn)去。在CAN通信協(xié)議中,ID號(hào)的作用有以下幾點(diǎn):
作為數(shù)據(jù)發(fā)送的優(yōu)先級(jí)判斷,優(yōu)先級(jí)高的先發(fā)送
作為接收?qǐng)?bào)文的篩選,也就是此處的CAN過濾器的配置
用作標(biāo)識(shí)符的識(shí)別,如果系統(tǒng)中的所有ID號(hào)設(shè)置都不一樣的話,我們便可以將ID號(hào)當(dāng)作一種標(biāo)識(shí)符進(jìn)行識(shí)別判斷
變相的識(shí)別"設(shè)備地址",該作用在下個(gè)問題中解釋。
STM32的ID過濾方式有兩種。一種為標(biāo)識(shí)符列表模式。一種為標(biāo)識(shí)符屏蔽模式。
配置結(jié)構(gòu)體:
問題三:CAN通信如何確定接收數(shù)據(jù)對(duì)象的地址?
在485通信中,我們需要自己軟件定義一個(gè)虛擬地址;SPI通信中我們靠片選信號(hào)線來選中從設(shè)備;I2C通信中我們從機(jī)有固定的硬件地址。那CAN通信如何實(shí)現(xiàn)地址的確定呢?
其實(shí)CAN通信不存在設(shè)備地址這個(gè)概念,它通過我們上個(gè)問題中數(shù)據(jù)幀初始化的ID號(hào)進(jìn)行辨別。在總線上每個(gè)設(shè)備都會(huì)有一個(gè)ID過濾器(上個(gè)問題步驟四),每當(dāng)發(fā)送一個(gè)數(shù)據(jù)幀后,該數(shù)據(jù)幀經(jīng)過每個(gè)設(shè)備的ID過濾器過濾后,只能傳入某幾個(gè)或一個(gè)設(shè)備內(nèi),然后該設(shè)備將會(huì)根據(jù)數(shù)據(jù)幀的內(nèi)容進(jìn)行一定的反應(yīng)。從而實(shí)現(xiàn)精準(zhǔn)的數(shù)據(jù)傳輸。
問題四:CAN通信如何解決的時(shí)序問題?
在我們之前學(xué)過的通信中都會(huì)有一個(gè)時(shí)鐘線來同步信息的發(fā)送,但CAN只有兩個(gè)差分信號(hào)線。那它如何解決時(shí)序問題呢?
CAN通信采用的是一種位時(shí)序的分解的方法,這對(duì)我們使用CAN通信并沒有太大的影響,所以大家可以去研讀《can入門教程》,這里便一筆帶過了。
CAN通信硬件連接
從CAN的通信網(wǎng)絡(luò)圖可以看到,它的通信節(jié)點(diǎn)是由一個(gè)CAN控制器,一個(gè)CAN收發(fā)器組成,STM32的CAN接口即為CAN控制器,為構(gòu)成完整的節(jié)點(diǎn),還要給它外接一個(gè)CAN收發(fā)器。
在發(fā)送數(shù)據(jù)時(shí),CAN控制器把要發(fā)送的二進(jìn)制編碼通過CAN_TX線發(fā)送到CAN收發(fā)器,然后由收發(fā)器把這個(gè)普通的邏輯電平信號(hào)轉(zhuǎn)化成差分信號(hào),通過差分線CAN_High和CAN_Low線輸出到CAN總線網(wǎng)絡(luò)。在接收數(shù)據(jù)時(shí),與這個(gè)過程相反。
到此,相信大家對(duì)“CAN通信數(shù)據(jù)怎么打包”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。