基于LabVIEW和ARM嵌入式數(shù)據(jù)采集與遠(yuǎn)程傳輸控制系統(tǒng)
b)Control_register:控制寄存器。內(nèi)部模塊有序工作的核心,具體的控制定義見表2。本文引用地址:http://www.ex-cimer.com/article/152253.htm
c)Config_6620:配置AD6620。此模塊在Conf 6620位有效時(shí)接收由ARM傳來的AD6620配置信息,完成DDC濾波器和控制寄存器配置。它除了本身使用ARM地址總線的3位ARM ADD[3:1]作為FPGA內(nèi)部模塊選擇之外,還用了ARM ADD[6:4]作為AD6620的外部接口寄存器地址。Rdy in信號(hào)用于指示寫入操作成功,ARM檢測(cè)到此信號(hào)有效后,進(jìn)行下一次的寫操作。
d)PII:鎖相環(huán)。Cyclone EP1C6Q240中有2個(gè)鎖相環(huán)模塊,設(shè)計(jì)中使用了其中的一個(gè)將20 MHz的時(shí)鐘倍頻至50 MHz,供AD9244,AD6620以及FPGA內(nèi)部使用。
e)Ad_to_sram:AD6620輸出數(shù)據(jù)寫入SRAM時(shí)序產(chǎn)生模塊。AD6620工作在單通道模式時(shí)典型輸出時(shí)序見圖。
此模塊主要完成的功能有:用2個(gè)數(shù)據(jù)鎖存器在DV與IQ信號(hào)的控制下鎖存I路和Q路數(shù)據(jù),產(chǎn)生寫SRAM所需的地址。由于AD6620抽取率較高的緣故,輸出數(shù)據(jù)率一般較低,在模塊中使用了狀態(tài)機(jī)在2次有效數(shù)據(jù)期間產(chǎn)生寫SRAM的時(shí)序。此外,當(dāng)寫地址到達(dá)設(shè)定值時(shí),模塊產(chǎn)生寫溢出中斷,提示ARM改變控制寄存器內(nèi)容,讀取數(shù)據(jù)。
a)Read_add_gen:讀地址產(chǎn)生。在Fetch_sram位的控制下,產(chǎn)生讀SRAM時(shí)的地址,當(dāng)讀地址到達(dá)設(shè)定值時(shí),產(chǎn)生讀溢出中斷,提示ARM改變控制寄存器內(nèi)容,進(jìn)行下一步操作。
b)Control_logic:控制邏輯。模塊在Start_daq有效時(shí)選擇由Ad_to_sram模塊產(chǎn)生的寫SRAM的地址、數(shù)據(jù)與控制總線與SRAM相接,而在Fetch_sram有效時(shí)選擇讀SRAM的地址、數(shù)據(jù)與控制總線與SRAM相接。與DMA讀取有關(guān)的請(qǐng)求與響應(yīng)信號(hào)也在此模塊中處理。
3.3 嵌入式Linux驅(qū)動(dòng)程序設(shè)計(jì)
驅(qū)動(dòng)程序是硬件與應(yīng)用程序的接口。針對(duì)設(shè)計(jì)任務(wù)與硬件特點(diǎn),在驅(qū)動(dòng)程序中設(shè)計(jì)了以下函數(shù):
a) AD6620_read:申請(qǐng)DMA緩存,睡眠等待寫溢出中斷到來,DMA傳輸完成后,將數(shù)據(jù)從內(nèi)核空間傳送至用戶空間,釋放DMA緩存。
b) AD6620_ioctl:核心是一個(gè)switch選擇結(jié)構(gòu),根據(jù)應(yīng)用程序中用戶命令,完成初始化DMA,寫控制寄存器或者配置AD6620的工作。
c)AD6620 open:主要完成DMA通道參數(shù)設(shè)置,初始化IO端口和信號(hào)量。
d) AD6620 release:完成與AD6620_open相反的工作,主要是一些清理和釋放申請(qǐng)資源的工作。
函數(shù)編寫好后,通過下面的file_operations結(jié)構(gòu)體聯(lián)系起來:
e) AD6620 init:初始化函數(shù),完成驅(qū)動(dòng)程序注冊(cè)、中斷與中斷處理函數(shù)注冊(cè)、創(chuàng)建設(shè)備文件節(jié)點(diǎn)等。其中的驅(qū)動(dòng)程序注冊(cè)的核心就是上面的file_operations結(jié)構(gòu)體。
驅(qū)動(dòng)程序編寫好后,用戶就可以在應(yīng)用程序中調(diào)用這些函數(shù),實(shí)現(xiàn)通過一組標(biāo)準(zhǔn)化的調(diào)用來操作底層硬件。
3.4 客戶端應(yīng)用程序
客戶端應(yīng)用程序?yàn)榱吮WC數(shù)據(jù)與控制信息的可靠傳輸,采用的是基于TCP協(xié)議的Socket網(wǎng)絡(luò)編程。本次設(shè)計(jì)客戶端運(yùn)行在ARM上,采用的是Linux下的C編程;而服務(wù)器端運(yùn)行在遠(yuǎn)程主機(jī)上,利用LabVIEW的圖形化語言實(shí)現(xiàn)。具體客戶端的通信與控制流程圖見圖4??梢钥闯???蛻舳耸且蕾囉谧x取由遠(yuǎn)程主機(jī)發(fā)送的控制字符來完成實(shí)時(shí)控制,實(shí)現(xiàn)與服務(wù)器端的交互操作的。因此,無論是客戶端還是服務(wù)器端,在每一次發(fā)送數(shù)據(jù)與控制信息時(shí),都會(huì)發(fā)送一個(gè)控制字符,接收端就是依靠識(shí)別此字符來完成相應(yīng)的操作。表3中給出了控制字符與所執(zhí)行操作之間的對(duì)應(yīng)關(guān)系。
3.5 LabVIEW服務(wù)器程序設(shè)計(jì)
服務(wù)器端的完整程序見圖5。服務(wù)器在指定的端口上偵聽,等待遠(yuǎn)程客戶端的連接。程序的核心是兩個(gè)循環(huán)框,上面的循環(huán)框完成發(fā)送數(shù)據(jù)和控制信息的任務(wù),主要包括傳送AD6620濾波器設(shè)計(jì)與控制寄存器配置文件、實(shí)時(shí)改變AD6620可動(dòng)態(tài)配置寄存器內(nèi)容、開始數(shù)據(jù)采集以及停止系統(tǒng)控制等模塊。
評(píng)論