RSS

S3C2410的SPI接口与AD7888及Linux下嵌入式驱动概述02

来源:网络 作者:佚名 时间:2008-07-16 Tag:S3C2410   SPI接口   AD7888   Linux   嵌入式   驱动   点击:

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所示。

AD7888与S3C2410的连接图

图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    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    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转换器和ARM微处理器的结合可广泛应用于实现数据采集功能的掌上设备及其他嵌入式的系统,如:医疗仪器、通信设备、抄表设备等领域

应用带SPI接口的串行A/D转换器占用较少的微处理器I/O资源,硬件联接简单、软件易于实现,程序运行效率高。


1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载