基于S3C2410的串行外围设备接口SPI及Linux下嵌入式驱动的实现

2018-02-05 20:36:51编辑:什么鱼 关键字:S3C2410  串行外围设备  SPI  嵌入式驱动

    串行外围设备接口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。

    

    

    

    图2 显示了详细的串行接口时序图,串行时钟提供了转换时序,且控制AD7888转换信息的输入输出。CS初始化数据传送和转换处理。在其下降沿之后的1.5个时钟周期开始采样输入信号,这段时间表示为tACQ(获取时间)。整个转换过程还需要14.5个时钟周期来完成,这段时间表示为tCONVERT(转换时间)。

    从AD7888获取数据的整个转换过程需要16个时钟周期。CS上升沿之后,总线返回高阻状态。如果CS继续保持低电平,则准备新一轮的转换。进行采样的输入通道的选择是提前写入控制寄存器的,因此在转换时,用户必须提前写入以备通道的转换。也就是说,在进行当前转换时,用户就必须提前写入通道的地址以备下次转换使用。

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

     

   


    AD7888的控制寄存器是8位只写寄存器。数据在SCLK的上升沿从DIN引脚载人,同时获取外部模拟量转换的结果。每次数据的传输需要准备16个连续时钟信号。只有在片选信号下降之后的前8个时钟脉冲的上升沿提供的信息装入控制寄存器。

    为了实现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转换器占用较少的微处理器I/O资源,硬件联接简单、软件易于实现,程序运行效率高。带有SPI接口的串行A/D 转换器和ARM微处理器的结合可广泛应用于实现数据采集功能的掌上设备及其他嵌入式的系统,如:医疗仪器、通信设备、抄表设备等领域。


关键字:S3C2410  串行外围设备  SPI  嵌入式驱动

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018020537691.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于Android系统环境的嵌入式Web服务器设计
下一篇:基于ARM920T内核的16/32位RISC嵌入式CPU的解析方案

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

C51、STM32和S3C2440中断体系的比较

/* 名称:C51、STM32和S3C2440中断体系的比较 说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。目前总结的,差不多就是这些吧。*/
发表于 2018-07-21 14:40:54

S3C2440学习之GPIO按键控制LED灯

/* 名称:S3C2440学习之GPIO按键控制LED灯 说明:这是实验2440GPIO的输入功能。基本的流程和51单片机开发的差不多。都是对GPIO端口寄存器的控制不同的是,51单片机可以直接对进行位控制,而2440中GPIO只能对32位的寄存器进行写入或者读出。这样的话,对于有些逻辑操作要稍微复杂点。还有个不同的是,无论是STM32还是51在进行IO按键输入的时候,都需要进行按键消抖,在这里却没又体现出来按键消抖,这是为什么呢?据我了解是这样,在进行51和STM32实验的时候,按键控制的是数码管(数字增加,降低),所以按键的机械抖动会给数码管数字的变化带来显著的影响。在这里是按键控制led灯的亮和灭
发表于 2018-07-21 11:58:46

S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作

的I2C驱动子系统,相对硬件来说肯定必须得先有驱动。有了驱动从设备才能有效工作,才能软性的帮助适配器操控从设备工作。所以对于S3C2440开发板我们要知道: (1)2440中的I2C控制器(i2c-s3c2410)有一个驱动(s3c2440中的I2C适配器驱动基于platform实现)。这个用来操作控制器来产生特定的I2C的时序信号,来发送数据和接收数据。也就是让适配器工作。(2)挂接在I2C总线上的从设备AT24C02(e2prom)为例,它也有一个驱动,这个用来操作读写我们的芯片,读取和存放具体获得的数据。在Linux系统中,上述的两个驱动,第一个属于I2C总线驱动,第二个属于I2C
发表于 2018-07-15 22:30:09

STC12C5A60S2单片机的内置EEPROM的使用

EEPROM可以用来存储一些需要在掉电以后不丢失的数据,STC12C5A60S2单片机内部有1k byte的EEPROM,2个扇区,在编程的时候注意,对于一个扇区的数据都要一起写进去,即使不改也要重新写。测试的代码:#include <STC12C5A.H>#include"intrins.h"#include<stdio.h>   #define uchar unsigned char#define uint unsigned int#define ADC_POWER  0x80#define ADC_FLAG  
发表于 2018-06-20 22:30:54

STC 12C5A60S2串口2通信主要代码示例

用过stc12C5A60S2单片机的朋友都知道,该单片机有两个串口可用,看到官网的程序注释的也是比较多,所以自己写了个串口2使用的程序,由于代码相对简单,所以这里只罗列出了串口2的的初始化、发送和接收函数供大家参考。程序包含了STC12C5A60S2.H的头文件,这个网上都有,大家懂的。这个是初始化的函数,可以添加到程序中调用就可以了。这里是用了独立波特率发生器产生4800的波特率,晶振是24M,这个是用STC波特率计算机生成后添加了后面红字部分,大家如果用其他晶振或者波特率可以下个重新生成然后修改即可。void uart_2_Init(void)//4800bps@24MHz{AUXR &= 0xf7;  
发表于 2018-06-20 22:26:19

S3C2440内存控制详解

S3C2410X has 117 multi-functionalinput/output port pins. The ports are:— Port A (GPA): 23-output port— Port B (GPB): 11-input/output port— Port C (GPC): 16-input/output port— Port D (GPD): 16-input/output port— Port E (GPE): 16-input/output port— Port F (GPF): 8-input/output port— Port G (GPG): 16-input/output port— Port
发表于 2018-06-05 20:53:25

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved