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