摘 要: CAN總線是一種應(yīng)用廣泛的實(shí)時(shí)性現(xiàn)場(chǎng)總線,,提出了基于具有ARM7TDMI內(nèi)核的32位微控制器" title="微控制器">微控制器的CAN總線智能節(jié)點(diǎn)設(shè)計(jì)方案。詳細(xì)介紹了ARM控制器(LPC2294)的特點(diǎn),、智能節(jié)點(diǎn)的結(jié)構(gòu)以及系統(tǒng)軟件設(shè)計(jì),,同時(shí)結(jié)合現(xiàn)場(chǎng)實(shí)際使用給出了硬件抗干擾措施,。
關(guān)鍵詞: CAN總線 ARM 嵌入式控制器
?
CAN(Controller Area Network)即控制器局域網(wǎng),CAN總線是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一,。它最早是由德國(guó)Bosch公司推出的,,CAN通信協(xié)議是一種用于汽車內(nèi)部測(cè)量與執(zhí)行部件之間的數(shù)據(jù)通信協(xié)議。
作為一種技術(shù)先進(jìn),、可靠性高,、功能完善、成本合理的遠(yuǎn)程網(wǎng)絡(luò)通訊控制方式,,CAN總線已被廣泛應(yīng)用于各個(gè)自動(dòng)化控制系統(tǒng)中,。例如,,在汽車電子,、自動(dòng)控制、智能大廈,、電力系統(tǒng),、安防監(jiān)控等各領(lǐng)域中,CAN總線具有不可比擬的優(yōu)越性,。本設(shè)計(jì)給出CAN總線節(jié)點(diǎn)方案,。它采用內(nèi)置多路CAN總線控制器的LPC2294作為主控制器,使得該節(jié)點(diǎn)體積小,、功耗低,、抗干擾性好,因而特別適用于汽車,、工業(yè)控制以及醫(yī)療系統(tǒng)和容錯(cuò)維護(hù)總線中,。
1 硬件設(shè)計(jì)
1.1 LPC2294的特點(diǎn)
ARM7系列具有ARM7TDMI內(nèi)核的32位嵌入式微處理器是目前應(yīng)用很廣的嵌入式RISC處理器。該系列芯片體積小,、功耗低,、成本低,高性能與靈活性相結(jié)合,,有較多的寄存器,,提供了擴(kuò)充的增強(qiáng)的固定長(zhǎng)的16/ 32 位雙指令集" title="指令集">指令集。用16 位的Thumb指令可以節(jié)省高達(dá)35%的空間,。另外它還實(shí)行流水線作業(yè),,提供嵌入式ICE2RT邏輯,支持片上斷點(diǎn)和調(diào)試點(diǎn)支持,,具有先進(jìn)的軟件開發(fā)和調(diào)試環(huán)境,。
本設(shè)計(jì)選用的LPC2294是PHILIPS公司新推出的一款功能強(qiáng)大的超低功耗的具有ARM7TDMI內(nèi)核的32位微控制器。144腳封裝,、兩個(gè)32位定時(shí)器,、八路10位ADC,、四路CAN通道和PWM通道以及多達(dá)九個(gè)的外部中斷,內(nèi)部嵌入256K字節(jié)高速Flash 存儲(chǔ)器和16K 字節(jié)靜態(tài)RAM,,包含76(使用了外部存儲(chǔ)器)~112(單片)個(gè)GPIO口,。如此豐富的片上資源完全可以滿足一般的工業(yè)控制的需要, 同時(shí)還可以減少系統(tǒng)硬件設(shè)計(jì)的復(fù)雜度,。另外,,LPC2294支持JTAG實(shí)時(shí)仿真和跟蹤、128位寬度的存儲(chǔ)器接口和獨(dú)特的加速結(jié)構(gòu),,使32 位代碼能夠在高達(dá)60MHz 的操作頻率下運(yùn)行,。
LPC2294內(nèi)部集成有四路CAN控制器:符合CAN規(guī)范CAN2.0B,ISO 11898-1標(biāo)準(zhǔn),;總線數(shù)據(jù)波特率均可達(dá)1Mbps,;可訪問32位的寄存器和RAM;全局驗(yàn)收過濾器可識(shí)別幾乎所有總線的11位和29位Rx標(biāo)識(shí)符,;驗(yàn)收過濾器為選擇的標(biāo)準(zhǔn)標(biāo)識(shí)符提供了FullCAN-style自動(dòng)接收功能,。
作為本設(shè)計(jì)的核心部件,LPC2294不僅擔(dān)負(fù)起主控制器的作用,,同時(shí)還作為CAN網(wǎng)絡(luò)的節(jié)點(diǎn)控制器,,與網(wǎng)絡(luò)中的其它節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)傳輸與交換。
1.2 CAN節(jié)點(diǎn)硬件電路組成
CAN節(jié)點(diǎn)硬件電路如圖1所示,,由ARM微控制器LPC2294,、CAN總線收發(fā)器TJA1050T、高速光耦" title="光耦">光耦6N137和電源隔離模塊B0505S等組成,。
主控芯片LPC2294的晶振頻率范圍為1~30MHz,。本設(shè)計(jì)選晶振頻率為20MHz,通過設(shè)置內(nèi)部的VPB分頻器可以提高CPU時(shí)鐘頻率,。內(nèi)部256K字節(jié)的高速Flash 存儲(chǔ)器用于代碼和數(shù)據(jù)的存儲(chǔ),。對(duì)于FLASH 存儲(chǔ)器,可通過內(nèi)置的串行JTAG接口進(jìn)行在系統(tǒng)編程(ISP),,或進(jìn)行在應(yīng)用編程(IAP),。為了便于調(diào)試和系統(tǒng)升級(jí),在設(shè)計(jì)中可以預(yù)留這些接口電路,。
LPC2294采用雙電源供電,。CPU的供電電壓范圍為1.65~1.95V(1.8 V± 8.3%),I/O的供電電壓范圍為3.0~3.6V(3.3V±10%),。
收發(fā)器TJA1050T 是CAN 協(xié)議控制器和物理總線之間的接口,,它與“ISO 11898”標(biāo)準(zhǔn)完全兼容。CANH和CANL理想配合,,可使電磁輻射減到更低,。除此之外,,TJA1050T不上電時(shí),總線呈現(xiàn)無源特性,,這使得TJA1050T在性能上大大優(yōu)于以前的CAN總線收發(fā)器,。TJA1050T有兩種工作模式:高速模式和靜音模式(它們由引腳“S”來控制)。在高速模式中,,總線輸出信號(hào)有固定的斜率,,并且以盡量快的速度切換。高速模式適用于最大位速率和最大總線長(zhǎng)度的情況,,而且此時(shí)其收發(fā)器循環(huán)延遲最小,。靜音模式時(shí)發(fā)送器是禁能的,它不管TxD的輸入信號(hào),。靜音模式可以防止CAN控制器不受控制時(shí)對(duì)網(wǎng)絡(luò)通訊造成堵塞,。
1.3 硬件的抗干擾設(shè)計(jì)
在本設(shè)計(jì)所應(yīng)用的場(chǎng)合中,產(chǎn)生電磁信號(hào)的設(shè)備較多,,包括超短波設(shè)備,、音頻設(shè)備,、電源等,,因此抗干擾設(shè)計(jì)顯得尤其重要。主要采取了以下措施:
(1)為了進(jìn)一步提高CAN 總線節(jié)點(diǎn)的抗干擾能力,,保證各節(jié)點(diǎn)之間在電氣上是完全隔離和獨(dú)立的,,LPC2294的TX0和RX0分別通過高速光耦6N137與TJA1050T的TXD和RXD相連。不過,,應(yīng)該特別說明的是,,光耦部分電路所采用的兩個(gè)電源必須完全隔離,否則采用光耦也就失去了意義,。電源的完全隔離采用小功率電源隔離模塊B0505S,。電路雖復(fù)雜一些,但是卻提高了節(jié)點(diǎn)的穩(wěn)定性和安全性,。
(2)在CAN總線的兩端加有兩個(gè)120Ω 的電阻,,這兩個(gè)電阻對(duì)于總線阻抗的匹配起著相當(dāng)重要的作用。去掉它們會(huì)使數(shù)據(jù)通信的抗干擾性及可靠性大大降低,,甚至無法通信,。
(3)CANH 和CANL 與地之間并聯(lián)了兩個(gè)30pF的小電容,可以濾除總線上的高頻干擾并且具有一定的防電磁輻射的能力,;在兩根CAN總線接入端之間并入了5.6V的TVS管,,當(dāng)CAN總線竄入電壓干擾時(shí)可通過TVS管的短路起到一定的過壓保護(hù)作用。
(4)為了減小現(xiàn)場(chǎng)對(duì)節(jié)點(diǎn)的干擾,,采用屏蔽雙絞線,,且根據(jù)實(shí)際使用經(jīng)驗(yàn),,屏蔽電纜的屏蔽層無需接地。
2 軟件設(shè)計(jì)
軟件調(diào)試環(huán)境采用ARM公司的ARM核處理器集成開發(fā)工具ADSv1.2,。ADSv1.2集成了匯編,、C、C++編譯器和調(diào)試器,,編譯效率高,,提供了功能強(qiáng)大的系統(tǒng)庫(kù),支持軟件調(diào)試,、JTAG仿真調(diào)試及硬件調(diào)試,。本設(shè)計(jì)采用的是JTAG仿真調(diào)試。
對(duì)于一般的32位ARM應(yīng)用系統(tǒng),,在運(yùn)行主程序前必須初始化運(yùn)行環(huán)境,,即為ARM芯片編寫啟動(dòng)代碼。該啟動(dòng)代碼包括異常向量表,、堆棧初始化,、存儲(chǔ)系統(tǒng)初始化和目標(biāo)板初始化等,一般用匯編語言編寫,。對(duì)于該設(shè)計(jì)來說,,關(guān)鍵的是編寫CAN驅(qū)動(dòng)程序。主程序只需通過調(diào)用驅(qū)動(dòng)程序提供的接口來實(shí)現(xiàn)數(shù)據(jù)的接收和發(fā)送,。驅(qū)動(dòng)程序包括四部分內(nèi)容:CAN控制器的初始化,、接收數(shù)據(jù)、發(fā)送數(shù)據(jù)和總線異常處理,。圖2為主程序流程圖,。
2.1 CAN控制器初始化
初始化CAN控制器的操作包括:硬件使能、軟件復(fù)位,、設(shè)置報(bào)警界限,、設(shè)置總線波特率、設(shè)置中斷工作方式" title="工作方式">工作方式,、設(shè)置驗(yàn)收濾波器" title="驗(yàn)收濾波器">驗(yàn)收濾波器工作方式,、設(shè)置工作模式并啟動(dòng)CAN等。初始化程序如下:
HwEnCAN(CanNum); //硬件使能,,CanNum=0~3,,指四路CAN控制器
SoftRstCAN(CanNum); //軟件復(fù)位寄存器
CANEWL(CanNum).Bits.EWL_BIT=USE_EWL_CAN[CanNum] ;//設(shè)置錯(cuò)誤警告界限
CANBTR(CanNum).Word = USE_BTR_CAN[CanNum] ;//初始化波特率
VICDefVectAddr =(UINT32)CANIntPrg; //初始化中斷為非向量中斷
VICIntEnable |=(1<<19)|(1<<(20+ CanNum))|(1<<(26+ CanNum));
CANIER(CanNum).Word= USE_INT_CAN[CanNum];
CANAFMR.Bits.AccBP_BIT=1;//配置驗(yàn)收濾波器(旁路狀態(tài),即屏蔽驗(yàn)收濾波器)
CANMOD(CanNum).Bits.TPM_BIT=USE_TPM_CAN[CanNum];//初始化工作模式
CANMOD(CanNum).Bits.LOM_BIT=USE_MOD_CAN[CanNum] ;
SoftEnCAN(CanNum); //啟動(dòng)CAN
LPC2294片內(nèi)外設(shè)與引腳的連接由引腳連接模塊控制,。CAN控制器的硬件使能就是通過軟件設(shè)置GPIO寄存器來控制多路開關(guān)的,,將特定的引腳與CAN控制器連接起來。在設(shè)置各CAN寄存器之前必須進(jìn)行軟件復(fù)位,,這是因?yàn)镃AN的某些寄存器必須在軟復(fù)位狀態(tài)下讀寫,。
值得注意的是,,LPC2294為所有的CAN控制器提供了全局接收標(biāo)識(shí)符查詢功能。2K字節(jié)的接收過濾用RAM可容納1024個(gè)標(biāo)準(zhǔn)標(biāo)識(shí)符或者512個(gè)擴(kuò)展標(biāo)識(shí)符或兩種類型混合的標(biāo)識(shí)符,。通過軟件處理,,可在該RAM中設(shè)置存放1~5個(gè)標(biāo)識(shí)符表格。與獨(dú)立CAN控制器SJA1000相比,,它能更容易地對(duì)任意復(fù)雜的ID進(jìn)行篩選過濾,,滿足復(fù)雜的ID的接收過濾要求。這無疑大大減少了系統(tǒng)軟件設(shè)計(jì)復(fù)雜度及運(yùn)行時(shí)的負(fù)擔(dān),。設(shè)置驗(yàn)收濾波器工作方式,,必須首先創(chuàng)建LUT表格,指定每個(gè)表格的起始地址,,并用實(shí)際的ID地址初始化該表格,。最后設(shè)定驗(yàn)收過濾器模式寄存器。若該節(jié)點(diǎn)不主動(dòng)發(fā)送數(shù)據(jù),,可選擇在總線不活動(dòng)時(shí)進(jìn)入睡眠模式,。
2.2 數(shù)據(jù)發(fā)送
將待發(fā)送的數(shù)據(jù)打包成符合CAN協(xié)議的幀格式后,便可寫入發(fā)送緩沖區(qū),,并啟動(dòng)發(fā)送,。圖3為發(fā)送子程序流程圖。
在寫發(fā)送緩沖區(qū)前必須查詢其狀態(tài),。LPC2294中的每個(gè)CAN控制器有三個(gè)發(fā)送緩沖區(qū),,它們的狀態(tài)可通過查詢CANSR得知,。只有當(dāng)其中有空閑的發(fā)送緩沖區(qū)時(shí)才可將數(shù)據(jù)寫入,。在發(fā)送大量數(shù)據(jù)時(shí),這一步顯得尤其重要,,否則發(fā)送可靠性將不能保證,。啟動(dòng)發(fā)送成功后,只能通過查詢CANGSR的TCS位或配合發(fā)送成功中斷來判斷數(shù)據(jù)是否發(fā)送成功,。
2.3 數(shù)據(jù)接收
接收數(shù)據(jù)可采用查詢方式或中斷方式,。在某一段時(shí)間內(nèi),CAN總線并不總是在活動(dòng),,為了提高效率,,可采用中斷方式。在初始化程序中必須使能接收中斷,。在中斷服務(wù)子程序中,,讀取CANICR,判斷是否有接收中斷標(biāo)志,有則讀取接收緩沖區(qū)數(shù)據(jù),。為了防止接收緩沖區(qū)數(shù)據(jù)溢出,,可開辟一個(gè)循環(huán)接收數(shù)據(jù)隊(duì)列來暫時(shí)存儲(chǔ)數(shù)據(jù),,主程序則通過查詢?cè)撽?duì)列來獲得總線數(shù)據(jù)。
2.4 異常情況處理
在總線發(fā)生嚴(yán)重故障的情況下,,CAN節(jié)點(diǎn)有可能脫離總線,,此時(shí)以下寄存器位被置位:CANSR的BS位、CANIR的BEI位和EI位(如果使能)和CANMOD的RM位,。RM將許多CAN控制器功能復(fù)位和禁止,。軟件下一步必須置零RM位。發(fā)送錯(cuò)誤計(jì)數(shù)器將遞減計(jì)數(shù)總線釋放條件(11個(gè)連續(xù)的隱性位)的第128個(gè)事件,。軟件可通過讀取Tx錯(cuò)誤計(jì)數(shù)器對(duì)計(jì)數(shù)器遞減計(jì)數(shù)的情況進(jìn)行監(jiān)測(cè),。
在應(yīng)用中,若前面?zhèn)鬏數(shù)紺AN控制器的數(shù)據(jù)未被讀出,,而接收緩沖區(qū)又沒有及時(shí)釋放,,就有可能引起后面信息的丟失。這時(shí)必須通過寫命令寄存器來清除CANSR的數(shù)據(jù)溢出位,。這兩種異??赏ㄟ^異常中斷來處理,只要在中斷子程序中加入處理代碼即可,。其它的總線異常處理可根據(jù)使用情況決定是否在軟件中處理,。
總之,軟件的編寫和規(guī)劃相當(dāng)重要,。ARM7TDMI指令集是基于RISC的,,具有32位ARM/16位Thumb雙指令集,ARM/Thumb程序可通過改寫程序狀態(tài)寄存器CPSR相互調(diào)用,。因此,,為了提高程序代碼密度,某些對(duì)性能要求不高的代碼可用Thumb指令集編寫,。
由于該方案體積小,、功耗低、抗干擾性好,,現(xiàn)已應(yīng)用于電磁環(huán)境復(fù)雜的某車載通信設(shè)備中,,滿足了該項(xiàng)目對(duì)CAN網(wǎng)絡(luò)節(jié)點(diǎn)的要求。
參考文獻(xiàn)
1 鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì).北京:北京航空航天出版社,,1996
2 周立功.ARM微控制器基礎(chǔ)與實(shí)戰(zhàn).北京:北京航空航天大學(xué)出版社,,2003
3 http://www.semiconductors.philips.com/pip/LPC2294.html
4 吳明暉.基于ARM的嵌入式系統(tǒng)開發(fā)與應(yīng)用.北京:人民郵電出版社,2004.6