• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Linux嵌入式系統(tǒng)的S3C6410和ADS1298R的SPI接口驅(qū)動的實(shí)現(xiàn)

      2014-07-29 01:57:27湯沁徐學(xué)軍彭地卓李驥
      中國新通信 2014年1期

      湯沁 徐學(xué)軍 彭地卓 李驥

      【摘要】 本文介紹了高速模數(shù)轉(zhuǎn)換芯片ADS1298R與ARM11微控制器S3C6410利用串行外設(shè)接口(SPI)進(jìn)行數(shù)據(jù)通信的應(yīng)用方案,給出了兩者SPI接口的連接圖和Linux操作系統(tǒng)下驅(qū)動的具體實(shí)現(xiàn)方法,最后編寫了應(yīng)用程序進(jìn)行測試,論證了該方法的可行性。ADS1298R和S3C6410基于SPI的串行通信方式為嵌入式高速數(shù)據(jù)采集系統(tǒng)提供了一個解決方案。

      【關(guān)鍵詞】 SPI驅(qū)動 ADS1298R S3C6410 Linux

      SPI總線是一種同步串行外設(shè)接口, MCU通過它可以與各種外圍設(shè)備進(jìn)行數(shù)據(jù)通信[7]。SPI總線只需3~4根數(shù)據(jù)線和控制線即可擴(kuò)展具有SPI接口的各種I/O器件,其硬件功能很強(qiáng),實(shí)現(xiàn)軟件相當(dāng)簡單[1]。SPI為全雙工通信,顯得簡單高效,因而A/D轉(zhuǎn)換器與ARM通過SPI接口相結(jié)合而組成的基于Linux的數(shù)據(jù)采集系統(tǒng)顯得十分有效。

      一、ADS1298R的特性和使用

      ADS1298R是美國德州儀器公司推出的一款低功率,8通道,同步采樣,24位三角積分模數(shù)轉(zhuǎn)換器,此產(chǎn)品具有內(nèi)置的可編程增益放大器(PGA),內(nèi)部基準(zhǔn)和一個板載振蕩器[4]。運(yùn)行數(shù)據(jù)速率最高可達(dá)32KSPS,時鐘頻率2.048MHz,具有串行外設(shè)接口(SPI),并兼容串口。其引腳定義如圖1所示。

      如圖2所示為ADS1298R的串行接口時序圖,串行時鐘為數(shù)據(jù)的輸入輸出提供了傳輸時序。當(dāng)一次數(shù)據(jù)轉(zhuǎn)換完成后,DRDY變低,表示有數(shù)據(jù)可進(jìn)行傳輸,將片選信號CS拉低,串行時鐘開始工作,DRDY電平在SCLK的第一個時鐘下降沿升高,在SCLK上升沿往外部控制設(shè)備傳數(shù)據(jù),在下降沿從外部控制設(shè)備讀數(shù)據(jù)命令。數(shù)據(jù)傳輸階段CS必須保持低電平,傳輸一組數(shù)據(jù)需要216個串行時鐘周期。

      二、S3C6410概述

      S3C6410是三星公司推出的一款采用RISC架構(gòu)的16/32位微控制器,它基于ARM1176JZF-S內(nèi)核,高效的八級流水線使其貫通率比以前的ARM內(nèi)核提高了40%[6]。最高時鐘頻率可達(dá)667MHz。

      S3C6410含有2通道的SPI接口,可來實(shí)現(xiàn)串行數(shù)據(jù)的傳輸。每個SPI通道含有兩個獨(dú)立的32位發(fā)送和接收數(shù)據(jù)寄存器和兩個32位移位寄存器,以及兩個64字節(jié)的接收和發(fā)送FIFO,三者在SPI通信中的關(guān)系如圖3所示。

      三、SPI驅(qū)動

      設(shè)備驅(qū)動是從操作系統(tǒng)當(dāng)中提取物理或者虛擬設(shè)備的軟件,是連接硬件與操作系統(tǒng)的橋梁。SPI驅(qū)動程序?qū)儆诹鹘涌隍?qū)動程序,導(dǎo)出標(biāo)準(zhǔn)的流接口函數(shù),由流接口驅(qū)動管理器向應(yīng)用程序提供文件系統(tǒng),應(yīng)用程序通過對文件系統(tǒng)的處理來完成對設(shè)備的操作[2,3]。

      根據(jù)SPI接口連接原理,將ADS1298R和S3C6410的SPI接口引腳按圖4所示的方式進(jìn)行連接。

      為了實(shí)現(xiàn)S3C6410與ADS1298R的數(shù)據(jù)通信,編寫了基于嵌入式Linux操作系統(tǒng)下混雜設(shè)備驅(qū)動程序,該SPI驅(qū)動主要由以下幾個函數(shù)構(gòu)成。

      (1)spi_init_function()完成SPI的初始化工作。首先將對應(yīng)I/O口配置成SPI功能模式,然后對S3C6410的SPI寄存器進(jìn)行如下順序的配置。

      ●將SPI傳輸模式(CPOL&CPHA)配置成與ADS1298R一致。

      ●設(shè)置串行時鐘配置寄存器CLK_CFG。

      ●設(shè)置SPI FIFO控制寄存器MODE_CFG。

      ●開Tx或Rx通道。

      ●將片選設(shè)置成手動模式,將NSSOUT設(shè)置成低并開始傳輸或接收數(shù)據(jù)[5]。

      static void spi_init_function(void)

      {······

      CH_CFG = ((0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (1 << 2) | (0 << 1) | (0 << 0));

      CLK_CFG = ((0 << 9) | (1 << 8) | (0x4 << 0));

      MODE_CFG = ((0 << 29) | (0 << 19) | (0 << 17) | (1 << 11) | (1 << 5)

      | (0 << 2) | (0 << 1) | (0 << 0));

      SLAVE_SEL = (0x00);

      ······}

      (2)spi_write()用于向ADS1298R傳遞控制命令。S3C6420通過spi_write()函數(shù)向ADS1298R傳遞命令,使其工作在對應(yīng)狀態(tài)。傳數(shù)據(jù)時開發(fā)送通道,并將CS信號拉低,然后將用戶層傳遞過來的命令通過圖3的發(fā)送通道傳送至ADS1298R,ADS1298R在SCLK的下降沿從DIN將數(shù)據(jù)讀入。

      static ssize_t spi_write(struct file *filp,const char __user *buff,size_t count,loff_t *offp)

      {······

      SPI_CS_LOW( );

      for(i=0;i

      writeByte(kbuf[i]);

      SPI_CS_HIGH();

      ······}

      (3)spi_read( )用于讀取經(jīng)AD轉(zhuǎn)換后的數(shù)據(jù)。ADS1298R將轉(zhuǎn)換的數(shù)據(jù)準(zhǔn)備好后,DRDY信號變低,S3C6410便可開接收通道,并拉低CS,然后通過圖3的接收通道接收數(shù)據(jù),ADS1298R在SCLK的上升沿將數(shù)據(jù)從DOUT送出。

      static ssize_t spi_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

      {······

      SPI_CS_LOW( );

      while(!DRDY);

      for(i=0;i<9;i++)

      tab[i] = readByte( );

      SPI_CS_HIGH( );

      ······}

      四、SPI測試程序

      為了測試驅(qū)動的正確性,編寫了測試應(yīng)用程序?qū)︱?qū)動進(jìn)行測試。為了方便對ADS1298R工作模式和狀態(tài)的控制,我們將對ADS1298R的控制命令放在了應(yīng)用程序里。對ADS1298R的控制主要是對其23個可讀可寫寄存器的配置。用ADS1298R內(nèi)部自帶測試信號進(jìn)行測試。測試程序包括兩部分,第一部分目的是通過傳遞命令方式配置ADS1298R相應(yīng)寄存器,本測試程序?qū)DS1298R的控制命令集為:

      ADS1299RegVal[27]=

      {0x41,0x18,0x85,0x10,0xdc,0x03,0x05,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0a,0xe3};

      第二部分循環(huán)讀ADS1298R,并將讀到的數(shù)據(jù)以數(shù)據(jù)流的形式存入文件中。

      由以下兩個函數(shù)實(shí)現(xiàn):

      read(spi_fd,&data,3);

      fprintf(stream,"%06lx\40",data);

      測試結(jié)果如圖5所示。

      并且我們還用信號源輸出正弦波形進(jìn)行了單通道測試,其中正弦波幅值為100mVpp,頻率為10Hz。測試結(jié)果如圖6所示,由于配置的A/D增益為6,故輸出波形幅值為600mVpp。

      對采集的波形進(jìn)行功率譜分析,結(jié)果如圖7所示。

      五、結(jié)論

      經(jīng)測試本SPI驅(qū)動能實(shí)現(xiàn)ADS1298R與S3C6410之間的串行數(shù)據(jù)通信。使用帶SPI接口的A/D與微控制器相連進(jìn)行數(shù)據(jù)采集系統(tǒng)的開發(fā)具有占微控制器I/O資源少,硬件連接方便,軟件開發(fā)易于實(shí)現(xiàn)的特點(diǎn)。此SPI驅(qū)動只需稍加修改便可與其他帶SPI接口的A/D相連,具有很好的可移植性。帶SPI接口的A/D與ARM微控制器結(jié)合能很好的應(yīng)用于具有信號采集功能的嵌入式系統(tǒng),如抄表系統(tǒng)、醫(yī)療儀器、監(jiān)控設(shè)備等領(lǐng)域。endprint

      {······

      SPI_CS_LOW( );

      while(!DRDY);

      for(i=0;i<9;i++)

      tab[i] = readByte( );

      SPI_CS_HIGH( );

      ······}

      四、SPI測試程序

      為了測試驅(qū)動的正確性,編寫了測試應(yīng)用程序?qū)︱?qū)動進(jìn)行測試。為了方便對ADS1298R工作模式和狀態(tài)的控制,我們將對ADS1298R的控制命令放在了應(yīng)用程序里。對ADS1298R的控制主要是對其23個可讀可寫寄存器的配置。用ADS1298R內(nèi)部自帶測試信號進(jìn)行測試。測試程序包括兩部分,第一部分目的是通過傳遞命令方式配置ADS1298R相應(yīng)寄存器,本測試程序?qū)DS1298R的控制命令集為:

      ADS1299RegVal[27]=

      {0x41,0x18,0x85,0x10,0xdc,0x03,0x05,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0a,0xe3};

      第二部分循環(huán)讀ADS1298R,并將讀到的數(shù)據(jù)以數(shù)據(jù)流的形式存入文件中。

      由以下兩個函數(shù)實(shí)現(xiàn):

      read(spi_fd,&data,3);

      fprintf(stream,"%06lx\40",data);

      測試結(jié)果如圖5所示。

      并且我們還用信號源輸出正弦波形進(jìn)行了單通道測試,其中正弦波幅值為100mVpp,頻率為10Hz。測試結(jié)果如圖6所示,由于配置的A/D增益為6,故輸出波形幅值為600mVpp。

      對采集的波形進(jìn)行功率譜分析,結(jié)果如圖7所示。

      五、結(jié)論

      經(jīng)測試本SPI驅(qū)動能實(shí)現(xiàn)ADS1298R與S3C6410之間的串行數(shù)據(jù)通信。使用帶SPI接口的A/D與微控制器相連進(jìn)行數(shù)據(jù)采集系統(tǒng)的開發(fā)具有占微控制器I/O資源少,硬件連接方便,軟件開發(fā)易于實(shí)現(xiàn)的特點(diǎn)。此SPI驅(qū)動只需稍加修改便可與其他帶SPI接口的A/D相連,具有很好的可移植性。帶SPI接口的A/D與ARM微控制器結(jié)合能很好的應(yīng)用于具有信號采集功能的嵌入式系統(tǒng),如抄表系統(tǒng)、醫(yī)療儀器、監(jiān)控設(shè)備等領(lǐng)域。endprint

      {······

      SPI_CS_LOW( );

      while(!DRDY);

      for(i=0;i<9;i++)

      tab[i] = readByte( );

      SPI_CS_HIGH( );

      ······}

      四、SPI測試程序

      為了測試驅(qū)動的正確性,編寫了測試應(yīng)用程序?qū)︱?qū)動進(jìn)行測試。為了方便對ADS1298R工作模式和狀態(tài)的控制,我們將對ADS1298R的控制命令放在了應(yīng)用程序里。對ADS1298R的控制主要是對其23個可讀可寫寄存器的配置。用ADS1298R內(nèi)部自帶測試信號進(jìn)行測試。測試程序包括兩部分,第一部分目的是通過傳遞命令方式配置ADS1298R相應(yīng)寄存器,本測試程序?qū)DS1298R的控制命令集為:

      ADS1299RegVal[27]=

      {0x41,0x18,0x85,0x10,0xdc,0x03,0x05,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0a,0xe3};

      第二部分循環(huán)讀ADS1298R,并將讀到的數(shù)據(jù)以數(shù)據(jù)流的形式存入文件中。

      由以下兩個函數(shù)實(shí)現(xiàn):

      read(spi_fd,&data,3);

      fprintf(stream,"%06lx\40",data);

      測試結(jié)果如圖5所示。

      并且我們還用信號源輸出正弦波形進(jìn)行了單通道測試,其中正弦波幅值為100mVpp,頻率為10Hz。測試結(jié)果如圖6所示,由于配置的A/D增益為6,故輸出波形幅值為600mVpp。

      對采集的波形進(jìn)行功率譜分析,結(jié)果如圖7所示。

      五、結(jié)論

      經(jīng)測試本SPI驅(qū)動能實(shí)現(xiàn)ADS1298R與S3C6410之間的串行數(shù)據(jù)通信。使用帶SPI接口的A/D與微控制器相連進(jìn)行數(shù)據(jù)采集系統(tǒng)的開發(fā)具有占微控制器I/O資源少,硬件連接方便,軟件開發(fā)易于實(shí)現(xiàn)的特點(diǎn)。此SPI驅(qū)動只需稍加修改便可與其他帶SPI接口的A/D相連,具有很好的可移植性。帶SPI接口的A/D與ARM微控制器結(jié)合能很好的應(yīng)用于具有信號采集功能的嵌入式系統(tǒng),如抄表系統(tǒng)、醫(yī)療儀器、監(jiān)控設(shè)備等領(lǐng)域。endprint

      成都市| 巴里| 察雅县| 大关县| 台前县| 洛浦县| 扶沟县| 静宁县| 崇义县| 腾冲县| 乌拉特中旗| 鄂托克旗| 托克逊县| 广宁县| 德清县| 重庆市| 武威市| 孝感市| 衡山县| 甘肃省| 宁明县| 开原市| 浏阳市| 土默特左旗| 双城市| 墨竹工卡县| 古丈县| 房产| 基隆市| 马边| 兴和县| 镇宁| 茂名市| 江北区| 福泉市| 无为县| 新郑市| 安陆市| 淮滨县| 汤原县| 黄龙县|