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