基于CAN總線(xiàn)通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1 前言
控制器局域網(wǎng)(CAN-Controller Area Network)屬于現(xiàn)場(chǎng)總線(xiàn)(Fieldbus)的范疇,是眾多的屬于現(xiàn)場(chǎng)總線(xiàn)標(biāo)準(zhǔn)之一,它適用于工業(yè)控制系統(tǒng),具有通信速率高、可靠性強(qiáng)、連接方便、性能價(jià)格比高等諸多特點(diǎn)。它是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò),以其短報(bào)文幀及CSMA/CD-AMP(帶有信息優(yōu)先權(quán)及沖突檢測(cè)的載波監(jiān)聽(tīng)多路訪問(wèn))的MAC(媒介訪問(wèn)控制)方式而倍受工業(yè)自動(dòng)化領(lǐng)域中設(shè)備互連的厚愛(ài)。CAN的應(yīng)用范圍遍及從高速網(wǎng)絡(luò)到低成本的多線(xiàn)路網(wǎng)絡(luò),它可以應(yīng)用于汽車(chē)系統(tǒng)、機(jī)械、技術(shù)設(shè)備和工業(yè)自動(dòng)化里幾乎任何類(lèi)型的數(shù)據(jù)通信。CAN具有如一下優(yōu)點(diǎn):
1)使用簡(jiǎn)單方便。許多CAN控制器實(shí)現(xiàn)了CAN物理層及數(shù)據(jù)鏈路層的大部分功能,用戶(hù)只須對(duì)CAN控制器進(jìn)行初始化和對(duì)CAN總線(xiàn)上的數(shù)據(jù)進(jìn)行收發(fā)操作即可實(shí)現(xiàn)通信;
2)高可靠性。CAN上的最大通信速率可達(dá)1Mbps,CAN總線(xiàn)是多主節(jié)點(diǎn),各節(jié)點(diǎn)通過(guò)總線(xiàn)仲裁獲得總線(xiàn)控制權(quán)。完善的錯(cuò)誤處理機(jī)制保證了高噪聲干擾環(huán)境下數(shù)據(jù)傳送的安全可靠;
3)系統(tǒng)可擴(kuò)展性能好。CAN總線(xiàn)是基于發(fā)送報(bào)文的編碼,而不是對(duì)CAN控制節(jié)點(diǎn)進(jìn)行編碼,故增添或刪除CAN節(jié)點(diǎn)不會(huì)對(duì)系統(tǒng)造成太大的影響。
CAN總線(xiàn)以報(bào)文為單位進(jìn)行信息傳送,它支持4種不同類(lèi)型的報(bào)文幀:數(shù)據(jù)幀、遠(yuǎn)程幀、超載幀和錯(cuò)誤幀。報(bào)文中包含信息標(biāo)識(shí)符ID,它標(biāo)志了報(bào)文的優(yōu)先權(quán)。CAN總線(xiàn)上各個(gè)節(jié)點(diǎn)都可主動(dòng)發(fā)送,總線(xiàn)上的報(bào)文采用標(biāo)識(shí)符ID進(jìn)行仲裁,ID值越小,優(yōu)先級(jí)越高。具有最高優(yōu)先權(quán)報(bào)文的節(jié)點(diǎn)贏得總線(xiàn)使用權(quán),而其它節(jié)點(diǎn)自動(dòng)停比發(fā)送。在總線(xiàn)再次空閑后,這些節(jié)點(diǎn)將自動(dòng)重發(fā)原報(bào)文。網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都可由ID來(lái)自動(dòng)決定是否接收該報(bào)文。每個(gè)節(jié)點(diǎn)都有ID寄存器和屏蔽寄存器接收到的報(bào)文只有與該屏蔽的功能相同時(shí),該節(jié)點(diǎn)才開(kāi)始正式接收?qǐng)?bào)文,否則它將不理睬ID后面的報(bào)文。這使CAN系統(tǒng)非常靈活,可任意擴(kuò)展或改變網(wǎng)絡(luò)組成。
C8051F系列單片機(jī)是集成的混合信號(hào)片上系統(tǒng)SOC(System on chip),具有與MCS-51內(nèi)核及指令集完全兼容的微控制器,除具有標(biāo)準(zhǔn)8051的數(shù)字外設(shè)部件之外,片內(nèi)還集成數(shù)據(jù)采集和控制系統(tǒng)中常用的模擬部件和其它數(shù)字外設(shè)及功能部件。正是由于其體積小、集成度高、功能多、配置容易、使用方便等特點(diǎn),已被廣泛應(yīng)用于智能儀表、數(shù)據(jù)采集、自動(dòng)化控制等領(lǐng)域。因此本文采用C8051F120設(shè)計(jì)與實(shí)現(xiàn)CAN總線(xiàn)通信協(xié)議,充分發(fā)揮其體積小、可靠性高的特點(diǎn)。C8051F120是完全集成的混合信號(hào)片上系統(tǒng)MCU芯片,具有64個(gè)數(shù)字I/O引腳(100腳TQFP封裝)。
2 數(shù)據(jù)傳輸格式的制定
在CAN2.0規(guī)范中規(guī)定,每次收發(fā)最多只能傳送8字節(jié).這可以滿(mǎn)足大多數(shù)工業(yè)領(lǐng)域中控制命令、工控狀態(tài)和測(cè)試數(shù)據(jù)的一般要求;但實(shí)際應(yīng)用中,往往出現(xiàn)傳送多于8字節(jié)的要求,此時(shí)應(yīng)通過(guò)報(bào)文的拆卸和拼接技術(shù)予以實(shí)現(xiàn)。本文在CAN2.0A的基礎(chǔ)上,定義了簡(jiǎn)單的傳輸格式,完成了單幀數(shù)據(jù)和多幀數(shù)據(jù)準(zhǔn)確快捷的傳輸。
信息傳遞格式如表一所示:
500)this.style.width=500;" border="0" />
其中,各位的含義如下:
FF:0表示為標(biāo)準(zhǔn)格式,1表示為擴(kuò)展格式;
RTR:0表示為數(shù)據(jù)幀,1表示為遠(yuǎn)程幀;
DLC.X:數(shù)據(jù)長(zhǎng)度代碼位(0~8);
ID.X:信息標(biāo)識(shí)符位:
ID.28~I(xiàn)D.26為信息功能標(biāo)識(shí)
ID.25~I(xiàn)D.21為接收任務(wù)標(biāo)識(shí)
ID.20~I(xiàn)D.18為接收節(jié)點(diǎn)地址標(biāo)識(shí)
X :保留位,默認(rèn)為0,不能對(duì)保留位進(jìn)行寫(xiě)操作;
DATAO:數(shù)據(jù)場(chǎng)的第一個(gè)字節(jié),本協(xié)議中用來(lái)表明數(shù)據(jù)的屬性;
DATA0.7~DATAO.5為發(fā)送節(jié)點(diǎn)地址標(biāo)識(shí);
DATA0.4~DATAO.1為數(shù)據(jù)功能標(biāo)識(shí)
DATA0.0 0為擴(kuò)展位,‘0’ 表明數(shù)據(jù)長(zhǎng)度小于8不用擴(kuò)展,‘1’ 表示數(shù)據(jù)長(zhǎng)度大于8需要擴(kuò)展DATA1作傳遞次數(shù)索引。
DATA1: DATAO.0為0時(shí),傳遞數(shù)據(jù);DATAO.0為1時(shí),為數(shù)據(jù)傳遞次數(shù)的索引。
本文設(shè)計(jì)的信息優(yōu)先級(jí)從高到低依次為:信息功能標(biāo)識(shí)、任務(wù)功能標(biāo)識(shí)和目標(biāo)節(jié)點(diǎn)地址標(biāo)識(shí)。信息功能標(biāo)識(shí)設(shè)在ID的最高幾位,通過(guò)3位的功能代碼可以區(qū)分某些情況的8種基本功能:這些功能可以為節(jié)點(diǎn)狀態(tài)控制、節(jié)點(diǎn)保護(hù)、緊急情況通報(bào)以及有時(shí)間標(biāo)記的信息等;接收任務(wù)標(biāo)識(shí)表明本幀數(shù)據(jù)的任務(wù)屬性,容量為32;目標(biāo)節(jié)點(diǎn)地址指示本次數(shù)據(jù)的目的地址,容量為8。
DATA0.0在本協(xié)議中作為標(biāo)志位,用來(lái)區(qū)別單幀傳輸和多幀傳輸,解決了大于8字節(jié)的字符串的傳輸問(wèn)題。當(dāng)標(biāo)志位為1時(shí),表示傳送的是多幀數(shù)據(jù);為0時(shí)表明是單幀數(shù)據(jù)。這樣克服了CAN 只能傳輸小于等于8字節(jié)數(shù)據(jù)的缺點(diǎn),實(shí)現(xiàn)了大于8字節(jié)的數(shù)據(jù)的傳輸。
為了識(shí)別多幀傳輸中可能會(huì)出現(xiàn)的重幀和丟幀現(xiàn)象,本協(xié)議規(guī)定數(shù)據(jù)場(chǎng)第一字節(jié)作為多幀數(shù)據(jù)傳輸次序的索引。按照本協(xié)議制定的格式傳輸數(shù)據(jù)時(shí),單幀最多傳輸7字節(jié)的實(shí)際數(shù)據(jù):當(dāng)數(shù)據(jù)流長(zhǎng)度大于7字節(jié)時(shí),就要分成多幀傳送。
3 應(yīng)用層協(xié)議設(shè)計(jì)
在CANV2.0規(guī)范標(biāo)準(zhǔn)中,只規(guī)定了ISO參考模型的物理層和數(shù)據(jù)鏈路層,沒(méi)有規(guī)定媒體的連接單元以及駐留媒體,也沒(méi)有規(guī)定應(yīng)用層。物理層負(fù)責(zé)譬如物理信號(hào)傳輸、譯碼、位時(shí)序和位同步等功能,而數(shù)據(jù)鏈路層負(fù)責(zé)總線(xiàn)仲裁、信息分段以及數(shù)據(jù)安全、數(shù)據(jù)確認(rèn)、錯(cuò)誤檢測(cè)、信號(hào)傳輸和錯(cuò)誤控制的功能。實(shí)際上,即使在執(zhí)行一些非常簡(jiǎn)單的基于CAN的分布式系統(tǒng)時(shí)。除了基本的兩層服務(wù)之外,還要求或希望有更多功能,如發(fā)送長(zhǎng)于8字節(jié)的字符串、響應(yīng)或確定數(shù)據(jù)傳送、標(biāo)識(shí)符分配、網(wǎng)絡(luò)啟動(dòng)或監(jiān)控節(jié)點(diǎn)。
由于這些附加的功能直接支持應(yīng)用過(guò)程,所以它可以被認(rèn)作“應(yīng)用層”。如果正確執(zhí)行,則應(yīng)用層以及相應(yīng)的應(yīng)用層接口(子協(xié)議)為通訊和應(yīng)用過(guò)程提供了一個(gè)清晰定義的分界以便把它們區(qū)分開(kāi)來(lái)。在一些利用簡(jiǎn)單的通信協(xié)議就可以滿(mǎn)足要求的情況下,采用復(fù)雜的協(xié)議會(huì)造成資源的浪費(fèi),而且,使用起來(lái)也很不方便,反而限制了CAN的靈活性。所以在一些情況下制定適合要求的通信協(xié)議,對(duì)CAN的開(kāi)發(fā)和使用至關(guān)重要。本文根據(jù)實(shí)際系統(tǒng)設(shè)計(jì)的需要,在2.0A技術(shù)規(guī)范的基礎(chǔ)上制定了CAN應(yīng)用層通信協(xié)議。
CAN應(yīng)用層協(xié)議主要負(fù)責(zé)建立CPU與底層之間的橋梁,它主要由四部分組成:節(jié)點(diǎn)的開(kāi)關(guān)機(jī)制、數(shù)據(jù)的收發(fā)機(jī)制、錯(cuò)誤處理機(jī)制和中斷管理機(jī)制五部分組成。四種機(jī)制互相聯(lián)系、互相制約,共同維護(hù)系統(tǒng)的運(yùn)轉(zhuǎn)。限于篇幅本文主要介紹關(guān)鍵的數(shù)據(jù)收發(fā)機(jī)制。
3.1 數(shù)據(jù)發(fā)送機(jī)制
發(fā)送機(jī)制主要實(shí)現(xiàn)將CPU要發(fā)送的數(shù)據(jù)接過(guò)來(lái),并整理為符合應(yīng)用層協(xié)議規(guī)定的幀格式,將拆卸好的小包(數(shù)據(jù)幀)順序放入循環(huán)隊(duì)列中等待發(fā)送,并負(fù)責(zé)管理和維護(hù)發(fā)送循環(huán)隊(duì)列的止常運(yùn)轉(zhuǎn)。在定時(shí)器定時(shí)中斷中定期對(duì)循環(huán)隊(duì)列進(jìn)行掃描,如果發(fā)現(xiàn)隊(duì)列中有數(shù)據(jù)等待發(fā)送,則調(diào)用發(fā)送函數(shù)將數(shù)據(jù)發(fā)送到CAN總線(xiàn)。
在底層開(kāi)辟了一個(gè)臨時(shí)緩沖區(qū)用于暫時(shí)存放等待發(fā)送的小包,臨時(shí)緩沖區(qū)采用循環(huán)隊(duì)列的存儲(chǔ)結(jié)構(gòu),對(duì)數(shù)據(jù)實(shí)行先入先出的管理模式。循環(huán)隊(duì)列是一個(gè)42*11的二維數(shù)組,用來(lái)暫時(shí)安置CPU即將發(fā)送的數(shù)據(jù),數(shù)據(jù)被順序安排在循環(huán)隊(duì)列中等待發(fā)送。每增加一幀數(shù)據(jù),循環(huán)隊(duì)列的尾指針加1;每成功發(fā)送完一幀數(shù)據(jù),循環(huán)隊(duì)列的頭指針減1。當(dāng)循環(huán)隊(duì)列中沒(méi)有數(shù)據(jù)時(shí),隊(duì)列的狀態(tài)為空,否則指示為不空;若循環(huán)隊(duì)列的頭指針和尾指針重合而隊(duì)列又處于不空的狀態(tài),此時(shí)隊(duì)列為滿(mǎn)的狀態(tài)。當(dāng)隊(duì)列處于滿(mǎn)的狀態(tài)時(shí),禁止向隊(duì)列再寫(xiě)入數(shù)據(jù),否則容易導(dǎo)致數(shù)據(jù)的覆蓋或丟失。隊(duì)列中數(shù)據(jù)遵循先入先出的原則,CPU將數(shù)據(jù)從隊(duì)列尾部裝入,向CAN總線(xiàn)發(fā)送數(shù)據(jù)時(shí)則從隊(duì)列頭部將數(shù)據(jù)讀走。發(fā)送循環(huán)隊(duì)列的曾理單位為幀,每次操作都是11個(gè)字節(jié)為單位。在發(fā)送機(jī)制運(yùn)轉(zhuǎn)前,首先對(duì)發(fā)送循環(huán)隊(duì)列初始化,將循環(huán)隊(duì)列的頭指針、尾指針賦值為零,將已占用的空間也賦值為零。
CAN發(fā)送機(jī)制主要由兩大模塊組成:打小包模塊和幀發(fā)送模塊。當(dāng)CPU有數(shù)據(jù)需要發(fā)送時(shí),調(diào)用打小包函數(shù),要求給出待發(fā)送數(shù)據(jù)的存放地址。打小包函數(shù)將會(huì)按照本協(xié)議規(guī)定的格式將發(fā)送節(jié)點(diǎn)地址、接收節(jié)點(diǎn)地址、信息類(lèi)型、任務(wù)標(biāo)識(shí)、數(shù)據(jù)標(biāo)識(shí)等參數(shù)整理為CAN數(shù)據(jù)鏈路層ID的格式,將數(shù)據(jù)組裝成符合應(yīng)用層協(xié)議所規(guī)定的數(shù)據(jù)幀(小包),實(shí)現(xiàn)對(duì)長(zhǎng)度大于7字節(jié)的數(shù)據(jù)的打小包處理,按照所填加索引號(hào)的順序放到發(fā)送循環(huán)隊(duì)列中等待發(fā)送。打小包函數(shù)的流程圖如圖1所示:
500)this.style.width=500;" border="0" />
3.2 數(shù)據(jù)接收機(jī)制
CAN接收機(jī)制負(fù)責(zé)將數(shù)據(jù)從CAN總線(xiàn)上接收下來(lái),按照數(shù)據(jù)源節(jié)點(diǎn)的地址將其還原為發(fā)送前的格式,準(zhǔn)確無(wú)誤的傳遞給上層,并負(fù)責(zé)為上層提供接口函數(shù)。在CPU將數(shù)據(jù)取走以后,清空相應(yīng)的數(shù)組。
在底層開(kāi)辟了一個(gè)臨時(shí)緩沖區(qū)用于暫時(shí)存放從CAN總線(xiàn)上接收下的數(shù)據(jù),臨時(shí)緩沖區(qū)采用二維數(shù)組的格式,容量為4*3*64。第一維的容量為4,分別指示發(fā)送節(jié)點(diǎn)的地址;第二維容量為3,作為數(shù)據(jù)的擴(kuò)展緩存,指示可連續(xù)存放來(lái)自于同一節(jié)點(diǎn)的包的數(shù)目;第三維的容量為64,用來(lái)存放經(jīng)過(guò)整理以后的數(shù)據(jù)。一般來(lái)說(shuō),開(kāi)辟一個(gè)二維的空間就可以使協(xié)議周轉(zhuǎn),但是,在實(shí)際系統(tǒng)中可能會(huì)出現(xiàn)CPU還未能將整理完畢的數(shù)據(jù)取走此時(shí)又接到來(lái)自于同一節(jié)點(diǎn)的新的數(shù)據(jù),這樣就可能導(dǎo)致新的數(shù)據(jù)覆蓋掉原來(lái)的數(shù)據(jù),造成數(shù)據(jù)的丟失。為避免這種潛在地危險(xiǎn),因此開(kāi)辟了三維空間,在最壞的情況下,每個(gè)節(jié)點(diǎn)都可同時(shí)容納來(lái)自于同一節(jié)點(diǎn)連續(xù)發(fā)送的3包數(shù)據(jù),大大降低了數(shù)據(jù)丟失的可能性。接收數(shù)據(jù)流程如圖二所示。
500)this.style.width=500;" border="0" />
圖 二: 數(shù)據(jù)發(fā)送流程
5 總結(jié)
本文創(chuàng)新點(diǎn):CAN總線(xiàn)以其卓越的特性、極高的可靠性和獨(dú)特的設(shè)計(jì),在工業(yè)過(guò)程監(jiān)控設(shè)備的互聯(lián)方面得到廣泛的應(yīng)用,受到工業(yè)界的廣泛重視,并被公認(rèn)為是最有前途的現(xiàn)場(chǎng)總線(xiàn)之一。作為通用、有效、可靠及經(jīng)濟(jì)的平臺(tái),CA N協(xié)議也已經(jīng)廣泛地受到了歡迎。由于CAN2.0規(guī)范固有的局限性,客觀上要求用戶(hù)建立高層協(xié)議對(duì)CAN進(jìn)行完善。本文所設(shè)計(jì)的CAN總線(xiàn)應(yīng)用層協(xié)議已經(jīng)投入使用,具有簡(jiǎn)單、靈活、移植方便等特點(diǎn)。