干開峰 王 俊 汪濟洲
(合肥學院機器視覺與智能控制技術重點實驗室,合肥 230601)
S3C2440A外擴AD7705設備驅動設計與實現(xiàn)
干開峰 王 俊 汪濟洲
(合肥學院機器視覺與智能控制技術重點實驗室,合肥 230601)
研究微處理器S3C2440A利用串行外設接口(SPI)外擴數(shù)模轉換器AD7705的應用,以嵌入式 Linux操作系統(tǒng)構建開發(fā)平臺,給出了 AD7705和S3C2440A的硬件連接以及AD7705驅動的實現(xiàn)方法,為數(shù)據(jù)采集的嵌入式設備的驅動開發(fā)提供了有效的實現(xiàn)方案。
微處理器;數(shù)模轉換器;SPI;嵌入式Linux;驅動程序
SPI(Serial Peripheral Interface—串行外設接口)總線系統(tǒng)是一種同步串行外設接口,它可以使MCU與各種外圍設備以串行方式進行通信以交換信息。SPI是一種高速的,全雙工,同步的通信總線,只需3~4根數(shù)據(jù)線和控制線即可擴展具有SPI接口的各種I/O器件,數(shù)據(jù)傳輸速度比I2C總線快,實現(xiàn)軟件相當簡單[1]。串行A/D轉換器具有體積小、功耗低、轉換速度快、精度高等優(yōu)點,串行接口的特點使其與微控制器直接相連,而S3C2440A芯片集成了SPI通信協(xié)議,被設計應用于手持設備以及各種嵌入式集成系統(tǒng),將上述兩種實用的芯片利用SPI總線技術相結合來實現(xiàn)數(shù)據(jù)采集是可行的。
AD7705是美國模擬器件公司推出的一款高速低功耗16位A/D轉換器,該器件可以接受直接來自傳感器的低電平的輸入信號,然后產(chǎn)生串行的數(shù)字輸出,利用Σ-Δ轉換技術實現(xiàn)16位無丟失代碼性能,非線性度為0.003%。AD7705具有2個全差分輸入通道,可編程增益為1~128,三線串行接口,具有模擬輸入端緩沖器。AD7705工作電壓為2.7~3.3V或4.75~5.25V,低功耗,3V電壓時,最大功耗為1mW,等待電流的最大值為8μA。AD7705還包括自校準和系統(tǒng)校準選項,以消除器件本身或系統(tǒng)的增益和偏移誤差[2]。
AD7705芯片內(nèi)部具有8個寄存器,對芯片的操作必須先從寫通信寄存器開始。當上電或復位后,芯片的等待指令數(shù)據(jù)即被寫入通信寄存器中。
AD7705可以直接與MCU進行互聯(lián),用到的數(shù)據(jù)線有片選(CS)、串行時鐘輸入(SCLK)、指令或數(shù)據(jù)輸入 (DIN)以及轉換結果輸出(DOUT)等。 只有在狀態(tài)信號(DRDY)指示輸出數(shù)據(jù)寄存器的數(shù)據(jù)準備就緒時,MCU才可以讀取A/D轉換的數(shù)據(jù)結果。
三星公司推出的16/32位RISC微處理器S3C2440A,主頻為 400MHz,最高可達 533MHz。S3C2440A采用了ARM920T內(nèi)核,實現(xiàn)了MMU、AMBA BUS和Harvard高速緩沖體系結構,該結構具有獨立的16kb指令Cache和16kb數(shù)據(jù)Cache,每個都是由具有8個字長的行組成。S3C2440A通過提供一套完整的通用系統(tǒng)外設,不需配置額外的組件,可減少整體系統(tǒng)成本[3]。S3C2440A具有低功耗、簡單且全靜態(tài)設計的特點,特別適合于對成本和功率敏感型的系統(tǒng)應用。
S3C2440A芯片內(nèi)有2個SPI口,可以實現(xiàn)和外設進行串行數(shù)據(jù)傳輸。每個SPI接口各有2個移位寄存器分別負責接收和發(fā)送數(shù)據(jù)[4]。在傳送數(shù)據(jù)期間,傳送數(shù)據(jù)的頻率可由相應的控制寄存器來設定。在數(shù)據(jù)傳輸時,一個SPI系統(tǒng)作為“主機”控制數(shù)據(jù)流,其他 SPI作為“從機”,主機控制數(shù)據(jù)的輸入和輸出。
S3C2440A片內(nèi)SPI接口具有如下特點:
(1)兼容 SPI協(xié)議 (ver2.11);
(2)發(fā)送和接收具有2×8位的移位寄存器;
(3)有輪詢、中斷和 DMA三種傳送模式。
S3C2440A的SPI口包括2條數(shù)據(jù)線及 2條控制線(見表 1)。
表1 SPI接口
作者采用 SPIMISO0,SPIMOSI0,SPICLK0 作為SPI通信信號,利用GPIO口作為AD7705的片選信號。圖1為S3C2440A與AD7705的接口電路圖。
圖1 AD7705和S3C2440A連接圖
設備驅動程序是操作系統(tǒng)內(nèi)核和硬件設備之間的接口,為應用程序屏蔽了硬件的細節(jié),對于應用程序而言,硬件設備只是一個設備文件,應用程序可以象操作普通文件一樣,通過對設備文件的打開、讀寫和關閉等操作,控制底層的具體硬件設備。在嵌入式Linux操作系統(tǒng)下有三類主要的設備文件類型,即字符設備、塊設備和網(wǎng)絡設備。AD7705芯片屬于字符設備類(char device)。
使用一個設備之前首先要對其進行初始化,本系統(tǒng)主要完成AD7705設備的初始化和S3C2440A的SPI接口初始化。AD7705初始化函數(shù):ad7705_init(void),主要完成對AD7705的PIO口進行初始化設置,并對SPI的工作方式以及各控制寄存器和模式寄存器參數(shù)進行配置。
對S3C2440A的SPI接口初始化函數(shù):spi_init(void),主要完成設置SPI工作方式,并實現(xiàn)控制寄存器SPCON、波特率SPPRE和GPIO口的設置等。
由于在嵌入式Linux操作系統(tǒng)下不允許對設備的物理地址直接進行訪問,必須轉換為虛擬地址后才能訪問,故定義devp=kmalloc(sizeof(structadc_dev),GFP_KERNEL),并進行動態(tài)分配內(nèi)存:memset(devp,0,sizeof(struct adc_dev))。利用函數(shù) int register_chrdev_region(dev_t first,unsigned int count,char*name)將設備驅動程序向嵌入式Linux內(nèi)核注冊,這樣基本完成了設備驅動的初始化函數(shù)spi_adc_init(void)。
嵌入式Linux內(nèi)核是通過file_operations結構體來組織對設備操作的具體實現(xiàn)函數(shù),結構體中的成員幾乎全是函數(shù)指針,包含了驅動程序提供給應用程序訪問硬件設備的各種方法,每個成員都對應一個系統(tǒng)調(diào)用,當用戶對設備文件進行操作時,系統(tǒng)調(diào)用通過設備文件的主設備號找到相應設備的驅動程序,然后找到file_operations結構體中相應的函數(shù)指針[5]。
本系統(tǒng)需要對SPI端口進行打開、關閉、接收、發(fā)送和傳輸數(shù)據(jù)操作,定義 file_operations結構體如下:
設備操作中最為核心部分的是A/D數(shù)據(jù)轉換的功能實現(xiàn),函數(shù)定義為:ad_convert(void),首先設置寄存器為發(fā)送狀態(tài),然后采用對SPI接口輪詢方式完成數(shù)據(jù)轉換和接受。
其中spi_tx_data(unsigned char data)為數(shù)據(jù)傳輸函數(shù)。
AD7705芯片驅動的工作流程如圖2所示。
圖2 驅動設備工作流程
設備注銷函數(shù)spi_adc_exit(void)與設備初始化函數(shù)spi_adc_init(void)相對應,主要完成內(nèi)存空間釋放等操作,核心部分由字符設備注銷函數(shù)unregister_chrdev_region (dev_t first,unsigned int count)組成,該函數(shù)完成驅動程序向嵌入式Linux內(nèi)核的注銷,當設備驅動程序被注銷后,內(nèi)核會將之前所分配的設備號收回[6]。
完成驅動程序的編寫后,需要將完成的驅動程序spi_adc.c文件加入嵌入式Linux內(nèi)核并編譯生成新的kernel文件。
首先將spi_adc.c復制到嵌入式Linux內(nèi)核源代碼的/linux2.6.30/driver/char目錄下,修改Kconfig和Makefile文件。
Makefile文件添加代碼:
Kconfig文件中添加代碼:
完成之后在linux2.6.30根目錄執(zhí)行makemenuconfig,選擇AD7705驅動程序如下所示:
選中要配置的選項,此時按下“Y”鍵,將此選項編譯進內(nèi)核[7]。
最后,執(zhí)行make命令,生成zImage文件下載到目標板上執(zhí)行。
至此,完成了SPI設備AD7705的驅動程序開發(fā),將其用于工業(yè)現(xiàn)場數(shù)據(jù)采集,滿足數(shù)據(jù)高精度和高速采集需求。
基于S3C2440A外擴帶 SPI接口的串行A/D設備,硬件連接簡單,軟件易于實現(xiàn),程序運行效率高,可推廣到其他外設設備。該方案的實現(xiàn)可廣泛應用于數(shù)據(jù)采集終端設備、醫(yī)療儀表以及其他嵌入式應用系統(tǒng),具有較高的工程應用價值。
[1]崔微,秦征宇.基于ARMLinux的SPI驅動實現(xiàn)[J].重慶科技學院學報:自然科學版,2009,11(4):143-147.
[2]閆瑞杰,李海香,郝瑞霞.基于ATmega16的 AD7705多通道模擬量采集系統(tǒng)設計 [J].化工自動化及儀表,2011(4):466-468,487.
[3]吳華,謝禮瑩,徐澤宇.基于ARM9的紅外熱像儀設計與實現(xiàn)[J].計算機工程,2010(10):234-236.
[4]李琦,賀明,董利民,等.基于ARM嵌入式系統(tǒng)的SPI驅動程序設計[J].微型機與應用,2011(5):5-8.
[5]李勝朝,黃先祥,謝建.嵌入式 Linux系統(tǒng)中字符設備驅動程序的開發(fā)[J].計算機工程,2007,33(4):5-8.
[6]李忠良,陳衛(wèi)兵,鄒豪杰,等.嵌入式 Linux下 AD7714與SPI接口及驅動的實現(xiàn) [J].儀表技術與傳感器,2011(4):42-44,62.
[7]王興杰,李允,江浩,等.基于Linux的嵌入式交叉開發(fā)技術[J].計算機應用研究,2008(1):206-208,214.
Abstract:The application that the microprocessor(S3C2440A)uses SPI to expand AD7705 is studied,constructing the development platform by the embedded Linux operating system,giving the hardware connection diagram of AD7705 and S3C2440A and the realization of the AD7705 driver.It provides a solution for the embedded devices drive in data acquisition,having a high value of engineering application.
Key words:AD7705;S3C2440A;SPI;Embedded Linux;Driver
Design and Implementation of the Expansion AD7705 Device Driver Based on S3C2440A
GAN Kaifeng WANG Jun WANG Jizhou
(Key Laboratory of Machine Vision and Intelligence Control Technology of Hefei University,Hefei 230601)
TP391
A
1673-1980(2012)05-0146-04
2012-06-23
安徽省高校省級自然科學研究重點項目(KJ2010A292);安徽省高校省級自然科學研究一般項目(KJ2012B151)
干開峰(1974-),男,安徽和縣人,實驗師,研究方向為嵌入式系統(tǒng)。