楊 斌,滿 峰,姜秀杰,劉 波
(1.中國(guó)科學(xué)院 空間科學(xué)與應(yīng)用研究中心,北京 100190;2.中國(guó)科學(xué)院 研究生院,北京 100049)
在數(shù)據(jù)采集系統(tǒng)中,通常是通過(guò)傳感器將自然世界的物理量轉(zhuǎn)化成電量,電量是模擬量,必須經(jīng)過(guò)模/數(shù)轉(zhuǎn)換才能被系統(tǒng)的處理器讀取。現(xiàn)在的很多微處理器都有片內(nèi)AD,但這些AD 多數(shù)是8 位、10 位或者12 位,有時(shí)候很難滿足精度要求。所以需要利用處理器的接口資源外擴(kuò)精度較高的AD 芯片。然而精度越高,價(jià)格越貴。所以在選擇AD 芯片時(shí),必須充分考慮這兩個(gè)方面。本系統(tǒng)在對(duì)采樣精度和價(jià)格進(jìn)行權(quán)衡后,決定選擇16 位模/數(shù)轉(zhuǎn)換器。由于設(shè)計(jì)的數(shù)據(jù)采集系統(tǒng)放置于環(huán)境惡劣的野外,所以全部器件都要滿足工業(yè)級(jí)標(biāo)準(zhǔn),所以最終選擇了MAXIM 公司的MAX1303。處理器選用了恩智普公司的ARM9 微處理器LPC3250。在此基礎(chǔ)上,設(shè)計(jì)了硬件連接,以及Linux2.6.29 內(nèi)核下的設(shè)備驅(qū)動(dòng)程序,并通過(guò)編寫(xiě)的應(yīng)用程序?qū)︱?qū)動(dòng)程序進(jìn)行了測(cè)試。
LPC3250 是恩智普公司推出的、采用RISC 結(jié)構(gòu)、基于ARM926EJ-S 內(nèi)核的32 位工業(yè)級(jí)處理器,可工作于-40~+85 ℃的范圍內(nèi)。它的最高工作頻率可達(dá)266 MHz,具有完整的存儲(chǔ)管理單元(MMU),可以嵌入Linux/Wince 等需要MMU 支持的操作系統(tǒng);高達(dá)256 kB 的內(nèi)部SRAM 可用于數(shù)據(jù)和代碼存儲(chǔ);32 kB 數(shù)據(jù)高速緩存和32 kB 指令高速緩存;矢量浮點(diǎn)協(xié)處理器具有硬件浮點(diǎn)計(jì)算功能。另外,片內(nèi)有SD/MMC 卡主機(jī)控制器和以太網(wǎng)控制器使系統(tǒng)實(shí)現(xiàn)文件存儲(chǔ)和以太網(wǎng)功能變得簡(jiǎn)單,這對(duì)于數(shù)據(jù)采集系統(tǒng)非常有用。
MAX1303 是MAXIM 公司推出的工業(yè)級(jí)、低功耗、多量程、16 位精度的模/數(shù)轉(zhuǎn)換芯片,采用+5 V 單電源供電,最高采樣率可達(dá)115kbps。可使用+4.096 V 片上基準(zhǔn)或者3.800 到4.136 V 之間的外部電壓基準(zhǔn)[1]。采用20 引腳的TSSOP 封裝。它的引腳如圖1 所示。
從引腳圖可以看出,芯片外部有多種電源引腳,這些引腳對(duì)應(yīng)芯片內(nèi)部獨(dú)立的功能模塊。對(duì)芯片采用獨(dú)立的電源供電可以盡可能的使工作環(huán)境保持低噪聲。第16、17 引腳在使用外部電壓基準(zhǔn)時(shí)分別連接AVDD 和基準(zhǔn)電壓,在使用芯片內(nèi)部基準(zhǔn)時(shí),分別通過(guò)0.01 μF 和1 μF 的電容旁路到AGND1即可。其他引腳功能如表1 所示。

圖1 MAX1303 引腳圖Fig.1 Pin diagram of MAX1303

表1 MAX1303 引腳功能Tab.1 Pin function of MAX1303
CH0-CH4 支持4 路單端輸入,或者2 路差分輸入。SSTRB 在AD 轉(zhuǎn)換器的某些工作模式下可指示轉(zhuǎn)換狀態(tài)。另外4 種數(shù)字接口可通過(guò)SPI/QSPI/MICROWIRE 兼容的串行接口與2.7 V 至5.25 V 的系統(tǒng)連接。
MAX1303 支持7 種單端輸入范圍或者3 種差分輸入范圍,有7 種工作模式。這些都可以通過(guò)輸入控制字進(jìn)行配置。
已提到,模/數(shù)轉(zhuǎn)換器MAX1303 可以通過(guò)SPI/QSPI/MICROWIRE 兼容的串行接口進(jìn)行控制。由于SPI 比較常見(jiàn),并且協(xié)議簡(jiǎn)單,本系統(tǒng)使用SPI 協(xié)議控制此AD 芯片。然而,雖然LPC3250 有內(nèi)置的SPI 控制器,但本系統(tǒng)選擇使用LPC3250 的GPI/O 口模擬SPI 接口對(duì)MAX1303 進(jìn)行控制。下面分析原因。
已提到,MAX1303 有7 中工作模式,其中,有3 種用于數(shù)據(jù)采集。這3 種工作模式是:外部時(shí)鐘模式;外部采集模式;內(nèi)部時(shí)鐘模式。這3 種采集模式各有優(yōu)缺點(diǎn)。外部時(shí)鐘模式的吞吐率最高,同時(shí),給處理器帶來(lái)的負(fù)擔(dān)也最高;內(nèi)部時(shí)鐘模式吞吐率次之,能適當(dāng)減輕處理器的負(fù)擔(dān);外部采集模式的吞吐率最低,但卻能最大限度的減輕處理器負(fù)擔(dān)。由于LPC3250 性能強(qiáng)大,所以系統(tǒng)在采集數(shù)據(jù)時(shí),使用吞吐率高的外部時(shí)鐘模式。然而,使用外部時(shí)鐘模式時(shí),不像使用內(nèi)部時(shí)鐘模式和外部采集模式,處理器向MAX1303 寫(xiě)完控制字和轉(zhuǎn)換啟動(dòng)字后,只需等待MAX1303 的SSTRB 引腳輸出的轉(zhuǎn)換結(jié)束信號(hào),然后就可以讀取轉(zhuǎn)換結(jié)果。使用外部時(shí)鐘模式,需要精確的控制時(shí)鐘個(gè)數(shù),這使得在驅(qū)動(dòng)程序中,要經(jīng)常修改SPI 的相關(guān)控制器,而且還要通過(guò)查詢(xún)來(lái)確定時(shí)鐘的個(gè)數(shù)。如果使用LPC3250 的GPI/O 口模擬SPI 協(xié)議控制AD 芯片就簡(jiǎn)單的多。控制GPO 口不斷翻轉(zhuǎn)輸出電平就可以產(chǎn)生時(shí)鐘信號(hào),而且可隨意控制時(shí)鐘個(gè)數(shù)。對(duì)于發(fā)送數(shù)據(jù),只需要簡(jiǎn)單的把數(shù)據(jù)字節(jié)的每個(gè)位根據(jù)時(shí)鐘變化通過(guò)GPI 口輸出給AD 芯片。讀取數(shù)據(jù)與發(fā)送數(shù)據(jù)是一個(gè)相反的過(guò)程,但類(lèi)似。
所以,用GPI/O 口模擬SPI 總線控制MAX1303 非常簡(jiǎn)單。本系統(tǒng)有兩路模擬信號(hào)需要采集,使用單端輸入,MAX1303 的另外兩個(gè)輸入端接地。LPC3250 與MAX1303 的硬件連接如圖2 所示。

圖2 LPC3250 和MAX1303 的連接圖Fig.2 Connection diagram of LPC3250 and MAX1303
設(shè)備驅(qū)動(dòng)程序是應(yīng)用程序和硬件之間的橋梁,它為應(yīng)用程序屏蔽硬件細(xì)節(jié),并將硬件封裝成一個(gè)文件的形式[2-3]。當(dāng)應(yīng)用程序需要操作硬件時(shí),只需操作硬件相對(duì)應(yīng)的設(shè)備文件即可。Linux 對(duì)設(shè)備的分類(lèi)有許多種,常見(jiàn)的分類(lèi)是將設(shè)備分成3 種:字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備[4]。這三類(lèi)設(shè)備對(duì)應(yīng)3 種設(shè)備文件。不同設(shè)備的開(kāi)發(fā)模式以及與內(nèi)核的接口也不相同。MAX1303 屬于字符設(shè)備,本文將分析Linux2.6.29 內(nèi)核下MAX1303 的字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)方法。
設(shè)備驅(qū)動(dòng)程序與應(yīng)用程序不同,應(yīng)用程序從main 函數(shù)開(kāi)始執(zhí)行,而驅(qū)動(dòng)程序在被安裝時(shí),則是從module_init 宏指定的函數(shù)處開(kāi)始執(zhí)行[5]。module_init 宏指定的函數(shù)被稱(chēng)為模塊加載函數(shù),它可以看成是驅(qū)動(dòng)程序的入口。它通常完成地址映射,向內(nèi)核注冊(cè)并初始化cdev 結(jié)構(gòu),創(chuàng)建設(shè)備文件等工作。模塊加載函數(shù)的程序流程圖如圖3 所示。
與模塊加載函數(shù)對(duì)應(yīng)的,有一個(gè)模塊卸載函數(shù),此函數(shù)由module_exit 宏指定,它在驅(qū)動(dòng)模塊被卸載時(shí)執(zhí)行。它主要完成的工作包括:銷(xiāo)毀設(shè)備文件;注銷(xiāo)設(shè)備所對(duì)應(yīng)的cdev 結(jié)構(gòu);釋放內(nèi)存;注銷(xiāo)設(shè)備號(hào)。
Struct cdev 在內(nèi)核內(nèi)部被用來(lái)表示設(shè)備,這是一個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu)。它內(nèi)部有一個(gè)成員結(jié)構(gòu) struct file_operations[6],用于連接設(shè)備編號(hào)和驅(qū)動(dòng)程序的操作。這個(gè)數(shù)據(jù)結(jié)構(gòu)包含一組函數(shù)指針,這一組函數(shù)的實(shí)現(xiàn)是設(shè)計(jì)驅(qū)動(dòng)程序的重點(diǎn)和難點(diǎn)。這一組函數(shù)有很多,但根據(jù)項(xiàng)目需求,本系統(tǒng)只實(shí)現(xiàn)open,write,read,release 4個(gè)函數(shù)。

圖3 模塊加載函數(shù)流程圖Fig.3 Flow diagram of module loading function
結(jié)構(gòu)struct file_operations 中的open 字段對(duì)應(yīng)著系統(tǒng)調(diào)用中的open 函數(shù)。在應(yīng)用程序中,通過(guò)open 函數(shù)打開(kāi)MAX1303 對(duì)應(yīng)的設(shè)備文件時(shí),內(nèi)核會(huì)跳轉(zhuǎn)到此函數(shù)指針處。此函數(shù)指針的實(shí)現(xiàn),主要完成初始化工作。這包括MAX1303的初始化配置和LPC3250 驅(qū)動(dòng)相關(guān)的寄存器設(shè)置。MAX1303的初始化包括工作模式選擇、量程范圍選擇、單端/差分輸入選擇、初始化通道選擇。對(duì)于這四項(xiàng),本系統(tǒng)全部使用默認(rèn)設(shè)置:外部時(shí)鐘模式;-Vref 到+Vref 的測(cè)量范圍;單端輸入;初始化輸入通道0。所以,在open 中不用配置MAX1303。對(duì)LPC3250 的寄存器配置也比較簡(jiǎn)單,需要完成的配置有:片選信號(hào)拉高;時(shí)鐘信號(hào)拉低;處理器輸出拉低。
Write 字段需要接收應(yīng)用程序從用戶(hù)空間[7]傳遞到內(nèi)核的的數(shù)據(jù),然后將此數(shù)據(jù)通過(guò)GPO_17 端口發(fā)送給MAX1303。這些數(shù)據(jù)主要用于修改MAX1303 的配置,例如通道選擇。向MAX1303 寫(xiě)數(shù)據(jù)時(shí)需要注意MAX1303 電氣特性中的兩個(gè)時(shí)間參數(shù)Tcss 和Tcspw。Tcss 對(duì)應(yīng)著芯片的片選信號(hào)被拉低后到第一個(gè)時(shí)鐘到來(lái)前所必需的時(shí)間間隔[8]。Tcspw對(duì)應(yīng)著寫(xiě)模擬輸入配置字節(jié)、模式控制字節(jié)、轉(zhuǎn)換啟動(dòng)字節(jié)時(shí),任意兩者之間的時(shí)間間隔。這兩個(gè)時(shí)間參數(shù)都必須大于40 ns,且沒(méi)有上限。本系統(tǒng)中,在Read 中寫(xiě)轉(zhuǎn)換啟動(dòng)字節(jié),write 中只做通道的切換,其他配置都使用默認(rèn)的。
Read 字段是MAX1303 驅(qū)動(dòng)的關(guān)鍵點(diǎn)。它負(fù)責(zé)讀取采樣結(jié)果,并將結(jié)果傳遞給應(yīng)用程序。在read 中,首先是用8個(gè)時(shí)鐘向MAX1303 寫(xiě)轉(zhuǎn)換起始字節(jié),然后使用8個(gè)是時(shí)鐘周期等待AD 轉(zhuǎn)換完成。最后使用16個(gè)時(shí)鐘周期讀取MAX1303輸出的轉(zhuǎn)換結(jié)果。由于轉(zhuǎn)換結(jié)果是以串行方式輸出,故需要將讀取的數(shù)據(jù)拼湊起來(lái)。又由于ARM 使用的是端口3 的GPI_06 管腳讀取MAX1303 的輸出數(shù)據(jù),且對(duì)于端口3 的操作是以32 位進(jìn)行的,所以還需要考慮拼接端口3 的哪個(gè)數(shù)據(jù)位。本文的處理方式是先將端口3 讀出的數(shù)據(jù)右移6 位。具體的操作代碼如下:

release 對(duì)應(yīng)著系統(tǒng)調(diào)用中的close 函數(shù)。它需要完成這個(gè)驅(qū)動(dòng)所涉及的配置寄存器的復(fù)位,操作過(guò)程與open 相反。在還原寄存器的默認(rèn)設(shè)置后,打印一條設(shè)備文件關(guān)閉的信息,供應(yīng)用程序開(kāi)發(fā)者調(diào)試時(shí)觀察使用。
本文介紹的應(yīng)用程序是整個(gè)系統(tǒng)的一部分,這里僅供測(cè)試驅(qū)動(dòng)程序使用。測(cè)試的功能主要是驅(qū)動(dòng)中的write 和read功能。由于驅(qū)動(dòng)程序的read 中沒(méi)有對(duì)讀取的采樣值做處理,所以得到的數(shù)據(jù)還不是輸入信號(hào)的實(shí)際值,應(yīng)用程序必須對(duì)數(shù)據(jù)進(jìn)行處理。由于MAX1303 采用單端、雙極性輸入,所以處理公式為:

式中,實(shí)際值的單位是毫伏;采樣值是從MAX1303 讀取的數(shù)據(jù);FSR 是滿量程范圍,對(duì)于本系統(tǒng),F(xiàn)SR 是2*Vref;本系統(tǒng)采用內(nèi)部電壓基準(zhǔn),Vref 的理論值是4.096 V,但實(shí)際系統(tǒng)中會(huì)有一定的漂移,范圍一般在4.056 V 到4.136 V 之間。
為了測(cè)試,應(yīng)用程序每秒讀取一次兩個(gè)通道的數(shù)據(jù),并打印。應(yīng)用程序的流程圖如圖4 所示。

圖4 應(yīng)用程序流程圖Fig.4 Flow diagram of application
根據(jù)應(yīng)用程序的打印結(jié)果和CH1、CH2 的實(shí)際輸入,系統(tǒng)采樣結(jié)果正確,系統(tǒng)運(yùn)行穩(wěn)定。
A/D 轉(zhuǎn)換器在數(shù)據(jù)采集系統(tǒng)和智能控制系統(tǒng)中有極其重要的用途。嵌入式Linux 在現(xiàn)代的嵌入式系統(tǒng)中也被廣泛應(yīng)用。本文描述的16 位AD 芯片的Linux 驅(qū)動(dòng)和硬件接口設(shè)計(jì)不僅在筆者所開(kāi)發(fā)的系統(tǒng)中具有實(shí)際工程應(yīng)用價(jià)值,同時(shí),對(duì)其他具有SPI 接口的AD 芯片的硬件接口設(shè)計(jì)和Linux 驅(qū)動(dòng)程序設(shè)計(jì)也有一定的參考價(jià)值。
[1]馬茂松,姜秀杰.星載電場(chǎng)儀的信號(hào)采集與傳輸系統(tǒng)[J].微計(jì)算機(jī)信息,2010,26(12):34-36.MA Mao-song,JIANG Xiu-jie.Signal sampling and transmitting system of satellite onboard electric field meter[J].Microcomputer Information,2010,26(12):34-36.
[2]徐偉,胡志忠,肖前貴.AD7490與AT91RM9200的SPI接口及其驅(qū)動(dòng)程序的實(shí)現(xiàn)[J].計(jì)算機(jī)測(cè)量與控制,2009,17(10):2089-2091.XU Wei,HU Zhi-zhong,XIAO Qian-gui.Implementation of SPI and driver for AD7490 and AT91RM9200 [J].Computer Measurement &Control,2009,17(10):2089-2091.
[3]陳鑫旺,姜秀杰.基于嵌入式Linux 和FPGA 的數(shù)據(jù)通信系統(tǒng)設(shè)計(jì)[J].微計(jì)算機(jī)信息,2012,28(6):76-78.CHEN Xin-wang,JIANG Xiu-jie.Design of data communication system based on embedded Linux and FPGA[J].Microcomputer Information,2012,28(6):76-78.
[4]劉淼.嵌入式系統(tǒng)接口設(shè)計(jì)與Linux 驅(qū)動(dòng)程序開(kāi)發(fā)[M].北京:北京航空航天大學(xué)出版社,2006.
[5]曹毅,何慎學(xué),陳會(huì)鴿.ARM-Linux 外擴(kuò)AD 驅(qū)動(dòng)程序的研究與實(shí)現(xiàn)[J].自動(dòng)化與儀表,2010(9):45-48.CAO Yi,HE Shen-xue,CHEN Hui-ge.Research and implementation on extending AD driver program based on ARM-Linux[J].Automation&Instrumentation,2010(9):45-48.
[6]李俊.嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M].北京:人民郵電出版社,2008.
[7]魏永明.Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M].北京:中國(guó)電力出版社,2006.
[8]肖笑.基于BCC算法的多機(jī)系統(tǒng)PSS參數(shù)優(yōu)化設(shè)計(jì)[J].陜西電力,2012(12):51-54.XIAO Xiao.Optimal design of multi-machine power system stabilizer parameters based on bacterial colony chemotaxis algorithm[J].Shaanxi Electric Power,2012(12):51-54.