甄國(guó)涌, 牛會(huì)恩
(中北大學(xué) 電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051)
CAN,全稱為“Controller Area Network”,即控制器局域網(wǎng),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。最初,CAN被設(shè)計(jì)作為汽車環(huán)境中的微控制器通訊,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網(wǎng)絡(luò)。比如:發(fā)動(dòng)機(jī)管理系統(tǒng)、變速箱控制器、儀表裝備、電子主干系統(tǒng)中,均嵌入CAN控制裝置。由于其卓越的性能,在工業(yè)自動(dòng)化、多種控制設(shè)備、交通工具、醫(yī)療器械以及建筑、環(huán)境控制等眾多部門越來越受到廣泛的關(guān)注[1]。
CAN總線控制系統(tǒng)的設(shè)計(jì)重點(diǎn)集中在節(jié)點(diǎn)模塊的設(shè)計(jì)上。通常節(jié)點(diǎn)模塊的設(shè)計(jì)方案有兩種: 傳統(tǒng)的方法是用單片機(jī)加上CAN 協(xié)議控制器組成,例如用51系列單片機(jī)和CAN控制器SJA1000 組成[2];另外一種方案是采用內(nèi)部集成了CAN 控制器模塊的微控制器。第一種開發(fā)CAN 節(jié)點(diǎn)的應(yīng)用實(shí)例已經(jīng)很多了,所以本文以C8051F040 為例介紹第二種開發(fā)方式。
本論文采用“CAN單片機(jī)+CAN收發(fā)器”的組合,配合以適當(dāng)?shù)耐鈬娐窐?gòu)成一個(gè)完整的CAN節(jié)點(diǎn),節(jié)點(diǎn)之間再經(jīng)導(dǎo)線簡(jiǎn)單連接便形成“CAN網(wǎng)絡(luò)”,下頁圖1為CAN總線網(wǎng)絡(luò)結(jié)構(gòu)。一個(gè)由CAN總線構(gòu)成的單一網(wǎng)絡(luò)中,理論上可以掛接無數(shù)個(gè)節(jié)點(diǎn)。實(shí)際應(yīng)用中,節(jié)點(diǎn)數(shù)目受網(wǎng)絡(luò)硬件的電氣特性所限制。
CAN網(wǎng)絡(luò)控制邏輯電平信號(hào)從CAN控制器到達(dá)物理總線的物理層,反之也一樣。CAN控制器執(zhí)行CAN協(xié)議,用于信息緩沖和濾波。C8051F040的CAN控制器支持完全的CAN2.0A和CAN2.0B。
C8051F040的所有CAN協(xié)議功能都由獨(dú)立的CAN控制器而不是由51處理器來完成。因此CAN通信占用CPU帶寬很小,51處理器只需要通過特殊功能寄存器(SFR)配置CAN控制器和數(shù)據(jù)過濾器就可以了。
圖1 CAN總線網(wǎng)絡(luò)結(jié)構(gòu)
圖2是C8051F040內(nèi)部集成的CAN控制器原理框圖,各部分功能如下:
CAN控制器核: CAN協(xié)議控制器和發(fā)送/接收轉(zhuǎn)換寄存器;
消息RAM:存儲(chǔ)Message Objects和標(biāo)志碼, CAN控制器共有32個(gè)信息目標(biāo)可供配置來用于發(fā)送或接收數(shù)據(jù);
CAN專用寄存器:用于控制和配置C_CAN模塊的所有寄存器;
消息處理器:控制數(shù)據(jù)在CAN控制核的接收/發(fā)送轉(zhuǎn)換寄存器和目標(biāo)信息之間的傳輸,以及中斷的產(chǎn)生。
圖2 CAN控制器原理框
CAN寄存器可分為以下4類:
CAN控制器協(xié)議寄存器:用于CAN控制,中斷,錯(cuò)誤控制,總線狀態(tài)控制和測(cè)試模式;
信息目標(biāo)接口寄存器:配置32個(gè)信息目標(biāo),從目標(biāo)接收和發(fā)送數(shù)據(jù)。C8051F040處理器通過它來讀寫CAN 消息RAM;
信息處理寄存器:只讀寄存器。為51CPU提供信息目標(biāo)的狀態(tài),如信息有效標(biāo)志,發(fā)送請(qǐng)求狀態(tài),新數(shù)據(jù)標(biāo)志和中斷標(biāo)志;
C8051處理器特殊功能寄存器(SFR):C8051處理器控制的5個(gè)寄存器,直接讀寫CAN協(xié)議寄存器,通過CAN數(shù)據(jù)寄存器(CAN0DATH和CAN0DATL)和CAN地址寄存器(CAN0ADR)間接讀寫其他CAN控制器。
CAN控制器工作于多主方式[3],對(duì)于主節(jié)點(diǎn)和從節(jié)點(diǎn),CAN總線硬件接口是相同的。由于C8051F040內(nèi)部集成了CAN總線控制器,所以只需外加總線驅(qū)動(dòng)器并加上適當(dāng)?shù)母綦x就可以了, 電路上顯得非常簡(jiǎn)潔。CAN總線信號(hào)CANTX和CANRX從C8051F040出來后先分別經(jīng)過高速光耦6N137進(jìn)行電氣隔離,再經(jīng)過CAN總線收發(fā)器接口芯片TJA1040,然后接到CAN數(shù)據(jù)線上。由于工業(yè)現(xiàn)場(chǎng)環(huán)境惡劣,電磁干擾與瞬時(shí)干擾比較嚴(yán)重,為了保證系統(tǒng)的可靠性,節(jié)點(diǎn)的控制器和接收器之間用6N137進(jìn)行光電隔離,避免總線上的瞬時(shí)干擾。但是需注意的是兩邊的電源一定要隔離處理,否則無效[4]。本課題在高速光耦和CAN收發(fā)器的電源之間選用的DC-DC電源模塊是BO505進(jìn)行電源隔離,它可以使VCC與+5V完全隔離,使結(jié)點(diǎn)的穩(wěn)定性與安全性得到了很大的提高。
總線終端匹配電阻是必須使用的??偩€兩端的120Ω電阻對(duì)于匹配總線阻抗起著相當(dāng)重要的作用。因此本系統(tǒng)的所有節(jié)點(diǎn)終端電阻全部加上跳線,兩端的節(jié)點(diǎn)的跳線接上,使電阻有效,中間節(jié)點(diǎn)不接跳線,相當(dāng)于沒有終端電阻。
單片機(jī)固件程序主要完成的任務(wù)是:系統(tǒng)初始化程序、發(fā)送程序、接收程序等。軟件部分設(shè)計(jì)的好壞將直接決定系統(tǒng)能否正常工作,這是CAN總線系統(tǒng)的設(shè)計(jì)人員來說是一個(gè)難點(diǎn),也是一個(gè)重點(diǎn)。本系統(tǒng)軟件采用結(jié)構(gòu)化程序設(shè)計(jì)方案,使其具有較好的模塊性和可移植性,對(duì)于不同的系統(tǒng)功能或不同的應(yīng)用環(huán)境,可以方便地進(jìn)行編程重組。
初始化程序主要完成對(duì)所有的報(bào)文對(duì)象進(jìn)行初始化(一般將所有值置零),對(duì)CAN控制寄存器、位定時(shí)寄存器進(jìn)行設(shè)置,還要對(duì)發(fā)送報(bào)文對(duì)象和接收?qǐng)?bào)文對(duì)象分別進(jìn)行初始化。其中,位定時(shí)寄存器的設(shè)置較為復(fù)雜,這里我們使用外部晶振為 22.1184 MHz,CAN 通信速率為 1 Mb/s,得到BITREG的初始值為0x5EC0。下面為CAN啟動(dòng)程序:
CAN報(bào)文發(fā)送是由CAN控制器自動(dòng)完成的,用戶只需根據(jù)接收到的遠(yuǎn)程幀的識(shí)別符,將對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)移到發(fā)送緩沖寄存器,然后將此報(bào)文對(duì)象的編碼寫入命令請(qǐng)求寄存器啟動(dòng)發(fā)送即可,而發(fā)送由硬件來完成。這里,我們使用定時(shí)更新發(fā)送報(bào)文對(duì)象中的數(shù)據(jù),數(shù)據(jù)的發(fā)送有控制器自動(dòng)完成,當(dāng)其收到一個(gè)數(shù)據(jù)幀時(shí),就將具有相同識(shí)別符的數(shù)據(jù)幀發(fā)送出去。其發(fā)送程序結(jié)構(gòu)如下:
CAN報(bào)文的接收與發(fā)送一樣,是由CAN控制器自動(dòng)完成的,接收程序只需從接收緩存器中讀取接收的數(shù)據(jù),再進(jìn)行相應(yīng)的處理即可。其基本方法與發(fā)送程序一致。
5.1.1 波特率設(shè)置分析
C8051F040CAN控制器的波特率主要是設(shè)置2個(gè)寄存器:Bit Timing Register與BRP Extension Register,對(duì)于Bit Timing Register, Res為保留位;Tseg1占4個(gè)二進(jìn)制位,可設(shè)置值為0x1~0xF;Tseg2占3個(gè)二進(jìn)制位,可設(shè)置值為0x0~0x7;SJWP占2個(gè)二進(jìn)制位,可設(shè)置值為0x0~0x3;BRP占6個(gè)二進(jìn)制位,為Baud Rate Prescaler的縮寫,譯為波特率預(yù)分頻比例因子,用于對(duì)CAN時(shí)鐘頻率fsys_can預(yù)分頻,可設(shè)置值為0x00~0x3F。他們要比實(shí)際使用值少1。fsys_can與C8051F040單片機(jī)的系統(tǒng)時(shí)鐘頻率fsys相同,可通過配置C8051F040單片機(jī)的晶振配置寄存器OSCICN或OSCXCN分頻得到。由于CAN 通信的高精度要求,一般使用外部石英晶振。
對(duì)于BRP Extension Register,主要用在fsys_can很高,要求的CAN波特率又很小,BRP設(shè)置到0x3F仍然不能滿足要求時(shí),用此寄存器來擴(kuò)展預(yù)分頻的值。BRPE為4位,作為分頻數(shù)中的MSB部分,BRP為6位,作為分頻數(shù)中的LSB 部分,2者合用共10位,最大可產(chǎn)生1023分頻數(shù),即實(shí)際分頻數(shù)最大可達(dá)1024。
5.1.2 1M波特率的設(shè)置過程
本例說明如何配置CAN控制器的時(shí)序參數(shù)來滿足上文介紹的1 Mb/s的位速率。表1給出了進(jìn)行計(jì)算所需要的與時(shí)序相關(guān)的系統(tǒng)參數(shù)。
表1 CAN控制器的時(shí)序參數(shù)
我們要調(diào)整這4個(gè)位段的長(zhǎng)度,以使它們的和最接近所期望的位時(shí)間。由于每個(gè)時(shí)段必須是時(shí)間量子(tq)的整數(shù)倍,所以可得到最接近的位時(shí)間為22 tq(994.642 ns),由此可得位速率為1.00539 Mb/s。Sync_Seg固定為1 tq。Prop_Seg必須大于或等于400 ns的傳輸延遲時(shí)間,我們選9 tq(406.899 ns)。
位時(shí)間中剩余的時(shí)間量子數(shù)(tq)分配給Phase_Seg1和Phase_Seg2,我們選Phase_Seg1=6 tq,Phase_Seg2=6 tq。
寫入到位定時(shí)寄存器中的值用如下方程計(jì)算。BRP擴(kuò)展寄存器保持其復(fù)位值0x0000不變。
BRPE=BRP-1=BRP擴(kuò)展寄存器=0x0000,
SJWP=SJW-1=min(4,6)-1=3,
TSEG1=(Prop_Seg+Phase_Seg1-1)=9+6-1=14,
TSEG2=(phase_Seg2-1)=5,
位時(shí)間寄存器=TSEG2·0x1000+TSEG1·0x0100+SJWp·0x0040+BRPE=0x5EC0。
本文介紹的單片機(jī)固件程序采用定時(shí)器0、方式1的方式發(fā)送CAN報(bào)文。在定時(shí)器模式下,計(jì)數(shù)器由單片機(jī)脈沖經(jīng)12分頻后計(jì)數(shù)。因此,定時(shí)器定時(shí)時(shí)間T的計(jì)算公式為:
式中TM為計(jì)數(shù)器從初值開始作加1計(jì)數(shù)到計(jì)滿為全1所需要的時(shí)間,TM為模值,和定時(shí)器的工作方式有關(guān);fOSC是單片機(jī)晶體振蕩器的頻率,TC為定時(shí)器的定時(shí)初值。
在式(2)中,若設(shè)TC=0,則定時(shí)器定時(shí)時(shí)間為最大(初值為0,計(jì)數(shù)從全0到全1,溢出后又為全0)。TM的值和定時(shí)器工作方式有關(guān),本文介紹的單片機(jī)主脈沖晶體振蕩器頻率fOSC為10 MHz,則最大定時(shí)時(shí)間為:
經(jīng)過以上分析,式(2)中,四個(gè)未知量已知,所以我們可以解出TC的值,即為位定時(shí)寄存器的值。
本文設(shè)計(jì)的CAN總線節(jié)點(diǎn)模塊,采用內(nèi)部集成CAN控制器模塊的微控制器,不但硬件設(shè)計(jì)上簡(jiǎn)單、可靠,編制相應(yīng)的軟件時(shí)也更方便和簡(jiǎn)潔。而且抗干擾能力強(qiáng)、性能高效:能單發(fā)和循環(huán)發(fā)送報(bào)文,其時(shí)間間隔在0~60 ms任意設(shè)定。通訊速率能根據(jù)系統(tǒng)需要設(shè)置不同檔,而且能夠?qū)λ枰l(fā)送數(shù)據(jù)的ID號(hào)、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)內(nèi)容等進(jìn)行設(shè)定。目前整個(gè)系統(tǒng)運(yùn)行良好,性能穩(wěn)定,符合工業(yè)現(xiàn)場(chǎng)使用的要求。
[1] 鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2002.
[2] 侯明,杜奕.基于 CAN總線的接口電路設(shè)計(jì)[J].通信技術(shù),2008,41(07):138-139.
[3] 蔡連君.基于 CAN總線的生產(chǎn)監(jiān)控系統(tǒng)研究[J].通信技術(shù),2009,42(10):151-152.
[4] 宋明權(quán),周純杰.基于C8051F040的CAN通訊接口的開發(fā)與應(yīng)用[J].計(jì)算技術(shù)與自動(dòng)化,2005(07):50-51.