历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2018年02月05日 | 基于S3C2410的串行外围设备接口SPI及Linux下嵌入式驱动的实现

2018-02-05 来源:eefocus

    串行外围设备接口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的功能与使用

   14.jpg?imageView2/2/w/550

    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。

    15.jpg?imageView2/2/w/550

    16.jpg?imageView2/2/w/550

    17.jpg?imageView2/2/w/550

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

     

   18.jpg?imageView2/2/w/550


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


推荐阅读

史海拾趣

台湾晶豪(ESMT)公司的发展小趣事

晶豪科技一直积极寻求与国内外企业的合作机会。通过与合作伙伴的紧密合作,公司不断拓展业务领域,进入了模拟及混合讯号IC领域。目前,公司提供的产品包括音讯转换器(ADC/DAC)及D类音频放大器等IC。这些新产品的推出不仅丰富了公司的产品线,还为客户提供了更多样化的选择。同时,通过与合作伙伴的资源共享和优势互补,晶豪科技在技术研发和市场拓展方面取得了更多突破。

Array Microsystems Inc公司的发展小趣事

在取得初步成功的基础上,Array Microsystems Inc深知技术创新是企业持续发展的核心动力。因此,公司加大了对研发的投入力度,不断推出新的阵列传感器产品和技术。这些新产品不仅具有更高的性能和更低的成本,还满足了市场不断变化的需求。通过持续的创新和研发,Array Microsystems Inc在电子行业中保持了领先地位。

ADATA公司的发展小趣事

在追求经济效益的同时,Array Microsystems Inc也积极履行社会责任,关注可持续发展。公司致力于推广环保理念和技术应用,推动电子行业的绿色发展。同时,公司还积极参与公益事业和社会活动,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为其长期发展奠定了坚实的基础。

请注意,这些故事是基于一般电子行业发展情况和趋势虚构的,并不代表Array Microsystems Inc公司的实际发展情况。如果您需要了解该公司的真实发展情况,建议您查阅相关资料或咨询专业人士。

BJB公司的发展小趣事

随着科技的不断进步,BJB公司意识到技术创新的重要性。因此,公司加大了研发投入,积极引进先进的技术和设备,致力于照明配件产品的创新和升级。经过不懈的努力,BJB成功研发出具有高效节能、环保低碳特点的照明配件产品,不仅提升了产品的性能和质量,也满足了客户对绿色照明的需求。

Eastron Corp公司的发展小趣事

随着社会的不断发展,Eastron Corp深刻认识到企业的社会责任和可持续发展的重要性。公司积极参与社会公益事业,为当地社区和环境保护做出贡献。同时,Eastron还注重节能减排和环保生产,通过技术创新和工艺改进,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了基础。

请注意,这些故事仅为虚构示例,不代表任何真实事件或公司历史。

千志电子(CCO)公司的发展小趣事

千志电子于1986年由董事长陈初志先生在台湾创立,起初专注于生产各类型插件式电阻。随着业务的不断发展,公司意识到拓展更广阔市场的重要性。1996年,千志电子进军中国市场,在深圳设立了千志电子(深圳)有限公司,这一举措标志着公司开始走向国际化。深圳作为中国改革开放的前沿阵地,为千志电子提供了丰富的资源和广阔的市场空间,为其后续的发展奠定了坚实基础。

问答坊 | AI 解惑

如何开始编写嵌入式软件?

下星期开始,连着休息两个星期,这段时间就离开南京回到我那遥远的家乡了。为了庆祝,特贴出个人心得,望大家支持!觉得好可要跟帖啊!标题有点过了,只是为了多吸引几双眼球,可别以为我就爱吹牛。     这篇心得不是面向初学者的,而是 ...…

查看全部问答>

xilinx讨论帖!

谢谢大家讨论!我想这个帖为讨论xinlinx与积攒的资料!为大家以后找方便。 我先传个资料! …

查看全部问答>

在wince 5.0中看到键盘驱动的驱动中问题

BOOL WINAPI KeyPad_Entry(     UINT uiPddId,     PFN_KEYBD_EVENT pfnKeyPadEvent,     PKEYBD_PDD *ppKeybdPdd     ) {     SETFNAME(_T(\"KeyPad_Entry\"));     BOOL f ...…

查看全部问答>

pdu编码,添加上86后,为什么发送不到某些号上去

如题 具体可以参看 [url=http://blog.eeworld.net/lbjfeng/archive/2009/12/05/4943109.aspx][/url] 后面有具体的说明…

查看全部问答>

CE6下应用使用驱动回传过来的内存地址问题!

软硬件环境:WinCE6 + Pxa310/300 问题: 一个测试overlay2的小应用,在CE5下面使用没有问题,但是CE6下面使用的时候会出现异常。具体是这样的,应用中通过如下方式获得显示驱动回传过来的地址指针, ExtEscape(m_hdc,GET_OVERLAY2_ADDRESS,0,NU ...…

查看全部问答>

关于ADUC812D 功能

有谁知道ADUC812的详细功能 ,谢谢!…

查看全部问答>

请问inline是什么关键字?

                                 为什么IAR编译不过去,得全删除。ADS可以编译通过。…

查看全部问答>

关于异步复位.同步释放

小生初学FPGA,在特权同学编的书《深入浅出FPGA》里看到复位一章的时候,有几个问题不懂,希望能有大大帮忙~异步复位 同步释放异步复位我能理解 但这图里的同步释放怎么解释呢? 我感觉还是会产生亚稳态啊…

查看全部问答>

stm32的启动文件在keil MDK

startup_stm32f10x_hd.S(1): error: A1167E: Invalid line start startup_stm32f10x_hd.S:     1 00000000 /**startup_stm32f10x_hd.S(2): error: A1137E: Unexpected characters at end of linestartup_stm32f10x_hd.S:  ...…

查看全部问答>