一種CAN總線高層通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
1 引言
can全稱為controller area network,即控制器局域網(wǎng),由德國(guó)bosch公司最先提出,是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。最初can 被設(shè)計(jì)作為汽車環(huán)境中的通訊,在汽車電子控制裝置之間交換信息形成汽車電子控制網(wǎng)絡(luò)。由于其卓越的性能、極高的可靠性和低廉的價(jià)格現(xiàn)已廣泛應(yīng)用于工業(yè)現(xiàn)場(chǎng)控制、醫(yī)療儀器等眾多領(lǐng)域[1][2]。
can協(xié)議是建立在osi 7層開放互連參考模型基礎(chǔ)之上的。但can協(xié)議只定義了模型的最下面兩層:數(shù)據(jù)鏈路層和物理層,僅保證了節(jié)點(diǎn)間無(wú)差錯(cuò)的數(shù)據(jù)傳輸。can的應(yīng)用層協(xié)議必須 由can 用戶自行定義,或采用一些國(guó)際組織制訂的標(biāo)準(zhǔn)協(xié)議。應(yīng)用最為廣泛的是devicenet和canopen,分別廣泛應(yīng)用于過程控制和機(jī)電控制領(lǐng)域。但此類協(xié)議一般結(jié)構(gòu)比較復(fù)雜,更適合復(fù)雜大型系統(tǒng)的應(yīng)用。筆者在研制一種基于can總線的分布式高頻開關(guān)電源充電機(jī)系統(tǒng)的過程中設(shè)計(jì)了一種適合于小型控制系統(tǒng)的 can總線高層通信協(xié)議。
2 can的特點(diǎn)[3]
can 是一種多主方式的串行通訊總線,基本設(shè)計(jì)規(guī)范要求有高的位速率、抗電磁干擾性,而且要能夠檢測(cè)出總線的任何錯(cuò)誤。當(dāng)信號(hào)傳輸距離達(dá)10km時(shí),can仍可 提供高達(dá)50kbps 的數(shù)據(jù)傳輸速率。
can具有十分優(yōu)越的特點(diǎn):
(1) 較低的成本與極高的總線利用率;
(2) 數(shù)據(jù)傳輸距離可長(zhǎng)達(dá)10km,傳輸速率可高達(dá)1mbps[7];
(3) 可靠的錯(cuò)誤處理和檢錯(cuò)機(jī)制,發(fā)送的信息遭到破壞后可自動(dòng)重發(fā);
(4) 節(jié)點(diǎn)在錯(cuò)誤嚴(yán)重的情況下具有自動(dòng)退出總線的功能;
(5) 報(bào)文不包含源地址或目標(biāo)地址,僅用標(biāo)志符來指示功能信息和優(yōu)先級(jí)信息。
3 can的技術(shù)規(guī)范
(1) 幀類型
在can總線中,有四種不同的幀類型[4][5]:
·數(shù)據(jù)幀(data frame) 數(shù)據(jù)幀帶有應(yīng)用數(shù)據(jù);
· 遠(yuǎn)程幀(remote frame) 通過發(fā)送遠(yuǎn)程幀可以向網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù),啟動(dòng)其他資源節(jié)點(diǎn)傳送他們各自的數(shù)據(jù),遠(yuǎn)程幀包含6個(gè)不同的位域:幀起始、仲裁域、控制域、crc域、應(yīng)答域、幀結(jié)尾。仲裁域中的rtr位的隱極性表示為遠(yuǎn)程幀;
·錯(cuò)誤幀(error frame)錯(cuò)誤幀能夠報(bào)告每個(gè)節(jié)點(diǎn)的出錯(cuò),由兩個(gè)不同的域組成,第一個(gè)域是不同站提供的錯(cuò)誤標(biāo)志的疊加,第二個(gè)域是錯(cuò)誤界定符;
·過載幀 (overload frame)如果節(jié)點(diǎn)的接收尚未準(zhǔn)備好就會(huì)傳送過載幀,由兩個(gè)不同的域組成,第一個(gè)域是過載標(biāo)志,第二個(gè)域是過載界定符。
(2) 數(shù)據(jù)幀結(jié)構(gòu)
數(shù)據(jù)幀由以下7個(gè)不同的位域(bit field)組成:幀起始、仲裁域、控制域、數(shù)據(jù)域、crc域、應(yīng)答域、幀結(jié)尾。其標(biāo)準(zhǔn)幀結(jié)構(gòu)如表1所示:
表1 數(shù)據(jù)幀的結(jié)構(gòu)[4]
·幀起始:標(biāo)志幀的開始,它由單個(gè)顯性位構(gòu)成,在總線空閑時(shí)發(fā)送,在總線上產(chǎn)生同步作用。
·仲裁域: 由11位標(biāo)識(shí)符(id10-id0)和遠(yuǎn)程發(fā)送請(qǐng)求位(rtr)組成,rtr位為顯性表示該幀為數(shù)據(jù)幀,隱性表示該幀為遠(yuǎn)程幀;標(biāo)識(shí)符由高至低按次序發(fā)送,且前7位 (id10-id4)不能全為顯性位。標(biāo)識(shí)符id用來描述數(shù)據(jù)的含義而不用于通信尋址,can總線的幀是沒有尋址功能的。標(biāo)識(shí)符還用于決定報(bào)文的優(yōu)先權(quán),id值越低優(yōu)先權(quán)越高,在競(jìng)爭(zhēng)總線時(shí),優(yōu)先權(quán)高的報(bào)文優(yōu)先發(fā)送,優(yōu)先權(quán)低報(bào)文退出總線競(jìng)爭(zhēng)。can總線競(jìng)爭(zhēng)的算法效率很高,是一種非破壞性競(jìng)爭(zhēng)。
· 控制域:為數(shù)據(jù)長(zhǎng)度碼 (dlc3-dlc0),表示數(shù)據(jù)域中數(shù)據(jù)的字節(jié)數(shù),不得超過8。
·數(shù)據(jù)域:由被發(fā)送數(shù)據(jù)組成,數(shù)目與控制域中設(shè)定的字節(jié) 數(shù)相等,第一個(gè)字節(jié)的最高位首先被發(fā)送。其長(zhǎng)度在標(biāo)準(zhǔn)幀中不超過8個(gè)字節(jié)。
·crc域:包括crc(循環(huán)冗余碼校驗(yàn))序列(15位)和crc界定 符(1個(gè)隱性位),用于幀校驗(yàn)。
l應(yīng)答域:由應(yīng)答間隙和應(yīng)答界定符組成,共兩位;發(fā)送站發(fā)送兩個(gè)隱性位,接收站在應(yīng)答間隙中發(fā)送顯性位。應(yīng)答界定符必須是隱性位。
·幀結(jié)束:由7位隱性位組成。
4 自訂can高層協(xié)議
can的高層協(xié)議也可理解為應(yīng)用層協(xié)議,是一種在現(xiàn)有的底層協(xié)議(物理層和數(shù)據(jù)鏈路層)之上實(shí)現(xiàn)的協(xié)議。由于充電機(jī)系統(tǒng)的結(jié)構(gòu)比較簡(jiǎn)單,網(wǎng)絡(luò)規(guī)模也比較 小。因此我們自行制訂了一種簡(jiǎn)單而有效的高層通信協(xié)議。
技術(shù)規(guī)范can2.0a規(guī)定標(biāo)準(zhǔn)的數(shù)據(jù)幀有11位標(biāo)識(shí)符,用戶可以自行規(guī)定其含義,將所需要的信息包含在內(nèi)。在充電機(jī)系統(tǒng)中,每一個(gè)節(jié)點(diǎn)都有一個(gè)唯一的地址,地址碼和模塊一一對(duì)應(yīng),通過撥碼開關(guān)設(shè)定,總線上數(shù)據(jù)的傳送也是根據(jù)地址進(jìn)行的。由于本系統(tǒng)規(guī)模較小,節(jié)點(diǎn)數(shù)少于32個(gè),因此為每個(gè)模塊分配一個(gè)5位 的地址碼,同一系統(tǒng)中地址碼不得重復(fù),系統(tǒng)初始化時(shí)由外部引腳讀入。將標(biāo)識(shí)符id9-id5定義為源地址,id4-id0定義為目的地址,本協(xié)議中從模塊 的目的地址全填0,表示數(shù)據(jù)是廣播數(shù)據(jù),所有節(jié)點(diǎn)都可接收,主模塊中目的地址根據(jù)要進(jìn)行通信目的模塊的地址確定。本通信協(xié)議的數(shù)據(jù)幀格式詳見表2。
表2 數(shù)據(jù)幀格式
理論上源地址和目的地址的范圍都是0~31,但由于can協(xié)議中規(guī)定標(biāo)識(shí)符前7位不能全為顯性位,所以源地址不能為31,這時(shí)實(shí)際節(jié)點(diǎn)只有31 個(gè) (0~30)。因此每個(gè)系統(tǒng)所含的模塊不超過31個(gè)。所以源地址和目的地址的范圍縮減到0~30。同時(shí)上位監(jiān)控機(jī)也要占用一個(gè)地址,因此系統(tǒng)中的電源模塊 不超過30個(gè),設(shè)計(jì)時(shí)根據(jù)節(jié)點(diǎn)的優(yōu)先權(quán)高低從小到大分配節(jié)點(diǎn)地址。id10位定義為主模塊識(shí)別碼,該位主模塊為隱性位,從模塊為顯性位,以保證主模塊通信優(yōu)先。模塊的地址碼決定發(fā)送數(shù)據(jù)的優(yōu)先級(jí)。主模塊向總線發(fā)送的數(shù)據(jù)有兩種:一種是目的地址全部填0的廣播數(shù)據(jù);另一種是包含特定目的地址的非廣播數(shù)據(jù)。
協(xié)議中一幀數(shù)據(jù)最多能傳送8個(gè)字節(jié),對(duì)于充電機(jī)控制系統(tǒng)來說已經(jīng)足夠用了,本系統(tǒng)只用到其中的前5個(gè)字節(jié),其余3個(gè)節(jié)字可用于以后的擴(kuò)展使用,因此未定義 多幀傳輸方式。
從模塊以廣播形式向總線發(fā)送數(shù)據(jù),同時(shí)回收自己發(fā)送的數(shù)據(jù),若檢測(cè)到所發(fā)送與所收到的數(shù)據(jù)不符,則立即重新發(fā)送上一幀數(shù)據(jù)。從模塊發(fā)送信息的順序由主模塊的發(fā)出的指令決定,以免在總線通信繁忙時(shí)優(yōu)先級(jí)較低的模塊始終得不到總線通信權(quán)。指令的發(fā)送順序按照各從模塊的地址順序進(jìn)行,即地址較低的從模塊首先獲得 指令,得以發(fā)送自己的地址碼和電流、溫度采樣值。如發(fā)生沖突,則由can控制器自動(dòng)根據(jù)模塊的優(yōu)先級(jí)調(diào)整發(fā)送順序,在can的底層協(xié)議中有完善的優(yōu)先級(jí)仲裁算法,因此應(yīng)用層協(xié)議不必考慮此類問題。[!--empirenews.page--]
對(duì)于每個(gè)模塊,上電1s后若未收到任何通信信息,則按計(jì)算延時(shí)發(fā)送自身的地址碼和溫度電流采樣值。延時(shí)時(shí)間的計(jì)算為[6]:
tdelay=t×add
其中:tdelay-為延時(shí)發(fā)送時(shí)間;
t-為單位延時(shí)時(shí)間常數(shù),該值根據(jù)通信速率定義;可以取1個(gè)位周期,在波特率為100khz時(shí)為10μs;
add-為模塊地址編碼。
主模塊是id10=0的模塊,因此具有最高的優(yōu)先級(jí)。上電后主模塊首先向總線廣播發(fā)送自身的地址碼和溫度電流采樣值,然后即按順序向從機(jī)發(fā)送指令,等待從機(jī)的回答。主機(jī)1秒鐘后若未收到任何通信信息則認(rèn)為該模塊出錯(cuò),發(fā)出報(bào)警。同樣從機(jī)1s后若未收到主機(jī)任何通信信息則認(rèn)為主機(jī)出錯(cuò),按照源地址優(yōu)先級(jí)由其 余模塊中地址最低的模塊充當(dāng)主模塊,并將其id10由1改為0,以獲得最高通信優(yōu)先權(quán)。
各模塊檢測(cè)到自身故障時(shí),將切斷輸出,退出通信,并向上位機(jī)報(bào)警,同時(shí)發(fā)出聲光報(bào)警。
5 結(jié)束語(yǔ)
本文中所介紹的can高層通信協(xié)議,結(jié)構(gòu)簡(jiǎn)單、使用靈活、可靠性極高,實(shí)現(xiàn)也比較容易。很適合在節(jié)點(diǎn)數(shù)不多、通信可靠性要求高、控制結(jié)構(gòu)較簡(jiǎn)單的小型控制系統(tǒng)中應(yīng)用,具有一定的實(shí)用價(jià)值。
參考文獻(xiàn)
[1] can基本知識(shí)[eb]. http://www.zlgmcu.com.
[2] 控制器局域網(wǎng)(can)未來的工業(yè)微處理器串行通訊[eb]. http://www.zlgmcu.com.
[3] 周立功等. 增強(qiáng)型80c51單片機(jī)速成與實(shí)戰(zhàn)[m]. 北京:北京航空航天大學(xué)出版社,2003.
[4] 饒運(yùn)濤等.現(xiàn)場(chǎng)總線can原理與應(yīng)用技術(shù)[m]. 北京:北京航空航天大學(xué)出版社,2003.
[5] 蔣建文等. can總線通信協(xié)議的分析和實(shí)現(xiàn)[j]. 計(jì)算機(jī)工程,2002,2.
[6] 鄭尊標(biāo).數(shù)字化智能電源模塊研究[d]. 浙江:浙江大學(xué),2001.
[7] canbus現(xiàn)場(chǎng)總線基礎(chǔ)方案芯片篇[eb]