李 芮,李 曉,王志斌
(中北大學山西省光電信息與儀器工程技術(shù)研究中心,山西太原030051)
為研制用面陣探測器的具有高速峰值檢測和實時判斷功能的高性能激光告警接收機,需要設(shè)計一種新型激光實時探測原理實驗系統(tǒng):采用總線結(jié)構(gòu)和通信協(xié)議,以面陣焦平面探測器為光電轉(zhuǎn)換器,高速FPGA為信號處理單元,做到對激光信號的快速采集與并行處理,滿足高速、實時的信號傳輸與處理技術(shù)的要求。
由于激光信號的特殊性,必須做到信號的實時采集,并且保證在采集數(shù)據(jù)的同時,可以對上一幀的數(shù)據(jù)進行處理。在處理數(shù)據(jù)的同時又要采集下一幀數(shù)據(jù),并且實現(xiàn)激光告警。這就對電路的高速信號處理能力提出了要求,必須能夠在很短的時間內(nèi)完成上述操作,這些都是單片機無法做到的。而FPGA采用并行數(shù)據(jù)處理方法,能夠達到系統(tǒng)的高速信號處理要求[1,2]。CAN總線是控制器局域網(wǎng)絡(luò),其節(jié)點數(shù)最多可達110個。目前CAN已經(jīng)形成國際標準,并被公認為幾種最有前途的現(xiàn)場總線之一[3,4]。因此,在本系統(tǒng)中采用FPGA處理輸出結(jié)果通過CAN總線接口和計算機或者與其它微控制器相連,對其采集的數(shù)據(jù)進行監(jiān)控。
本文將重點研究此系統(tǒng)中如何實現(xiàn)FPGA與單片機的CAN總線通信部分,將FPGA高速采集快速處理得到的激光信號的波長和方向等信息,經(jīng)CAN總線傳輸給單片機,并且驅(qū)動單片機進行顯示。
由于其工作時間相對較長,選用Altera公司的Cyclone II系列的低功耗處理器EP1C6Q240C8型芯片,提供185個IO接口。該芯片采用240腳的PQFP封裝,擁有5980個Les。該芯片內(nèi)部帶有288K的ram和2個鎖相環(huán),可以保證高速運行時時鐘信號的穩(wěn)定性,有較強的數(shù)據(jù)處理能力。考慮到必須具有高抗干擾性、高信噪比、高可靠性,芯片采用貼片型240腳的PQFP封裝形式。其晶振采用50Mhz,時鐘周期為20ns,并引出15個I/O接口,分別用于控制CAN控制器控制信號d0-d7、reset、ale、cs、rd、wr以及電平轉(zhuǎn)換芯片方向控制信號tr1、tr2。硬件電路如圖1所示。
圖1 FPGA節(jié)點硬件電路
SJA1000是一款新型的CAN控制器,與PCA82C200 CAN控制器相比,它增加了一種新的操作模式——PeliCAN模式,能夠自動完成CAN-bus協(xié)議的解析,常用于建立CAN設(shè)備的核心電路,被廣泛應用在各種CAN電路設(shè)計中[5]。SJA1000內(nèi)部具有8位并行地址/數(shù)據(jù)復用總線,有Intel和Motorola時序2種模式可供選擇,在這里將SJA1000的MODE引腳拉高接到+5V,采用Intel時序。采用旁路CAN輸入比較器,這主要用于SJA1000外接發(fā)送接收電路時,減少內(nèi)部延時,使總線長度最大可能地增加。應將RX1引腳接到一個確定的電平,這里將RX1引腳接到CAN收發(fā)器的Vref引腳,將RX0、TX0引腳分別接到CAN收發(fā)器的RXD、TXD引腳,并將其TX1引腳懸空。由于FPGA不存在總線中斷,故將其INT引腳懸空。具體電路圖如圖2所示。
收發(fā)器是一種專用器件,用來完成CAN-bus物理層電信號的轉(zhuǎn)換。在這里采用82C250作為CAN控制器與物理總線之間的接口。將其RS引腳 (斜率電阻輸入端)接47K電阻后接地,用于降低射頻干擾。在CANH和CANL之間需要接一個120Ω的總線阻抗匹配電阻[6]。具體電路圖如圖3所示。
圖2 CAN控制器SJA1000電路
圖3 CAN收發(fā)器82C250電路
由于SJA1000的控制管腳都是5V的COMS邏輯,它的高電平的最小值為4.6V,F(xiàn)PGA的3.3V的TTL邏輯不能滿足它的要求。因此在設(shè)計中,采用了TI公司的5V和3.3V雙向電平轉(zhuǎn)換芯片74LVC4245 2片,此芯片一片可以實現(xiàn)8個信號電平的轉(zhuǎn)換,把SJA1000的5V COMS電平信號d0-d7、reset、ale、cs、rd、wr轉(zhuǎn)換成3.3V TTL標準信號,連接到FPGA的引腳上。在使用電平轉(zhuǎn)換芯片時,注意要將SJA1000的地址數(shù)據(jù)復用引腳d0-d7連接到其中一片74LVC4245上,其它控制信號引腳連接到另一片芯片上,便于讀時序時對其電平轉(zhuǎn)換方向進行控制。并將其OE引腳接地,使其始終處于片選使能狀態(tài)。具體電路圖如圖4、圖5所示。
圖4 電平轉(zhuǎn)換芯片74LVC4245電路
圖5 電平轉(zhuǎn)換芯片74LVC4245電路
由于后續(xù)數(shù)據(jù)顯示只占用很少量的存儲空間,而且對微處理器速度、功能等方面要求不高,所以選用低成本、低功耗的微控制芯片89C52,用來作為顯示編碼、驅(qū)動、控制等面向用戶的工作。其晶振采用11.0592Mhz。其復位電路采用按鍵復位和上電自動復位2種,便于操作與控制。
在單片機節(jié)點中同樣采用SJA1000作為CAN控制器,與FPGA電路中不同的是,將SJA1000的中斷輸出引腳INT與單片機的P3.3引腳相連,用于控制單片機進入中斷處理程序。同樣采用82C250作為CAN收發(fā)器。為了方便控制CAN報文的發(fā)送,在單片機節(jié)點電路設(shè)計中,增加了按鍵電路,按鍵電路與單片機的P3.2引腳INT0相連,按下按鍵時會進入外部中斷0中斷處理子程序,啟動CAN報文的發(fā)送,并使發(fā)送數(shù)據(jù)遞增 1[7,8]。
FPGA節(jié)點中CAN總線接口采用verilog語言描述。在這里將FPGA程序設(shè)計分為3個部分:SJA1000初始化、發(fā)送操作和接收操作。具體流程圖如圖6所示。
SJA1000內(nèi)部有多個寄存器,其內(nèi)部寄存器對微控制器來說是以外部寄存器形式編址的片內(nèi)存儲器[9]。SJA1000的控制信號主要有復位控制信號reset、地址/數(shù)據(jù)復用總線ad0-ad7、地址鎖存信號ale、片選信號cs、讀信號rd和寫信號wr。此外,還有2個控制電平轉(zhuǎn)換芯片74LVC4245的電平轉(zhuǎn)換方向的信號tr1、tr2,其中tr1對應ad0-ad7信號的電平轉(zhuǎn)換,tr2對應其它信號的電平轉(zhuǎn)換。上電后,先將SJA1000復位控制信號拉低,計數(shù)延時一段時間后將其拉高,完成SJA1000的復位。在SJA1000復位過程中將地址鎖存信號ale拉低、讀信號rd拉高、寫信號wr拉高,電平轉(zhuǎn)換方向控制信號tr1、tr2拉低,使其處于3.3V轉(zhuǎn)向5V方向,并將片選信號cs拉低,使其一直處于片選使能狀態(tài),方便對其進行讀寫操作。
在對SJA1000初始化的過程中,先向模式寄存器0x00寫入0x09,使其進入復位模式。然后對SJA1000內(nèi)部寄存器進行配置,分別向時鐘分頻寄存器、總線時序0/1寄存器、中斷使能寄存器、輸出控制寄存器、命令寄存器寫入0x88、0x03和0x1c、0x01、0xaa、0x04,向驗收代碼寄存器0-3、驗收屏蔽寄存器0-3寫入0x11、0x22、0x33、0x44和0xff、0xff、0xff、0xff。最后,再向模式寄存器寫入 0x08,使其退出復位模式,進入操作模式。完成對SJA1000的初始化工作。
在檢測到發(fā)送標志位置1時,F(xiàn)PGA進入發(fā)送操作。在發(fā)送數(shù)據(jù)之前,先對SJA1000內(nèi)部狀態(tài)寄存器進行讀操作,并判斷其SR.3和SR.2位是否置位,只有當這2位同時置1,即最近一次發(fā)送已成功,并且發(fā)送緩沖器為空時,才可進行發(fā)送操作。進入發(fā)送操作后,分別對SJA1000發(fā)送緩沖器寫入 TX幀信息 0x81、TX標識碼 0x11、0x22、0x33、0x44、TX數(shù)據(jù)字節(jié)。其中TX幀信息0x81代表發(fā)送含有一個字節(jié)數(shù)據(jù)的擴展格式的數(shù)據(jù)幀,所以這里每次發(fā)送時,只向CAN地址21寫入一個字節(jié)的數(shù)據(jù),而其它TX數(shù)據(jù)字節(jié)寄存器未用。寫完要發(fā)送的數(shù)據(jù)后,向SJA1000內(nèi)部命令寄存器寫入0x01,置位發(fā)送請求,完成發(fā)送操作。
在檢測到接收標志位置1時,F(xiàn)PGA進入接收操作。在接收數(shù)據(jù)之前,先對SJA1000內(nèi)部中斷寄存器進行讀操作,并判斷其IR.0位是否置位,當其置1,即接收緩沖器中有數(shù)據(jù),且中斷使能寄存器IER.0位被置1時,才可進行接收操作。進入接收操作后,分別從SJA1000接收緩沖器中讀取一個字節(jié)的RX幀信息、4個字節(jié)的RX標識碼和一個字節(jié)的數(shù)據(jù)。由于單片機發(fā)送的是含有一個字節(jié)數(shù)據(jù)的擴展格式的數(shù)據(jù)幀,所以這里只從CAN地址21讀取一個字節(jié)的數(shù)據(jù),而未對其它RX數(shù)據(jù)字節(jié)寄存器進行讀取。讀取完要接收的數(shù)據(jù)后,向SJA1000內(nèi)部命令寄存器寫入0x04,釋放接收緩沖器,以便讀取下一條報文。釋放接收緩沖器后,分別對SJA1000內(nèi)部仲裁丟失捕捉寄存器、錯誤代碼捕捉寄存器進行讀取,釋放仲裁丟失捕捉寄存器和錯誤代碼捕捉寄存器[10]。
寫時序如圖7所示。
圖7 SJA1000 intel模式寫時序
這里根據(jù)SJA1000寫時序?qū)懖僮鞣譃?個狀態(tài):
(1)狀態(tài)1:地址鎖存信號ale置1有效,向地址/數(shù)據(jù)復用總線ad0-ad7寫入地址。進入下一個狀態(tài)。
(2)狀態(tài)2:將地址鎖存信號ale拉低,完成對地址的鎖存。進入下一個狀態(tài)。
(3)狀態(tài)3:將寫信號拉低,并向地址/數(shù)據(jù)復用總線ad0-ad7寫入數(shù)據(jù)。進入下一個狀態(tài)。
(4)狀態(tài)4:將寫信號拉高,完成寫操作。
讀時序如圖8所示。
圖8 SJA1000 intel模式讀時序
這里根據(jù)SJA1000讀時序,F(xiàn)PGA對于inout引腳ad0-ad7的三態(tài)門處理以及電平轉(zhuǎn)換芯片74LVC4245的方向控制,將讀操作分為9個狀態(tài)。
(1)狀態(tài)1:地址鎖存信號ale置1有效,向地址/數(shù)據(jù)復用總線ad0-ad7寫入地址。進入下一個狀態(tài)。
(2)狀態(tài)2:將地址鎖存信號ale拉低,完成對地址的鎖存。進入下一個狀態(tài)。
(3)狀態(tài)3:向地址/數(shù)據(jù)復用總線ad0-ad7寫入高阻態(tài),將電平轉(zhuǎn)換方向控制信號tr1拉高,使其處于5V轉(zhuǎn)向3.3V方向,準備從SJA1000中讀取數(shù)據(jù)。進入下一個狀態(tài)。
(4)狀態(tài)4:此狀態(tài)為空狀態(tài),用于等待74LVC4245改變電平轉(zhuǎn)換方向。進入下一個狀態(tài)。
(5)狀態(tài)5:將讀信號拉低,開始從SJA1000中讀取數(shù)據(jù)。進入下一個狀態(tài)。
(6)狀態(tài)6:此狀態(tài)為空狀態(tài),用于等待讀取數(shù)據(jù)完成。進入下一個狀態(tài)。
(7)狀態(tài)7:對讀取的數(shù)據(jù)進行采樣,將ad中的值賦給ad_out,可進行存儲或輸出。進入下一個狀態(tài)。
(8)狀態(tài)8:將讀信號拉高,完成讀操作,將電平轉(zhuǎn)換方向控制信號tr1拉低,使其處于3.3V轉(zhuǎn)向5V方向。進入下一個狀態(tài)。
(9)狀態(tài)9:此狀態(tài)為空狀態(tài),用于等待74LVC4245改變電平轉(zhuǎn)換方向。進入下一個狀態(tài)。
在使用單片機89C52對CAN控制器SJA1000內(nèi)部寄存器進行訪問時,將其內(nèi)部寄存器當作以外部寄存器形式編址的片內(nèi)存儲器。與FPGA不同的是,需要在程序的最初對單片機進行中斷初始化。發(fā)送時采用按鍵的方式使單片機進入外部中斷0,在使被發(fā)送的數(shù)據(jù)自增1的同時,置位發(fā)送請求。接收時,通過SJA1000輸出的int信號拉低,使單片機進入外部中斷1,并將接收到的一個字節(jié)數(shù)據(jù)顯示在數(shù)碼管上。其它初始化過程、發(fā)送過程以及接收過程程序與FPGA節(jié)點程序類似[11]。
在quartusII中分別對FPGA節(jié)點發(fā)送過程和FPGA節(jié)點接收過程進行了仿真,仿真圖如圖9、圖10所示。
圖9 FPGA節(jié)點發(fā)送操作過程仿真
圖10 FPGA節(jié)點接收操作過程仿真
在實驗過程中,由FPGA節(jié)點向單片機節(jié)點以2s的間隔依次發(fā)送 0x11、0x22、0x33、0x44、0x55、0x66、0x77、0x88,單片機節(jié)點接收到數(shù)據(jù)后,將16進制數(shù)據(jù)轉(zhuǎn)換為10進制數(shù)據(jù),并在數(shù)碼管上顯示出來。再通過按鍵的方式由單片機節(jié)點向 FPGA節(jié)點依次發(fā)送 0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08,F(xiàn)PGA節(jié)點接收到數(shù)據(jù)之后,將數(shù)據(jù)進行采樣輸出到相應的I/O引腳上,通過測量相應引腳電平值得以驗證無誤。
通過FPGA控制SJA1000實現(xiàn)與單片機的CAN總線通信,與傳統(tǒng)的單片機CAN總線通信相比,降低了體積與重量,解決了傳統(tǒng)的單片機與單片機進行CAN總線通信時,單片機處理數(shù)據(jù)速度較慢,以及應用面較窄等問題。使CAN總線通信擁有了一種新的實現(xiàn)方法,并在高性能激光告警接收機中得到了成功應用。
[1]YE Qing,YAO Longhai,CHEN Changjun.FPGA and DSP based digital laserwarning system design[J].Optic Technology Application,2006,21(3):5-8(in Chinese).[葉慶,姚龍海,陳長俊.基于FPGA和DSP的數(shù)字激光告警系統(tǒng)的設(shè)計[J].光電技術(shù)應用,2006,21(3):5-8.]
[2]GE Yaming,PENG Yongfeng,XUE Bing,et al.Zero-based learning FPGA Altera FPGA-based devices & verilog HDL language[M].Beijing:Mechanical Industry Press,2010(in Chinese).[葛亞明,彭永豐,薛冰,等.零基礎(chǔ)學FPGA基于Altera FPGA器件 & Verilog HDL語言 [M].北京:機械工業(yè)出版社,2010.]
[3]YANGChunjie,WANG Shuguang,KANG Hongbo,etal.CAN bus technology[M].Beijing:Beijing University of Aeronautics and Astronautics Press,2010(in Chinese).[楊春杰,王曙光,亢紅波,等.CAN總線技術(shù)[M].北京:北京航空航天大學出版社,2010.]
[4]XU Mushui,LIU Jinguo.FPGA-based CAN bus communication interface design [J].Electronic Design Engineering,2010,18(10):96-99(in Chinese).[徐木水,劉金國.基于FPGA的CAN總線通信接口的設(shè)計 [J].電子設(shè)計工程,2010,18(10):96-99.]
[5]ZHOU Ligong.Project drive-CAN-bus field busbased tutorial[M].Beijing:Beijing University of Aeronautics and Astronautics Press,2012(in Chinese).[周立功.項目驅(qū)動--CAN-bus現(xiàn)場總線基礎(chǔ)教程[M].北京:北京航空航天大學出版社,2012.]
[6]ZHANG Peikun,GAO Wei,SONG Zongxi,et al.FPGA-based CAN bus communication node design[J].Instrument Technique and Sensor,2010(12):68-70(in Chinese).[張培坤,高偉,宋宗喜,等.基于FPGA的CAN總線通信節(jié)點設(shè)計[J].儀表技術(shù)與傳感器,2010(12):68-70.]
[7]ZHANG Yingchun,JIMaosheng.Based MCU CAN bus system design[J].Computer and Network,2012(5):52-54(in Chinese).[張迎春,季茂勝.基于單片機的CAN總線系統(tǒng)設(shè)計[J].計算機與網(wǎng)絡(luò),2012(5):52-54.]
[8]LIU Tao,ZHANG Chunwei.Based on 89C51 and SJA1000 CAN communication method[J].Computer Programming Skills & Maintenance,2011(4):87-89(in Chinese).[劉濤,張純偉.基于89C51和SJA1000的CAN通信方法研究[J].電腦編程技巧與維護,2011(4):87-89.]
[9]YUE Kui,LIU Shaojun,HUANG Daoping,et al.SJA1000 registers of the VHDL language literacy design and application [J].Computer and Digital Engineering,2009(1):175-178(in Chinese).[岳奎,劉少君,黃道平.SJA1000內(nèi)寄存器的VHDL語言讀寫設(shè)計與應用[J].計算機與數(shù)字工程,2009(1):175-178.]
[10]LIHongtao,ZHOU Xiaohua,GU Chen.Verilog HDL and FPGA development,design and application[M].Beijing:National Defense Industry Press,2013(in Chinese).[李洪濤,朱曉華,顧陳.Verilog HDL與FPGA開發(fā)設(shè)計及應用 [M].北京:國防工業(yè)出版社,2013.]
[11]CHEN Yehai,RONGmengtian.89C51 microcontroller-based CAN bus system design[J].Electronic Component Applications,2008,10(9):42-44(in Chinese).[陳燁海,戎蒙恬.基于單片機89C51的 CAN總線系統(tǒng)設(shè)計 [J].電子元器件應用,2008,10(9):42-44.]