精华内容
下载资源
问答
  • SPI协议

    2020-07-27 15:05:12
    SPI协议1. SPI简介2. 总线结构 1. SPI简介 SPI,是串行外围设备接口(Serial Peripheral Interface)的简称。SPI是一种高速、全双工(可以同时接收和发送数据)、同步的通信总线(接收端和发送端必须在同一时刻接收...

    1. SPI简介

    SPI,是串行外围设备接口(Serial Peripheral Interface)的简称。SPI是一种高速、全双工(可以同时接收和发送数据)、同步的通信总线(接收端和发送端必须在同一时刻接收和发送),并且在芯片的管脚上只占用四根线,节约了芯片引脚。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
    在这里插入图片描述

    2. 总线结构

    SPI通讯使用 3 条总线及片选线,3条总线分别为 SCK、MOSI、MISO,片选线为 SS,它们的作用介绍如下:
    (1)SS( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS,以下用 NSS表示。当有多个 SPI从设备与 SPI主机相连时,设备的其它信号线 SCK、MOSI及 MISO同时并联到相同的 SPI总线上,即无论有多少个从设备,都共同只使用这 3条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以 NSS 线置低电平为开始信号,以 NSS线被拉高作为结束信号

    SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为f pclk /2,两个设备之间通讯时,通讯速率受限于低速设备。

    MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

    MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

    通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

    要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备

    这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

    在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

    SPI总线可配置成单主单从,单主多从,互为主从

    最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

    3. SPI总线四种工作方式

    CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

    CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

    工作方式1:

    当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

    工作方式2:

    当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。

    工作方式3:

    当CPHA=1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

    工作方式4:

    当CPHA=1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。

    展开全文
  • SPI协议详解

    万次阅读 多人点赞 2018-09-19 15:15:27
    1.SPI协议简介 1.1.SPI协议概括  SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,...

    1.SPI协议简介

    1.1.SPI协议概括

      SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.

    SPI主从模式硬件连接如下图

      SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

    • SDO     – 主设备数据输出,从设备数据输入 对应MOSI master output slave input
    • SDI      – 主设备数据输入,从设备数据输出  对应MISO master input slave output
    • SCLK   – 时钟信号,由主设备产生
    • CS        – 从设备使能信号,由主设备控制

      CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

      SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

      要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。

    这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

    在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

    最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

    AT91RM9200的SPI接口主要由4个引脚构成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整个SPI总线的公用时钟,MOSI、MISO作为主机,从机的输入输出的标志,MOSI是主机的输出,从机的输入,MISO 是主机的输入,从机的输出。/SS是从机的标志管脚,在互相通信的两个SPI总线的器件,/SS管脚的电平低的是从机,相反/SS管脚的电平高的是主机。在一个SPI通信系统中,必须有主机。SPI总线可以配置成单主单从,单主多从,互为主从。

    SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。

    2.协议举例

    如下图,是SPI的简单收发时序图。

    SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
           假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
           那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。 

    举例: 
           假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

    这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

         

      SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。下图示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式 (实线表示):                  

                                                        

    3. SPI总线四种工作方式

    SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

           时序详解:

      CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

      CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

      工作方式1:

      当CPHA=0、CPOL=0时SPI总线工作在方式1。MISO引脚上的数据在第一个SPSCK沿跳变之前已经上线了,而为了保证正确传输,MOSI引脚的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,首先将数据上线,然后在同步时钟信号的上升沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

      工作方式2:

      当CPHA=0、CPOL=1时SPI总线工作在方式2。与前者唯一不同之处只是在同步时钟信号的下降沿时捕捉位信号,上升沿时下一位数据上线。

      工作方式3:

      当CPHA=1、CPOL=0时SPI总线工作在方式3。MISO引脚和MOSI引脚上的数据的MSB位必须与SPSCK的第一个边沿同步,在SPI传输过程中,在同步时钟信号周期开始时(上升沿)数据上线,然后在同步时钟信号的下降沿时,SPI的接收方捕捉位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号上线,再重复上述过程,直到一个字节的8位信号传输结束。

      工作方式4:

      当CPHA=1、CPOL=1时SPI总线工作在方式4。与前者唯一不同之处只是在同步时钟信号的上升沿时捕捉位信号,下降沿时下一位数据上线。

    4种工作模式波形时序如下图:

    åç§å·¥ä½æ¹å¼æ¶åº

    4.协议心得

    SPI接口时钟配置心得:

      在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。下面这段话是Sychip Wlan8100 Module Spec上说的,充分说明了时钟极性是如何配置的:

    The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.

    意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。

    又如,下面这段话是摘自LCD Driver IC SSD1289:

    SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

    意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到地位的顺序接收数据的。因此主设备的SPI时钟极性同样应该配置为下降沿有效。

    时钟极性和相位配置正确后,数据才能够被准确的发送和接收, 因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。

    5.SPI协议软件模拟

    5.1.单片机软件模拟SPI接口—加深理解SPI总线协议

            现以 AT89C205l单片机模拟SPI总线操作串行EEPROM 93CA6为例,如图1所示,介绍利用单片机的I/O口通过软件模拟SPI总线的实现方法。在这里,仅介绍读命令的时序和应用子程序。 

    5.2.93C46存储器SPI总线的工作原理

              93CA6作为从设备,其SPI接口使用4条I/O口线:串行时钟线(SK)、输出数据线DO、输入数据线DI和高电平有效的从机选择线CS。其数据的传输格式是高位(MSB)在前,低位(LsB)在后。93C46的SPI总线接口读命令时序如图2所示。 

    5.3.软件模拟SPI接口的实现方法 

              对于不带SPI串行总线接口的AT89C2051单片 机来说,可以使用软件来模拟SPI的操作,图1所示 为AT89C2051单片机与串行EEPROM 93C46的硬件 连接图,其中,P1.0模拟SPI主设备的数据输出端 SDO,P1.2模拟SPI的时钟输出端SCK,P1.3模拟 SPI的从机选择端SCS,P1.1模拟SPI的数据输入 SDI。
             上电复位后首先先将P1.2(SCK)的初始状态设置为0(空闲状态)。
             读操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(10),6位被读的数据地址(A5A4A3A2A1A0),然后通过P1.1口读1位空位(0),之后再读l6位数据(高位在前)。
             写操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(01),6位被写的数据地址(A5A4A3A2A1A0),之后通过P1.0口发送被写的l6位数据(高位在前),写操作之前要发送写允许命令,写之后要发送写禁止命令。
             写允许操作(WEN)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(11XXXX)。              

             写禁止操作(WDS)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。

            下面介绍用C51模拟SPI的子程序。

    /*例子1*/
    //首先定义好I/O口
    sbit SDO=P1^0;
    sbit SDI=P1^1;
    sbit SCK=P1^ 2;
    sbit SCS=P1^3;
    sbit ACC_7= ACC^7;
    unsigned int SpiRead(unsigned char add)
    {
        unsigned char i;
        unsigned int datal6;
        add&=0x3f;/*6位地址*/
        add |=0x80;/*读操作码l0*/
        SDO=1;/*发送1为起始位*/
        SCK=0;
        SCK=1;
        for(i=0;<8;i++)/*发送操作码和地址*/
        {
            if(add&0x80==1)
                SDO=1;
            else 
                SDO=0;
            SCK=0;/*从设备上升沿接收数据*/
            SCK=1;
            add<<= 1;
        }
        SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/
        SCK=0;
        datal6<<= 1;/*读16位数据*/
        for(i=0;<16;i++)
        {
            SCK= 1;
            _nop_();
            if(SDI==1)
                datal6|=0x01;
            SCK =0;
            datal6< < =1;
        }
        return datal6;
    }
        
    /*例子2*/
        #define SS      252                     //定义SS所对应的GPIO接口编号  
        #define SCLK    253                     //定义SCLK所对应的GPIO接口编号  
        #define MOSI    254                     //定义SCLK所对应的GPIO接口编号  
        #define MISO    255                     //定义MISO所对应的GPIO接口编号  
        #define OUTP    1                       //表示GPIO接口方向为输出  
        #define INP 0                           //表示GPIO接口方向为输入  
        
        /* SPI端口初始化 */  
        void spi_init()  
        {  
            set_gpio_direction(SS, OUTP);  
            set_gpio_direction(SCLK, OUTP);  
            set_gpio_direction(MOSI, OUTP);  
            set_gpio_direction(MISO, INP);  
            set_gpio_value(SCLK, 0);//CPOL=0 
            set_gpio_value(MOSI, 0);
        }  
        /*  
        从设备使能  
        enable:为1时,使能信号有效,SS低电平  
        为0时,使能信号无效,SS高电平  
        */  
        void ss_enable(int enable)  
        {  
            if (enable)  
                set_gpio_value(SS, 0);//SS低电平,从设备使能有效  
            else  
                set_gpio_value(SS, 1);//SS高电平,从设备使能无效  
        }  
        
        /* SPI字节写 */  
        void spi_write_byte(unsigned char b)  
        {  
            int i;  
            for (i=7; i>=0; i--) {  
                set_gpio_value(SCLK, 0);  
                set_gpio_value(MOSI, b&(1<<i));//从高位7到低位0进行串行写入  
                delay();//延时  
                set_gpio_value(SCLK, 1);// CPHA=1,在时钟的第一个跳变沿采样  
                delay();      
            }  
        }  
        /* SPI字节读 */  
        unsigned char spi_read_byte()  
        {  
            int i;  
            unsigned char r = 0;  
            for (i=0; i<8; i++) {  
                set_gpio_value(SCLK, 0);  
                delay();//延时  
                set_gpio_value(SCLK, 1);// CPHA=1,在时钟的第一个跳变沿采样  
                r = (r <<1) | get_gpio_value(MISO);//从高位7到低位0进行串行读出  
                delay();  
            }  
        }  
        /*  
            SPI写操作  
            buf:写缓冲区  
            len:写入字节的长度  
        */  
        void spi_write (unsigned char* buf, int len)  
        {  
            int i;  
            spi_init();//初始化GPIO接口  
            ss_enable(1);//从设备使能有效,通信开始  
            delay();//延时  
            //写入数据  
            for (i=0; i<len; i++)
                spi_write_byte(buf[i]);
            delay();
            ss_enable(0);//从设备使能无效,通信结束  
        }  
        /*  
        SPI读操作  
        buf:读缓冲区  
        len:读入字节的长度  
        */  
        void spi_read(unsigned char* buf, int len)  
        {  
            int i;  
            spi_init();//初始化GPIO接口  
            ss_enable(1);//从设备使能有效,通信开始  
            delay();//延时  
            //读入数据
            for (i=0; i<len; i++)
                buf[i] = spi_read_byte();
            delay();
            ss_enable(0);//从设备使能无效,通信结束  
        }

      对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。

     

    6. Linux下的SPI源码

    链接:https://pan.baidu.com/s/1Jm_gDxj-to965ZH3I16dug 密码:c9ki

    加我微信,拉进微信技术讨论群

         喜欢的可以关注微信公众号-嵌入式Linux

     

    展开全文
  • SPI 协议

    2018-07-17 10:32:55
    SPI是利用4根信号线进行通信的串行接口协议,包括主/从两种模式。4个接口信号为:串行数据输入(MISO,主设备输入、从设备输出)、串行数据输出(MOSI,主设备输出、从设备输入)、移位时钟(SCK)、低电平有效的从设备使...

    SPI介绍

    由于SPI(serial peripheral interface)总线占用的接口线少,通信效率高,并且支持大部分处理器芯片,因而是一种理想的选择。SPI是利用4根信号线进行通信的串行接口协议,包括主/从两种模式。4个接口信号为:串行数据输入(MISO,主设备输入、从设备输出)、串行数据输出(MOSI,主设备输出、从设备输入)、移位时钟(SCK)、低电平有效的从设备使能信号(cs)。SPI最大的特点是由主设备时钟信号的出现与否来确定主/从设备间的通信。一旦检测到主设备的时钟信号,数据开始传输。

     

    目录

    ·         SPI工作方式简介

    ·         SPI的数据传输

    ·         SPI用户逻辑

    ·         SPI基本原理与结构

     

    SPI工作方式简介

    ·           SPI是由美国摩托罗拉公司最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口。

      SPI模式可以允许同时同步发送和接收8位数据,并支持4种工作方式:

      1. 串行数据输出,对应RC5/SDO引脚;

      2. 串行数据输入,对应RC4/SDI/SDA引脚;

      3. 串行时钟,对应RC3/SCK/SCL引脚;

      4. 从动方式选择,对应RA5/SS/AN4引脚。

      SPI模式下与之相关的寄存器有10个,其中4个是与I2C模式共用的。

      图1所示是由一个主机对接一个从机进行全双工通信的系统构成的方式。在该系统中,由于主机和从机的角色是固定不变的,并且只有一个从机,因此,可以将主机的一端接高电平,将从机的SS端固定接地。

    全双工主机/从机连接方法

    图1 全双工主机/从机连接方法

     

      若干个具备SPI接口的单片机和若干片兼容SPI接口的外围芯片,可以在软件的控制下,构成多种简单或者复杂的应用系统,例如以下3种。

      (1)一个主机和多个从器件的通信系统。

      如图2所示,各个从器件是单片机的外围扩展芯片,它们的片选端SS分别独占单片机的一条通用I/O引脚,由单片机分时选通它们建立通信。这样省去了单片机在通信线路上发送地址码的麻烦,但是占用了单片机的引脚资源。当外设器件只有一个时,可以不必选通而直接将SS端接地即可。

    一个主机扩展多个外围器件

                         图2 一个主机扩展多个外围器件

      (2)几个单片机互相连接构成多主机通信系统。

      图3所示为3个既可以当作主机也可以当作从机的单片机组成的系统。

    多主机通信系统连接方法

    图3 多主机通信系统连接方法

     

      (3)主机、从机和从器件共同组成的应用系统。

      图4所示为一个主机、一个从机和多片外设芯片组成的应用系统。这些外设芯片有的只接收来自单片机信息,有的只向单片机提供信息,还有的既接收也发送信息。

    主机、从机和从器件互连

    图4主机、从机和从器件互连

     

    SPI的数据传输

    ·           SPI主设备负责产生系统时钟,并决定整个SPI网络的通信速率。所有的SPI设备都采用相同的接口方式,可以通过调整处理器内部寄存器改变时钟的极性和相位。由于SPI器件并不一定遵循同一标准,比如EEPROM、DAC、ADC、实时时钟及温度传感器等器件的SPI接口的时序都有所不同,为了能够满足不同的接口需要,采用时钟的极性和相位可配就能够调整SPI的通信时序。

      SPI设备传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或收发器左移1位数据。对于小于16位的数据在发送之前必须左对齐,如果接收的数据小于16位则采用软件将无效的数据位屏蔽,如图1所示。

      SPI接口有主和从两种操作模式,通过MASTER/SLAVE位(SPICTL.2)选择操作模式以及SPICLK信号的来源,如图2所示。

    SPI通信数据格式

    图1 SPI通信数据格式

    SPI主控制器/从控制器的连接

    图2 SPI主控制器/从控制器的连接

     

    SPI用户逻辑

    ·           该模块针对用户不同的应用来设计,本质上就是用户的具体业务应用,与SPI-4接口没有直接关系。当应用支持多个端口时,这部分就显得至关重要。下面以支持两个端口的应用来说明用户逻辑的设计技巧。

      (1)Sink Core的用户逻辑

      端口为两个时,用户逻辑就需要用两个不同的FIFO根据端口的地址等来分别缓存用户的两个业务数据.同时根据FIFO的情况来发出流控信息给SPI4数据接口,如图1所示。

    Sink Ceore 两个端口的用户逻辑

    图1 Sink Core 两个端口的用户逻辑

     

      (2) Source Core的用户逻辑

      当端口为两个时,用户逻辑就需要根据流控信息和两个不同的FffiOffJ情况来做仲裁,决定哪个用户逻辑FIFO需要发送给SPI4数据接口,如图2所示。

    Source Core2个端口的用户逻辑

    图2 Source Core2个端口的用户逻辑

     

    SPI基本原理与结构

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

      SPI主要使用4个信号:MISO(主机输入/从机输出)、MOSI(主机输出/从机输入)、 SCLK(串行时钟)、http://www.dzsc.com/news/uploadfile/2010122494017498.jpghttp://www.dzsc.com/news/uploadfile/2010122494018992.jpg(外设片选或从机选择)。

      MISO信号由从机在主机的控制下产生。http://www.dzsc.com/news/uploadfile/2010122494018962.jpg信号用于禁止或使能外设的收发功能。http://www.dzsc.com/news/uploadfile/2010122494018922.jpg为高电平时,禁止外设接收和发送数据;http://www.dzsc.com/news/uploadfile/2010122494018643.jpg为低电平时,允许外设接收和发送数据。图1所示是微处理器通过SPI与外设连接的示意图。

    http://www.dzsc.com/news/uploadfile/2010122494018708.jpg

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

    http://www.dzsc.com/news/uploadfile/2010122494018497.jpg

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

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

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

    展开全文
  • spi 协议

    2016-09-30 14:58:55
    SPI总线协议介绍 一、技术性能  SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,...
    

    SPI总线协议介绍

    一、技术性能
            SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。总线结构如下图所示。

    二、接口定义
            SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。

    (1)MOSI:主器件数据输出,从器件数据输入
    (2)MISO:主器件数据输入,从器件数据输出
    (3)SCLK :时钟信号,由主器件产生
    (4)/SS:从器件使能信号,由主器件控制
    三、内部结构

    四、 时钟极性和时钟相位
            在SPI操作中,最重要的两项设置就是时钟极性(CPOL或UCCKPL)和时钟相位(CPHA或UCCKPH)。时钟极性设置时钟空闲时的电平,时钟相位设置读取数据和发送数据的时钟沿。
    主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。

              SPI接口时钟配置心得:在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。



    五、传输时序
            SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。

    五、数据传输
           在一个SPI时钟周期内,会完成如下操作:
    1) 主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;
    2) 从机通过MISO线发送1位数据,主机通过该线读取这1位数据。
    这是通过移位寄存器来实现的。如下图所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。

    六、优缺点

           SPI接口具有如下优点:

           1) 支持全双工操作;

           2) 操作简单;

           3) 数据传输速率较高。

          同时,它也具有如下缺点:

          1) 需要占用主机较多的口线(每个从机都需要一根片选线);

          2) 只支持单个主机。

          3) 没有指定的流控制,没有应答机制确认是否接收到数据。
    展开全文
  • spi协议

    2017-03-29 10:49:57
    SPI:Serial Peripheral Interface的简称,是Motorola首先在其MC68HCXX系列处理器上定义的,一种同步串行外设接口。它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASH,RAM、网络控制器、LCD...
  • SPI协议 通过SPI协议在2个微控制器之间进行通信

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,761
精华内容 1,504
关键字:

spi协议