本文針對數(shù)據(jù)采集與處理系統(tǒng)的應用需求,設計了嵌入Linux的ARM9處理器LPC3250與16位AD采樣芯片MAX1303的硬件接口和驅動程序。首先,描述了LPC3250和MAX1303的性能、特點以及硬件接口電路設計方案。然后,在硬件平臺的基礎上,詳細地闡述了嵌入式Linux下MAXl303驅動程序的組成模塊和具體實現(xiàn)方法,并給出了部分源代碼以及對設備驅動的測試方法。測試結果表明,系統(tǒng)工作正常、穩(wěn)定,采樣結果正確,具有實際工程應用價值。
在數(shù)據(jù)采集系統(tǒng)中,通常是通過傳感器將自然世界的物理量轉化成電量,電量是模擬量,必須經(jīng)過模/數(shù)轉換才能被系統(tǒng)的處理器讀取?,F(xiàn)在的很多微處理器都有片內(nèi)AD,但這些AD多數(shù)是8位、10位或者12位,有時候很難滿足精度要求。所以需要利用處理器的接口資源外擴精度較高的AD芯片。然而精度越高,價格越貴。所以在選擇AD芯片時,必須充分考慮這兩個方面。本系統(tǒng)在對采樣精度和價格進行權衡后,決定選擇16位模/數(shù)轉換器。由于設計的數(shù)據(jù)采集系統(tǒng)放置于環(huán)境惡劣的野外,所以全部器件都要滿足工業(yè)級標準,所以最終選擇了MAXIM公司的MAX1303。處理器選用了恩智普公司的ARM9微處理器LPC3250。在此基礎上,設計了硬件連接,以及Linux2.6.29內(nèi)核下的設備驅動程序,并通過編寫的應用程序對驅動程序進行了測試。
1 芯片介紹
1.1 LPC3250簡介
LPC3250是恩智普公司推出的、采用RISC結構、基于ARM926EJ-S內(nèi)核的32位工業(yè)級處理器,可工作于-40~+85℃的范圍內(nèi)。它的最高工作頻率可達266 MHz,具有完整的存儲管理單元(MMU),可以嵌入Linux/Wince等需要MMU支持的操作系統(tǒng);高達256 kB的內(nèi)部SRAM可用于數(shù)據(jù)和代碼存儲;32 kB數(shù)據(jù)高速緩存和32 kB指令高速緩存;矢量浮點協(xié)處理器具有硬件浮點計算功能。另外,片內(nèi)有SD/MMC卡主機控制器和以太網(wǎng)控制器使系統(tǒng)實現(xiàn)文件存儲和以太網(wǎng)功能變得簡單,這對于數(shù)據(jù)采集系統(tǒng)非常有用。
1.2 AD芯片MAX1303簡介
MAX1303是MAXIM公司推出的工業(yè)級、低功耗、多量程、16位精度的模/數(shù)轉換芯片,采用+5 V單電源供電,最高采樣率可達115kbps??墒褂?4.096 V片上基準或者3.800到4.136 V之間的外部電壓基準。采用20引腳的TSOP封裝。它的引腳如圖1所示。
從引腳圖可以看出,芯片外部有多種電源引腳,這些引腳對應芯片內(nèi)部獨立的功能模塊。對芯片采用獨立的電源供電可以盡可能的使工作環(huán)境保持低噪聲。第16、17引腳在使用外部電壓基準時分別連接AVDD和基準電壓,在使用芯片內(nèi)部基準時,分別通過0.01μF和1μF的電容旁路到AGND1即可。其他引腳功能如表1所示。
CH0-CH4支持4路單端輸入,或者2路差分輸入。SSTRB在AD轉換器的某些工作模式下可指示轉換狀態(tài)。另外4種數(shù)字接口可通過SPI/OSPI /MICROWIRE兼容的串行接口與2.7 V至5.25 V的系統(tǒng)連接。
MAX1303支持7種單端輸入范圍或者3種差分輸入范圍,有7種工作模式。這些都可以通過輸入控制字進行配置。
2 系統(tǒng)硬件設計
已提到,模/數(shù)轉換器MAX1303可以通過SPI/QSPI/MICROWIRE兼容的串行接口進行控制。由于SPI比較常見,并且協(xié)議簡單,本系統(tǒng)使用SPI協(xié)議控制此AD芯片。然而,雖然LPC3250有內(nèi)置的SPI控制器,但本系統(tǒng)選擇使用LPC3250的GPI/O口模擬SPI接口對MAX1303進行控制。下面分析原因。
已提到,MAX1303有7中工作模式,其中,有3種用于數(shù)據(jù)采集。這3種工作模式是:外部時鐘模式;外部采集模式;內(nèi)部時鐘模式。這3種采集模式各有優(yōu)缺點。外部時鐘模式的吞吐率最高,同時,給處理器帶來的負擔也最高;內(nèi)部時鐘模式吞吐率次之,能適當減輕處理器的負擔;外部采集模式的吞吐率最低,但卻能最大限度的減輕處理器負擔。由于LPC3250性能強大,所以系統(tǒng)在采集數(shù)據(jù)時,使用吞吐率高的外部時鐘模式。然而,使用外部時鐘模式時,不像使用內(nèi)部時鐘模式和外部采集模式,處理器向MAX1303寫完控制字和轉換啟動字后,只需等待MAX1303的SSTRB引腳輸出的轉換結束信號,然后就可以讀取轉換結果。使用外部時鐘模式,需要精確的控制時鐘個數(shù),這使得在驅動程序中,要經(jīng)常修改SPI的相關控制器,而且還要通過查詢來確定時鐘的個數(shù)。如果使用LPC3250的GPI/O口模擬SPI協(xié)議控制AD芯片就簡單的多。控制GPO口不斷翻轉輸出電平就可以產(chǎn)生時鐘信號,而且可隨意控制時鐘個數(shù)。對于發(fā)送數(shù)據(jù),只需要簡單的把數(shù)據(jù)字節(jié)的每個位根據(jù)時鐘變化通過GPI口輸出給AD芯片。讀取數(shù)據(jù)與發(fā)送數(shù)據(jù)是一個相反的過程,但類似。
所以,用GPI/O口模擬SPI總線控制MAX1303非常簡單。本系統(tǒng)有兩路模擬信號需要采集,使用單端輸入,MAX1303的另外兩個輸入端接地。LPC3250與MAX1303的硬件連接如圖2所示。
3 Linux下設備驅動程序設計
設備驅動程序是應用程序和硬件之間的橋梁,它為應用程序屏蔽硬件細節(jié),并將硬件封裝成一個文件的形式。當應用程序需要操作硬件時,只需操作硬件相對應的設備文件即可。Linux對設備的分類有許多種,常見的分類是將設備分成3種:字符設備、塊設備、網(wǎng)絡設備。這三類設備對應3種設備文件。不同設備的開發(fā)模式以及與內(nèi)核的接口也不相同。MAX1303屬于字符設備,本文將分析Linux2.6.29內(nèi)核下MAX 1303的字符設備驅動設計方法。
設備驅動程序與應用程序不同,應用程序從main函數(shù)開始執(zhí)行,而驅動程序在被安裝時,則是從module_init宏指定的函數(shù)處開始執(zhí)行。module_init宏指定的函數(shù)被稱為模塊加載函數(shù),它可以看成是驅動程序的入口。它通常完成地址映射,向內(nèi)核注冊并初始化cdev結構,創(chuàng)建設備文件等工作。模塊加載函數(shù)的程序流程圖如圖3所示。
與模塊加載函數(shù)對應的,有一個模塊卸載函數(shù),此函數(shù)由module_exit宏指定,它在驅動模塊被卸載時執(zhí)行。它主要完成的工作包括:銷毀設備文件;注銷設備所對應的cdev結構;釋放內(nèi)存;注銷設備號。
Struct cdev在內(nèi)核內(nèi)部被用來表示設備,這是一個非常重要的數(shù)據(jù)結構。它內(nèi)部有一個成員結構structfile_operations,用于連接設備編號和驅動程序的操作。這個數(shù)據(jù)結構包含一組函數(shù)指針,這一組函數(shù)的實現(xiàn)是設計驅動程序的重點和難點。這一組函數(shù)有很多,但根據(jù)項目需求,本系統(tǒng)只實現(xiàn)open,write,read,release 4個函數(shù)。
結構struct file_operations中的open字段對應著系統(tǒng)調(diào)用中的open函數(shù)。在應用程序中,通過open函數(shù)打開MAX1303對應的設備文件時,內(nèi)核會跳轉到此函數(shù)指針處。此函數(shù)指針的實現(xiàn),主要完成初始化工作。這包括MAX1303的初始化配置和LPC3250驅動相關的寄存器設置。MAX1303的初始化包括工作模式選擇、量程范圍選擇、單端/差分輸入選擇、初始化通道選擇。對于這四項,本系統(tǒng)全部使用默認設置:外部時鐘模式;-Vref到+Vref的測量范圍;單端輸入;初始化輸入通道0。所以,在open中不用配置MAX1303。對LPC3250的寄存器配置也比較簡單,需要完成的配置有:片選信號拉高;時鐘信號拉低;處理器輸出拉低。
Write字段需要接收應用程序從用戶空間傳遞到內(nèi)核的的數(shù)據(jù),然后將此數(shù)據(jù)通過GPO_17端口發(fā)送給MAX1303。這些數(shù)據(jù)主要用于修改MAX1303的配置,例如通道選擇。向MAX1303寫數(shù)據(jù)時需要注意MAX1303電氣特性中的兩個時間參數(shù)Tcss和TCSPw。Tcss對應著芯片的片選信號被拉低后到第一個時鐘到來前所必需的時間間隔。Tcspw對應著寫模擬輸入配置字節(jié)、模式控制字節(jié)、轉換啟動字節(jié)時,任意兩者之間的時間間隔。這兩個時間參數(shù)都必須大于40 ns,且沒有上限。本系統(tǒng)中,在Read中寫轉換啟動字節(jié),write中只做通道的切換,其他配置都使用默認的。
Read字段是MAX1303驅動的關鍵點。它負責讀取采樣結果,并將結果傳遞給應用程序。在read中,首先是用8個時鐘向MAX1303寫轉換起始字節(jié),然后使用8個是時鐘周期等待AD轉換完成。最后使用16個時鐘周期讀取MAX1303輸出的轉換結果。由于轉換結果是以串行方式輸出,故需要將讀取的數(shù)據(jù)拼湊起來。又由于ARM使用的是端口3的GPI_06管腳讀取MAX1303的輸出數(shù)據(jù),且對于端口3的操作是以32位進行的,所以還需要考慮拼接端口3的哪個數(shù)據(jù)位。本文的處理方式是先將端口3讀出的數(shù)據(jù)右移6位。具體的操作代碼如下:
release對應著系統(tǒng)調(diào)用中的close函數(shù)。它需要完成這個驅動所涉及的配置寄存器的復位,操作過程與open相反。在還原寄存器的默認設置后,打印一條設備文件關閉的信息,供應用程序開發(fā)者調(diào)試時觀察使用。
4 Linux應用程序設計與測試
本文介紹的應用程序是整個系統(tǒng)的一部分,這里僅供測試驅動程序使用。測試的功能主要是驅動中的write和read功能。由于驅動程序的read中沒有對讀取的采樣值做處理,所以得到的數(shù)據(jù)還不是輸入信號的實際值,應用程序必須對數(shù)據(jù)進行處理。由于MAX1303采用單端、雙極性輸入,所以處理公式為:
式中,實際值的單位是毫伏;采樣值是從MAX1303讀取的數(shù)據(jù);FSR是滿量程范圍,對于本系統(tǒng),F(xiàn)SR是2*Vref;本系統(tǒng)采用內(nèi)部電壓基準,Vref的理論值是4.096 V,但實際系統(tǒng)中會有一定的漂移,范圍一般在4.056 V到4.136 V之間。
為了測試,應用程序每秒讀取一次兩個通道的數(shù)據(jù),并打印。應用程序的流程圖如圖4所示。