码迷,mamicode.com
首页 > 其他好文 > 详细

模拟SPI的设计

时间:2015-12-11 18:21:11      阅读:641      评论:0      收藏:0      [点我收藏+]

标签:

 

SPI基本原理与结构

  • 串行外围设备接口(SPI)是由Motorola公司开发的、用来在微控制器和外围设备芯片之间实现数据交换的低成本、易使用接口。与标准的串行接口不同,SPI是一个同步协议接口,全双工通信,所有的传输都参照一个共同的时钟,这个同步时钟信号由主机产生。接收数据的外设使用时钟对串行比特流的接收进行同步化。其传输速度可达几Mb/s。

      SPI主要使用4个信号:MISO(主机输入/从机输出)、MOSI(主机输出/从机输入)、 SCLK(串行时钟)、技术分享技术分享(外设片选或从机选择)。

      MISO信号由从机在主机的控制下产生。技术分享信号用于禁止或使能外设的收发功能。技术分享为高电平时,禁止外设接收和发送数据;技术分享为低电平时,允许外设接收和发送数据。图1所示是微处理器通过SPI与外设连接的示意图。

    技术分享

      主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机(如图2所示)。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。

    技术分享

      如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

      当主机发送一个连续的数据流时,有些外设能够进行多字节传输。多数具有SPI接口的存储芯片就以这种方式工作。在这种传输方式下,从机的片选端必须在整个传输过程中保持低电平。此时,一次传输可能会涉及到成千上万字节的信息,而不必在每个字节的数据发送的前后都去检测其起始位和结束位,这正是同步传输方式优于异步传输方式的原因所在。

      虽然SPI有以上优点,然而在图像传输中却很少用到,原因主要是其抗干扰能力差。SPI采用的是单端非平衡的传输方式,即传输的数据位的电压电平是以公共地作为参考的。在这种传输方式中,对于已进入信号中的干扰是无法消除和减弱的。而信号在传输过程中总会受到干扰,而且距离越长干扰越严重,以致于信号传输产生错误。在这种条件下,信号传输就变得毫无意义了。另外,由于单端非平衡传输方式以公共地作为参考点,地线作为信号回流线,因此也存在信号电流。当传输线两端的系统之间存在交流电位差时,这个电位差将直接窜到信号中,形成噪声干扰。所以,为了解决抗干扰问题,通常采用平衡传输(balanced transmission)方式,这里采用比较常见的RS-422。

 例程:

/*
=================================================================================
SPI_ExchangeByte( );
Function : Exchange a byte via the SPI bus
INTPUT   : input, The input byte
OUTPUT   : The output byte from SPI bus
=================================================================================
*/
ui08 SPI_ExchangeByte(ui08 input)
{
    unsigned char i;
    ui08 Temp_byte,RxByte;  
    Temp_byte = input;    
    for(i = 0; i < 8; i++)
    {            
        if(Temp_byte&0x80)
             MOSI_Set;//SDI    = 1;
        else
             MOSI_Clr;//SDI    = 0;

        RxByte=RxByte<<1;
        SCK_Clr;// SCK         = 1;
        SCK_Set;//SCK         = 0; 
            Temp_byte <<= 0x01;
            
        if(MISO_STA==1)  
        { 
            RxByte|=BYTE_BIT0; 
        } 
        else 
        { 
            RxByte&=~BYTE_BIT0; 
        }                     
            
     }
    return(RxByte);
}

 

模拟SPI的设计

标签:

原文地址:http://www.cnblogs.com/BinB-W/p/5039563.html

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!