王凱 海軍裝備部 710043
基于CompactPCI總線和DSP技術(shù)的數(shù)據(jù)采集板的設(shè)計
王凱 海軍裝備部 710043
本文是工程實踐中,利用TI高性能DSP器件TMS320LF2407實現(xiàn)對控制系統(tǒng)中轉(zhuǎn)塔角度的采集、轉(zhuǎn)速采集,是伺服系統(tǒng)控制中的重要環(huán)節(jié),并基于Compact總PCI線遷入控制計算機中,與主機完成實時通訊功能。
Compact;PCIDSP;數(shù)據(jù)采集;CPLD
并行總線技術(shù)的發(fā)展,使CompactPCI的優(yōu)勢很快在電信行業(yè)獨樹一幟,其優(yōu)良的結(jié)構(gòu)規(guī)范以及電器特性也正為工業(yè)控制、航空、航天領(lǐng)域逐步接受。信息化的發(fā)展使人們認識到其基礎(chǔ)是數(shù)字化,而數(shù)字化的核心技術(shù)之一是數(shù)字信號處理。數(shù)字信號處理的任務(wù)在很大程度上需要由DSP器件來完成。同時,DSP在各個領(lǐng)域日益增長的應(yīng)用帶動了DSP自身的發(fā)展, DSP在其他領(lǐng)域的潛力也是巨大的。
數(shù)據(jù)采集板作為某型號計算機中一塊嵌入式控制板,與伺服控制板、通訊控制板以及CPU板構(gòu)建成一套高性能整機,處于控制系統(tǒng)的核心控制地位,完成實時采集陀螺、旋轉(zhuǎn)變壓器的數(shù)據(jù),采集系統(tǒng)探測信息,通過伺服軟件的PID算法,由D/ A變換輸出模擬校正量到伺服電子箱,實現(xiàn)伺服系統(tǒng)的閉環(huán)控制。
數(shù)據(jù)采集板采用TI公司的高性能DSP器件TMS320LF2407為核心,通過Compact PCI總線受主控計算機的控制,對系統(tǒng)提供的信息,經(jīng)過數(shù)據(jù)采集軟件處理,輸出模擬量給伺服電子箱。高性能D S P器件TMS320LF2407是TI公司2x系列中的高端產(chǎn)品,主頻最高為50MHz,并采用低功耗設(shè)計,工作電壓為3.3V,外圍器件工作電壓以3.3V為多,大大降低了數(shù)據(jù)采集板的功耗。在實際設(shè)計中,外部程序可燒入片上FlashRAM 器件(256K×32bit),實現(xiàn)了在線編程的特點,大大提高了系統(tǒng)的可操作性和可維護性。角度采集器件選用高分辨率(19bit)高精度(±2lsb)器件,數(shù)據(jù)存儲空間選用高速RAM(256x32bit)掛接在DSP的本地總線上,3.3V信號與5V信號采用74LVCC16245A隔離,大容量可編程器件完成DSP對外部資源控制的譯碼以及兩路同步同步串口數(shù)據(jù)采集變換。
TMS320LF2407 DSP器件采用雙端口RAM 實現(xiàn)與伺服控制板以及與主機通訊,DSP器件分別以5和2、1m s(可選)為采樣和處理周期,實時采集轉(zhuǎn)塔的位置信息,以及陀螺、旋轉(zhuǎn)變壓器的數(shù)據(jù),并把采集結(jié)果發(fā)送給主機及伺服控制板。硬件看門狗電路實現(xiàn)對模板軟件監(jiān)控,在程序跑飛情況下,實現(xiàn)對DSP以及外部電路的軟復(fù)位并向主機報錯。主機每隔20m s讀取雙端口RAM中的數(shù)據(jù),DSP在完成每次處理5m s(包含2m s或1m s),在雙端口RAM 中寫入相應(yīng)的處理結(jié)果或工作狀態(tài)信息,供主機查詢,避免了DSP與主機之間的中斷處理時間。
圖1 數(shù)據(jù)采集板功能框圖
PCI橋選用PLX公司的PCI9052橋芯片,工作模式為Lacal方式,PCI9052是PLX公司繼PCI9050之后推出的低成本PCI總線接口芯片,低功耗,PQFP160p in s封裝,可以使局部總線快速轉(zhuǎn)換到PCI總線上。其主要特點如下:
符合PCI2.1規(guī)范,支持低成本從屬適配器
包括一個64Byte的寫FIFO和一個32Byte的讀FIFO,通過讀寫FIFOs,可實現(xiàn)高性能的突發(fā)式數(shù)據(jù)傳輸;
支持兩個來自局部總線的中斷,可生成一個PCI中斷,利用軟件寫內(nèi)部寄存器位也可以達到同樣的目的;
PCI9052的局部總線與PCI總線的時鐘相互獨立運行,局部總線的時鐘頻率范圍為0~40MHz,TTL電平,PCI的時鐘頻率范圍為0~33MHz。兩種總線的異步運行方便了高低速設(shè)備的兼容;
可編程的局部總線配置,支持復(fù)用或非復(fù)用模式的8、16或32位的局部總線;
4個局部設(shè)備片選信號,各設(shè)備的基址和地址范圍及其映射可由串行EEPROM或主機編程實現(xiàn);
支持Big/Little Endian 編碼字節(jié)的轉(zhuǎn)換;
局部總線等待狀態(tài),除了用于握手的等待信號LRDYI# 外,PCI9052還有一個內(nèi)部等待產(chǎn)生器(包括地址到數(shù)據(jù)周期、數(shù)據(jù)到數(shù)據(jù)周期和數(shù)據(jù)到地址周期的等待);
可編程實現(xiàn)讀寫信號選通的延遲和寫周期的保持;
可編程器件邏輯設(shè)計
在CPLD內(nèi)部邏輯設(shè)計上,我們在本文中主要對同步串口的設(shè)計進行比較詳細的描述,其余為控制譯碼邏輯設(shè)計,在此不再贅述。
本模板的軟件設(shè)計包括TMS320LF2407相關(guān)軟件的編寫,Vxworks嵌入式操作系統(tǒng)下的驅(qū)動程序和測試軟件的編寫。
3.1 TMS320LF2407相關(guān)軟件
TMS320LF2407軟件的編寫相信大家也比較熟悉,在此主要強調(diào)對.cm d文件的編寫:
C編譯器對C語言程序編譯后生成六個可以重新定位的代碼和數(shù)據(jù)塊,這些塊可以用不同的方式分配至存儲器以符合不同系統(tǒng)配置的要求。這六個塊可以分為兩種類型:已初始化塊和未初始化塊。已初始化主要包括數(shù)據(jù)表和可執(zhí)行代碼。C編譯器共創(chuàng)建三個已初始化塊:.text塊(包括可執(zhí)行代碼和字符串)、.cinit塊(包含初始化變量和常數(shù)表)和.const塊(字符串和. swith表)。未初始化塊用于保留存儲器空間,程序運行時利用這些空間創(chuàng)建和存儲變量。C編譯器創(chuàng)建三個未初始化塊:.bss塊(用于保留全局和靜態(tài)變量空間)和. stack塊(為系統(tǒng)堆棧分配存儲器)和. system塊(為動態(tài)存儲器函數(shù)分配存儲空間)。
依據(jù)C33的系統(tǒng)資源分配,構(gòu)建系統(tǒng)的CMD文件代碼,在生成COFF(*.out)文件過程中,依據(jù)CMD內(nèi)容把六個代碼和數(shù)據(jù)段定位到RAM區(qū)的不同地址段上。
以下是本模板的.cmd 文件:
在程序調(diào)試完畢后就可把最終的COFF(.out)可執(zhí)行文件用文件轉(zhuǎn)換程序HEX30制作成可寫入FlashRAM 的16進制BOOT文件,燒寫入Flash RAM 中即可。
3.2 VxWorks驅(qū)動程序
該模板實際使用時工作在VxWorks操作系統(tǒng)下,因此,必須為它編寫VxWorks操作系統(tǒng)下的驅(qū)動程序。
VxWorks中對PCI設(shè)備的操作,首先應(yīng)在系統(tǒng)中找到所需的PCI設(shè)備,然后從它的配置空間中將所需的資源信息取出來,如內(nèi)存基地址、I/O 基地址、中斷號等,再根據(jù)這些信息及設(shè)備的特性對其進行初始化。
3.2.1 查找PCI設(shè)備
在系統(tǒng)中查找PCI設(shè)備所必需的是設(shè)備的vendor ID和device ID。有了這兩個信息,就可以調(diào)用pciFind Device()函數(shù)進行查找,pciFind Device()的原型為:這個函數(shù)尋找與指定的vendorId和deviceId相同的第index個設(shè)備。
該函數(shù)若成功執(zhí)行,則返回OK,此時在pBusNo,pDeviceNo和pFuncNo中存的是找到的PCI設(shè)備的總線號、設(shè)備號及功能號,這些信息在后面的操作中將會用到。若函數(shù)執(zhí)行不成功,則返回ERROR。
3.2.2 獲取PCI設(shè)備信息
找到PCI設(shè)備后,下一步就是要將它的資源信息從配置空間中讀出來。對配置空間的讀寫操作一般使用下面的這些函數(shù):
還有一些其它的函數(shù)可進行對PCI配置空間的操作,具體內(nèi)容可以參看VxWorks幫助。
獲取PCI設(shè)備的I/O基地址或內(nèi)存基地址
可以使用下面的函數(shù)來獲取PCI設(shè)備所分配的內(nèi)存資源:
其中pActualRes是一個結(jié)構(gòu)體,里面保存與PCI設(shè)備相關(guān)的信息,定義如下:
pActualRes.pciBus,pActualRes. pciDevice,pActualRes.pciFunc分別是執(zhí)行pciFindDevice()函數(shù)時獲得的pBusNo,pDeviceNo, pFuncNo 。PCI_CFG_BASE_ADDRESS_0 是要讀取的數(shù)據(jù)在PCI配置空間中的偏移量,它們在文件pciConfigLib.h中定義,BaseAddress為讀出的I/O空間的基地址或內(nèi)存空間基地址,具體是哪一類空間由讀出數(shù)據(jù)的最低位來判斷,若最低位為0,則為內(nèi)存空間,為1,則是I/O空間。
若讀出的是I/O空間基地址,在使用前,需先將它和PCI_IOBASE_MASK 進行與運算,以屏蔽最低兩位。PCI_IOBASE_MASK 也在pciConfigLib.h中定義。
得到基地址后,可用下面的函數(shù)進行內(nèi)存或I/O的讀寫操作:
還有一些其它的相關(guān)函數(shù),它們的定義在syslib.h中。
獲取PCI設(shè)備的IRQ:
對分配有中斷的設(shè)備,可以用下面的函數(shù)來得到系統(tǒng)為它分配的中斷資源:
irq中是讀出的PCI設(shè)備的IRQ。知道了IRQ后,還需要知道中斷向量,X86平臺的機器上中斷向量為IRQ+0X20。得到中斷向量后,就可以將中斷與中斷服務(wù)程序連接起來。一般設(shè)備將中斷與中斷服務(wù)程序連接時用intConnect()函數(shù),而對于PCI設(shè)備則需用pciIntConnect,如:
pciIntConnect (INUM_TO_IVEC(ivec), isr,0)
其中ivec為中斷向量,isr為中斷服務(wù)程序,最后是傳給中斷服務(wù)例程的參數(shù)。
3.3 測試程序的編寫
驅(qū)動程序編寫完成后,進行編譯,連接后生成驅(qū)動程序目標(biāo)代碼,將其拷貝到相應(yīng)bsp目錄下,并在config.h文件中加入對該設(shè)備的聲明。
創(chuàng)建一個新的工程文件,在builds->macros->Extra MODULES->Value 中添入生成的驅(qū)動程序文件,具體路徑需根據(jù)實際情況改變。
使用時驅(qū)動程序時,必須先調(diào)用先對驅(qū)動程序進行安裝,例:
從設(shè)備中讀取數(shù)據(jù)時,使用read()函數(shù),其調(diào)用格式如下:
向設(shè)備中寫入數(shù)據(jù)時,使用w rite()函數(shù),其調(diào)用格式如下:
其中fd為打開的設(shè)備句柄,inbuf為接收緩沖區(qū),outbut為輸出緩沖區(qū),len為輸入輸出的長度。
[1]蘇濤,蔡建隆,何學(xué)輝.DSP接口電路設(shè)計與編程.西安:西安電子科技大學(xué)出版社.2003
[2]http://focus.ti.com/dsp
10.3969/j.issn.1001-8972.2011.09.074