歡迎您光臨本站 登入註冊首頁

概述

   串列外圍設備介面SPI(serialperipheralinterface)匯流排技術是Motorola公司推出的一種同步串列介面,它允許CPU與TTL移位寄存器、……

    串列外圍設備介面SPI(serial peripheral interface)匯流排技術是Motorola公司推出的一種同步串列介面,它允許CPU與TTL移位寄存器、A/D或D/A轉換器、實時時鐘(RTO)、存儲器以及LCD和LED顯示驅動器等外圍介面器件以串列方式進行通訊。SPI匯流排只需3~4根數據線和控制線即可擴展具有SPI介面的各種I/O器件,其硬體功能很強,實現軟體相當簡單。串列A/D轉換器具有電路簡單、工作可靠的特點,而ARM晶元被設計用於手持設備以及普通的嵌人式應用的集成系統,將上述兩種實用的晶元和SPI匯流排技術相結合以實現數據採集十分有效。

1 AD7888的功能與使用
    AD7888是美國模擬器件公司推出的一款高速低功耗12位A/D轉換器,採用2.7~5.25 V單電源供電,最大通過率可達到125 kSPS。AD7888的輸入採樣/保持電路在500 ns內獲取一個信號,採用單端採樣模式,包含8個單端模擬輸入,模擬輸入電壓從0到VREF。AD7888有2.5 V的片內基準電壓,也可以使用外部基準電壓,範圍從1.2 V到VDD。CMOS製造工藝確保了低功耗,正常工作時為2 mW,掉電狀態下為3uW。可以選擇多種電源管理模式(包括數據轉換后自動處於掉電模式),與多種串列介面兼容(SPI/QSPI/MICOWIRE/DSP)。AD7888可廣泛應用於電池供電系統(個人數字助理、醫療儀器、移動通信)、儀錶控制系統和高速調製/解調器等領域。該器件採用16腳SOIC和TSSOP外形封裝,外形及引腳定義見圖1和表1。

圖1 AD7888的引腳圖 
 
    AD7888的控制寄存器是8位只寫寄存器。數據在SCLK的上升沿從DIN引腳載人,同時獲取外部模擬量轉換的結果。每次數據的傳輸需要準備16個連續時鐘信號。只有在片選信號下降之後的前8個時鐘脈衝的上升沿提供的信息裝入控制寄存器。
 
    圖2顯示了詳細的串列介面時序圖,串列時鐘提供了轉換時序,且控制AD7888轉換信息的輸入輸出。CS初始化數據傳送和轉換處理。在其下降沿之後的1.5個時鐘周期開始採樣輸入信號,這段時間表示為tACQ(獲取時間)。整個轉換過程還需要14.5個時鐘周期來完成,這段時間表示為tCONVERT(轉換時間)。從AD7888獲取數據的整個轉換過程需要16個時鐘周期。CS上升沿之後,匯流排返回高阻狀態。如果CS繼續保持低電平,則準備新一輪的轉換。進行採樣的輸入通道的選擇是提前寫入控制寄存器的,因此在轉換時,用戶必須提前寫入以備通道的轉換。也就是說,在進行當前轉換時,用戶就必須提前寫入通道的地址以備下次轉換使用。
 
圖2串列介面時序圖

2 S3C2410的主要功能
    S3C2410是三星公司推出的採用RISC結構的16/32位微處理器。它基於ARM920T內核,採用五級流水線和哈佛結構,最高頻率可達203 MHz,是高性能和低功耗的硬宏單元。ARM920T具有增強ARM體系的MMU(支持WinCE,EPOC 32和Linux)、16kB的指令和數據高速緩存以及高速AMBA匯流排介面。S3C2410被設計用於手持設備以及普通的嵌入式應用的集成系統,為了降低整個系統的成本,S3C2410還包括下面的部分:LCD控制器(STN&TFT)、NAND Flash引導裝入程序、系統管理(片選邏輯和SDRAM控制器)、3通道UART,4通道DMA、4通道PWM時鐘、I/O口、RTC、8通道10位ADC及觸摸屏介面、IIC匯流排介面、IIS匯流排介面、USB主口和USB設備口、SD主口和多媒體卡介面、2通道SPI和2通道PLL。
    S3C2410有2個SPI口,可以實現串列數據的傳輸。每個SPI介面各有2個移位寄存器分別負責接收和發送數據。在傳送數據期間,發送數據和接收數據是同步進行的,傳送的頻率可由相應的控制寄存器設定。如果只想發送數據,則接收數據為啞元;如果只想接收數據。則需發送啞元“0xff”。SPI介面共有4個引腳信號:串列時鐘SCK(SPICLK0,1)、主入從出MISO(SPICLK0,1)和主出從入MOSI
(SPIMOSI0,1)數據線、低電平有效引腳/SS(nSSO,1)。
    S3C2410的SPI介面具有如下特點
    (1)兼容SPI協議(ver.2.11);
    (2)有分別用於發送和接收的8位移位寄存器;
    (3)有設定傳送頻率的8位寄存器;
    (4)有輪詢、中斷和DMA三種傳送模式。

3 介面與驅動
    根據S3C2410的SPI特點及AD7888的工作原理確定其介面如圖3所示。
 
圖3  AD7888與S3C2410的連接圖
    為了實現S3C2410和AD7888在嵌入式Linux下的高速A/D轉換,還編寫了兩者介面的驅動程序,該驅動程序功能的實現主要由以下幾個函數完成。
(1)Init_SPI()完成SPI的初始化
  void Init_SPI(void)
{
    int i;
    rSPPRE0=0x32;
    rSPCON0=0x1e;
    for(i=0;i<10;i++)
    rSPTDAT0=0xff;
    rGPECON |=0x0a800000;
    rGPECON&=(~0x05400000);
    rGPEUP |=0x3800;
    //GPH5----->CS
    rGPHCON |=0x0400;
    rGPHCON&=(~0x0800);
    rGPHUP&=(~0x20);
    rGPHDAT |=0x20;
}
(2)ad_wr()寫入要求A/D轉換的通道
    static ssize_t ad_wr(struCt file *file,const char *bur,size_t count,loft_t *offset)
{
    int ret=0;
    int i=0;
    dbuf=kmalloc(count *sizeof(unsigned char),GFP_KERNEL);
    copy_from_user(dbuf,bur,count);
    for(i=0;i<count;i++)
    ADTXdata[i]=dbuf[i];
    kfree(dbuf);
    return ret;
}
(3)ad_rd()得到A/D轉換的結果
  statie ssize_t ad_rd(struet file *file,char *bur,size_t count,loft t *offset)
{
    int ret=0;
    int i=0;
    ad_convert();
    ad_convert();
    dbuf=kmalloc(count *sizeof(unsigned char),GFP KERNEL);
    for(i=0;i<count;i++)
    dbuf[i]=ADRXdata[i];
    copy_to_user(bur,dbuf,count);
    kfree(dbuf);
    return ret;
}
(4)ad_convert()實際完成A/D轉換
void ad_convert(void)
{
    rGPHDAT&=(~0x20);
    udelay(100000);
    spi_tx_data(ADTXdata[0]);
    ADRXdata[0]=rSPRDATO;
    spi_tx_data(0xff);
    ADRXdata [1 ]=rSPRDATO;
    rGPHDAT |=0x20;
}
(5)spi_tx_data()完成發送數據
void spi_tx_data(unsigned char data)
{
    spi_poll_done();
    rSPTDAT0=data;
    spi_poll_done();
}
(6)spi_poll_done()輪詢SPI狀態
static void spi_poll_done(void)
{
    while(!(rSPSTA0&0x01));
}
    說明:1)ADTXdata和ADRXdata是unsigned char的全局數組變數,分別負責存放AD7888的控制寄存器數據和A/D轉換的結果。2)ad_rd()中ad_convert()調用了2次,第1次調用用於通知要采某通道的數據,第2次調用用於得到該通道A/D轉換的結果。這樣雖然犧牲了一些轉換的速度,但可使應用程序編程更加直觀。

4  結論
    應用帶SPI介面的串列A/D轉換器佔用較少的微處理器I/O資源,硬體聯接簡單、軟體易於實現,程序運行效率高。帶有SPI介面的串列A/D轉換器和ARM微處理器的結合可廣泛應用於實現數據採集功能的掌上設備及其他嵌入式的系統,如:醫療儀器、通信設備、抄表設備等領域。


[admin via 研發互助社區 ] AD7888與S3C2410的SPI介面及Linux下嵌入式驅動的實現已經有1963次圍觀

http://cocdig.com/docs/show-post-42244.html