说说SPI协议

SPI,是英语Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。SPI 是一个环形总线结构,由ss(cs)、sck、sdi、sdo 构成,其时序其实很简单,主要是在sck 的控制下,两个双向移位寄存器进行数据交换。上升沿发送、下降沿接收、高位先发送。上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器假设主机和

从机初始化就绪:并且主机的sbuff=0xaa (10101010),从机的sbuff=0x55(01010101),

那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。

下面将分步对spi 的8 个时钟周期的数据情况演示一遍(假设上升沿发送数据)。

 

这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。      SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。下图示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式 (实线表示):                    
                            
             SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

SPI总线包括1根串行同步时钟信号线以及2根数据线。

       SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI接口时序如图3、图4所示。  

这样就完成了两个寄存器8 位的交换,上面的0--1 表示上升沿、1--0 表示下降沿,sdi、sdo 相对于主机而言的。根据以上分析,一个完整的传送周期是16 位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8 位时钟周期才把数据读回来。SPI 总线是Motorola 公司推出的三线同步接口,同步串行3 线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU 与各种外围器件进行全双工、同步串行通讯。SPI 主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

SPI 总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0 和SPI3 方式。SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。 SPI 主模块和与之通信的外设音时钟相位和极性应该一致。SPI 时序图详解-SPI 接口在模式0 下输出第一位数据的时刻

SPI 接口在模式0 下输出第一位数据的时刻

SPI 接口有四种不同的数据传输时序,取决于CPOL 和CPHL 这两位的组合。图1 中
表现了这四种时序,
时序与 CPOL、CPHL 的关系也可以从图中看出。

图1

CPOL 是用来决定SCK 时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1 时,空闲电平为高电平。CPHA 是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。我们先说说模式 0 这种时序(CPOL=0,CPHA=0),将图1 简化为图2

图2

我们来关注SCK 的第一个时钟周期,在时钟的前沿采样数据(上升沿,第一个时钟沿),在时钟的后沿输出数据(下降沿,第二个时钟沿)。

首先来看主器件,主器件的输出口(MOSI)输出的数据bit1,在在时钟的前沿被从器件采样,那主器件是在何时刻输出 bit1 的呢?bit1 的输出时刻实际上在SCK 信号有效以前,比 SCK 的上升沿还要早半个时钟周期。bit1 的输出时刻与SSEL 信号没有关系。再来看从器件,主器件的输入口 MISO 同样是在时钟的前沿采样从器件输出的bit1 的,那从器件又是在何时刻输出bit1 的呢。从器件是在 SSEL 信号有效后,立即输出bit1,尽管此时SCK 信号还没有起效。关于上面的主器件和从器件输出 bit1 位的时刻,可以从图3、4 中得到验证。

注意图3 中,CS 信号有效后(低电平有效,注意CS 下降沿后发生的情况),故意用延时程序延时了一段时间,之后再向数据寄存器写入了要发送的数据,来观察主器件输出 bit1的情况(MOSI)。可以看出,bit1(值为1)是在SCK 信号有效之前的半个时钟周期的时刻开始输出的(与CS 信号无关),到了 SCK 的第一个时钟周期的上升沿正好被从器件采样。

 图4

图4 中,注意看CS 和MISO 信号。我们可以看出,CS 信号有效后,从器件立刻输出了bit1(值为1)。通常我们进行的 spi 操作都是16 位的。

图5 记录了第一个字节和第二个字节间的相互衔接的过程。

第一个字节的最后一位在SCK 的上升沿被采样,随后的SCK 下降沿,从器件就输出了第二个字节的第一位。

一、技术性能

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

二、接口定义

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

(1)MOSI:主器件数据输出,从器件数据输入
(2)MISO:主器件数据输入,从器件数据输出

(3)SCLK :时钟信号,由主器件产生

(4)/SS:从器件使能信号,由主器件控制

 

四、传输时序

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

的下降沿上数据改变,上升沿一位数据被存入移位寄存器。

SPI 接口没有指定的流控制,没有应答机制确认是否接收到数据。

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

下面这段话是SychipWlan8100 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_CR1 寄存器中的 CPOL 和 CPHA 位,可以用软件选择四种可能的时序关系。CPOL(时钟极性)位控制不传任何数据时的时钟电平状态。此位对主器件和从 器件都有作 用。如果复位 CPOL,SCK 引脚在空闲状态处于低电平。如果将 CPOL 置 1,SCK 引脚在 空闲状态处于高电平。

如果将 CPHA(时钟相位)位置 1,则 SCK 引脚上的第二个边沿(如果复位 CPOL 位,则 为下降沿;如果将 CPOL 位置 1,则为上升沿)对 MSBit 采样。即,在第二个时钟边沿锁存 数据。如果复位 CPHA 位,则 SCK 引脚上的第一个边沿(如果将 CPOL 位置 1,则为下降 沿;如果复位 CPOL 位,则为上升沿)对 MSBit 采样。即,在第一个时钟边沿锁存数据。
CPOL(时钟极性)和 CPHA(时钟相位)位的组合用于选择数据捕获时钟边沿。

                                      

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

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

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

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



补充: 
上文中有一句话:SPI主模块和与之通信的外设备时钟相位和极性应该一致。个人理解这句话有2层意思:其一,主设备SPI时钟和极性的配置应该由外设来决定;其二,二者的配置应该保持一致,即主设备的SDO同从设备的SDO配置一致,主设备的SDI同从设备的SDI配置一致。因为主从设备是在SCLK的控制下,同时发送和接收数据,并通过2个双向移位寄存器来交换数据。工作原理演示如下图:

上升沿主机SDO发送数据1,同时从设备SDO发送数据0;紧接着在SCLK的下降沿的时候从设备的SDI接收到了主机发送过来的数据1,同时主机也接收到了从设备发送过来的数据0.



SPI协议心得
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文档说明来正确配置主设备的时钟。

即主从同时发送,同时接收,在前沿发送的时候,从机也发送,在后沿接收的时候,从机也接收。

接下来我们来看看M451的程序:

SPI,是一种高速的,全双工,同步的通信总线,其工作模式有两种:主模式和从模式,无
论那种模式,都支持
3Mbit/s 的速率,并且还具有传输完成标志和写冲突保护标志。到目前为止,我使用过的具
有SPI 总线的器件,就是存储芯片 Eprom:at25128,在使用过程中,发现的确是有这种
总线的优点。下面以P89LPC900 单片机的SPI 总线来解释SPI 总线的通用使用规则。

SPICLK、MOSI、MISO及/SS,其中SPICLK
是整个SPI 总线的公用时钟,MOSI、MISO 作为主机,从机的输入输出的标志,MOSI 是
主机的输出,从机的输入,MISO 是主机的输入,从机的输出。/SS 是从机的标志管脚,在
互相通信的两个SPI 总线的器件,/SS 管脚的电平低的是从机,相反/SS 管脚的电平高的是
主机。在一个SPI 通信系统中,必须有主机。

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

原文地址:https://www.cnblogs.com/zhugeanran/p/8489682.html