spi 订阅
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。 展开全文
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。
信息
应    用
手机、数码、液晶显示器、机顶盒
外文名
Serial Peripheral Interface
缩    写
SPI
中文名
串行外设接口
学    科
通信
特    性
支持全双工
SPI基本协议
SPI总线是一种4线总线,因其硬件功能很强,所以与SPI有关的软件就相当简单,使中央处理器(Central Processing Unit,CPU)有更多的时间处理其他事务。正是因为这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。SPI是一种高速、高效率的串行接口技术。通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换。SPI是一个环形结构,通信时需要至少4根线(事实上在单向传输时3根线也可以) [1]  。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;(3)SCLK – Serial Clock,时钟信号,由主设备产生;(4)CS – Chip Select,从设备使能信号,由主设备控制。其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,主要是在sck的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿 合并图册(2张) 到来的时候,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方式 (实线表示): SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;SPI主模块和与之通信的外设时钟相位和极性应该一致。SPI接口时序如图3、图4所示。 该模块针对用户不同的应用来设计,本质上就是用户的具体业务应用,与SPI-4接口没有直接关系。当应用支持多个端口时,这部分就显得至关重要。下面以支持两个端口的应用来说明用户逻辑的设计技巧。(1)Sink Core的用户逻辑端口为两个时,用户逻辑就需要用两个不同的FIFO根据端口的地址等来分别缓存用户的两个业务数据.同时根据FIFO的情况来发出流控信息给SPI4数据接口,如图1所示。 图1 Sink Core 两个端口的用户逻辑(2) Source Core的用户逻辑当端口为两个时,用户逻辑就需要根据流控信息和两个不同的FffiOffJ情况来做仲裁,谀定哪个用户逻辑FIFO需要发送给SPI4数据接口,如图2所示. 图2 Source Core2个端口的用户逻辑SPI有3种规格,如右图所示为其模型。 3种SPI的处理流程大同小异,使用最多的SPI-4为例来说明SPI的原理。它在发送接口和接收接口都有各自的数据通道和流控状态信息通道,其数据通道和流控状态信息通道是独立的并且是点对点通信。数据是以包的形式发送,根据数据包中的内嵌地址可支持高达256个端口,以下分别说明基本协议及数据通道和流控状态信息的处理过程。SPI时序图详解---SPI接口在模式0下输出第一位数据的时刻。 SPI接口有四种不同的数据传输时序,取决于CPOL和CPHL这两位的组合。图1中表现了这四种时序,时序与CPOL、CPHA的关系也可以从图中看出。CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样 [2]  。SPI:高速同步串行口。是一种标准的四线同步双向串行总线,是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。(1)MOSI– SPI总线主机输出/ 从机输入(SPI Bus Master Output/Slave Input);(2)MISO– SPI总线主机输入/ 从机输出(SPI Bus Master Input/Slave Output);(3)SCLK –时钟信号,由主设备产生;(4)CS – 从设备使能信号,由主设备控制(Chip select),有的IC此pin脚叫SS。其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,同时一位数据被存入移位寄存器。AT91RM9200的SPI接口主要由4个引脚构成:SPICLK、MOSI、MISO及 NSS,其中SPICLK是整个SPI总线的公用时钟,MOSI、MISO作为主机,从机的输入输出的标志,MOSI是主机的输出,从机的输入,MISO 是主机的输入,从机的输出。NSS是从机的标志管脚,在互相通信的两个SPI总线的器件,NSS管脚的电平低的是从机,相反NSS管脚的电平高的是主机。在一个SPI通信系统中,必须有主机。SPI总线可以配置成单主单从,单主多从,互为主从。SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候 数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成了一个spi时序。上文中最后一句话:SPI主模块和与之通信的外设备时钟相位和极性应该一致。个人理解这句话有2层意思:其一,主设备SPI时钟和极性的配置应该由外设来决定;其二,二者的配置应该保持一致,即主设备的SDO同从设备的SDO配置一致,主设备的SDI同从设备的SDI配置一致。因为主从设备是在SCLK的控制下,同时发送和接收数据,并通过2个双向移位寄存器来交换数据。工作原理演示如下图:上升沿主机SDO发送数据1,同时从设备SDO发送数据0;紧接着在SCLK的下降沿的时候从设备的SDI接收到了主机发送过来的数据1,同时主机也接收到了从设备发送过来的数据0。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文档说明来正确配置主设备的时钟。假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据脉冲主机sbuff 从机sbuff sdi sdo0 10101010 01010101 0 01上 0101010x 1010101x 0 11下 01010100 10101011 0 12上 1010100x 0101011x 1 02下 10101001 01010110 1 03上 0101001x 1010110x 0 13下 01010010 10101101 0 14上 1010010x 0101101x 1 04下 10100101 01011010 1 05上 0100101x 1011010x 0 15下 01001010 10110101 0 16上 1001010x 0110101x 1 06下 10010101 01101010 1 07上 0010101x 1101010x 0 17下 00101010 11010101 0 18上 0101010x 1010101x 1 08下 01010101 10101010 1 0这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MISO,一条数据输出线MOSI;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。下图示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式 (实线表示):SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。
收起全文
精华内容
下载资源
问答
  • SPI

    千次阅读 多人点赞 2020-01-07 14:29:56
    SPI通信原理 SPI通信模式 数据传输 简介 SPI(Serial Peripheral interface),串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线。在芯片的管脚上只...

    目录

    简介

    SPI通信原理

    SPI通信模式

    数据传输


    简介

    SPI(Serial Peripheral interface),串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。
    SPI,是一种高速的,全双工,同步的通信总线。在芯片的管脚上只占用四根线。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

    SPI通信原理

    SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
    (1)SDO/MOSI – 主设备数据输出,从设备数据输入;
    (2)SDI/MISO – 主设备数据输入,从设备数据输出;
    (3)SCLK – 时钟信号,由主设备产生;
    (4)CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。

    SPI通信模式

    SPI采用同步方式传输数据,Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的。注意:当没有数据交流时,时钟线要么保持高电平要么保持低电平。

    SPI通信有4种不同的模式:
    Mode0:CPOL=0,CPHA=0
    Mode1:CPOL=0,CPHA=1
    Mode2:CPOL=1,CPHA=0
    Mode3:CPOL=1,CPHA=1

    注意:不同的从设备一般在出厂时就配置为某种模式,这是不能改变的;但SPI通信双方必须是工作在同一模式下,所以我们需要对主设备的SPI模式进行配置,通过配置CPOL(时钟极性)和CPHA(时钟相位)来控制主设备的通信模式,

    CPOL时钟极性,表示 SPI 在空闲时,时钟信号是高电平还是低电平。CPHA是用来配置数据采样是在第几个边沿:
    CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
    CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
    CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
    CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿

    例:
    CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。

    CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

    CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

    CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

    数据传输

    SPI 设备间的数据传输又被称为数据交换, 因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)".

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

    一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上. 在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的(虽然发送后紧接着的读取是无意义的,但仍然需要从寄存器中读出来)

    展开全文
  • spi

    2017-09-08 01:29:25
    spi协议简介SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准。 SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行...

    spi协议简介

    SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准。 SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信.

    SPI 主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间. 它在芯片中只占用四根管脚 (Pin) 用来控制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间. 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI技术.

    spi接口

    SPI接口经常被称为4线串行总线,以主/从方式工作,数据传输过程由主机初始化。

    • SCLK:串行时钟,用来同步数据传输,由主机输出;
    • MOSI:主机输出从机输入数据线;
    • MISO:主机输入从机输出数据线;
    • CS:片选线,低电平有效,由主机输出。

    特点

    可以同时发出和接收串行数据;可以当作主机或者从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

    优缺点

    SPI接口具有如下优点:

    1) 支持全双工操作;

    2) 操作简单;
    3) 数据传输速率较高。

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

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

    2) 只支持单个主机。

    参考博客

    弄懂SPI接口

    spi协议及工作原理分析

    SPI读写总结

    展开全文
  • STM32 SPI详解

    万次阅读 多人点赞 2016-07-17 22:28:23
    1、 SPI简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号...

    目录

    1、SPI简介

    2、SPI特点

    2.1、SPI控制方式

    2.2、SPI传输方式

    2.3、SPI数据交换

    2.4、SPI传输模式

    3、工作机制

    3.1、相关缩写

    3.2、CPOL极性

    3.3、CPHA相位

    3.4、极性和相位图示

    3.5 、软件设置极性和相位

    4、STM32的SPI控制模块

    5、SPI的应用

    6、code


    1、SPI简介

    SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。

     

    2、SPI特点

    2.1、SPI控制方式

    采用主-从模式(Master-Slave) 的控制方式。

    SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。

     

    2.2、SPI传输方式

    采用同步方式(Synchronous)传输数据

    Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的。

    2.3、SPI数据交换

    SPI数据交换框图

    上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件(Module):

    SSPBUF,Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;

    SSPSR, Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;

    Controller, 泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式。

     

    SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了. 一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上. 在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的。

     

    上面的过程转为动画

    初始状态

     

    主机读取一个bit过程

    总结:

    没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

     

    2.4、SPI传输模式

    上升沿、下降沿、前沿、后沿触发。当然也有MSB和LSB传输方式.

     

    3、工作机制

    3.1、相关缩写

    SPI的极性Polarity和相位Phase,最常见的写法是CPOL和CPHA,不过也有一些其他写法,简单总结如下:

    (1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性

    (2) CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位

    (3) SCK=SCLK=SPI的时钟

    (4) Edge=边沿,即时钟电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge)

    对于一个时钟周期内,有两个edge,分别称为:

    Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;

    Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候;

     

    3.2、CPOL极性

    先说什么是SCLK时钟的空闲时刻,其就是当SCLK在数发送8个bit比特数据之前和之后的状态,于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。

    先说英文,其精简解释为:Clock Polarity = IDLE state of SCK。

    再用中文详解:

    SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:

    CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;

    CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;

     

    3.3、CPHA相位

    首先说明一点,capture strobe = latch = read = sample,都是表示数据采样,数据有效的时刻。相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。

    对于:

    CPHA=0,表示第一个边沿:

    对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;

    对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;

    CPHA=1,表示第二个边沿:

    对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;

     

    3.4、极性和相位图示

    图例1

    图例2

    3.5 、软件设置极性和相位

    SPI分主设备和从设备,两者通过SPI协议通讯。

    而设置SPI的模式,是从设备的模式,决定了主设备的模式。

    所以要先去搞懂从设备的SPI是何种模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。

    对于从设备的SPI是什么模式,有两种:

     

    1.固定的,有SPI从设备硬件决定的

    SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:

    关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;

    然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。

     

    2.可配置的,由软件自己设定

    从设备也是一个SPI控制器,4种模式都支持,此时只要自己设置为某种模式即可。

    然后知道了从设备的模式后,再去将SPI主设备的模式,设置为和从设备模式一样,即可。

    对于如何配置SPI的CPOL和CPHA的话,不多细说,多数都是直接去写对应的SPI控制器中对应寄存器中的CPOL和CPHA那两位,写0或写1即可。

     

    4、STM32的SPI控制模块

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

    SPI接口一般使用4条线通信:

    MISO  主设备数据输入,从设备数据输出。

    MOSI  主设备数据输出,从设备数据输入。

    SCLK  时钟信号,由主设备产生。

    CS  从设备片选信号,由主设备控制。

    SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

    STM32的SPI功能很强大,SPI时钟最多可以到18Mhz,支持DMA,可以配置为SPI协议或者I2S协议

     

    关于SPI,从数据手册查到

    STM32F207VCT6共有3个SPI。

    从下表查出每个SPI对应的管脚

    STM32标准外设库SPI_InitTypeDef的定义

    
    typedef struct
    {
        uint16_t SPI_Direction; // 设置SPI 的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式
       uint16_t SPI_Mode; // 设置SPI 的主从模式
       uint16_t SPI_DataSize; // 为8 位还是16 位帧格式选择项
       uint16_t SPI_CPOL; // 设置时钟极性
       uint16_t SPI_CPHA; // 设置时钟相位
       uint16_t SPI_NSS;   //设置NSS 信号由硬件(NSS管脚)还是软件控制
       uint16_t SPI_BaudRatePrescaler;  //设置SPI 波特率预分频值
       uint16_t SPI_FirstBit;    //设置数据传输顺序是MSB 位在前还是LSB 位在前
       uint16_t SPI_CRCPolynomial; //设置CRC 校验多项式,提高通信可靠性,大于1 即可
    }SPI_InitTypeDef;

    第一个参数SPI_Direction 是用来设置SPI的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式,这里我们选择全双工模式SPI_Direction_2Lines_FullDuplex。

    第二个参数SPI_Mode用来设置SPI的主从模式,这里我们设置为主机模式 SPI_Mode_Master,当然有需要你也可以选择为从机模式 SPI_Mode_Slave。

    第三个参数SPI_DataSiz为8位还是16位帧格式选择项,这里我们是8位传输,选择SPI_DataSize_8b。

    第四个参数SPI_CPOL用来设置时钟极性,我们设置串行同步时钟的空闲状态为高电平所以我们选择SPI_CPOL_High。

    第五个参数SPI_CPHA 用来设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为第一个或者第二个条边沿采集,这里我们选择第二个跳变沿,所以选择 SPI_CPHA_2Edge

    第六个参数SPI_NSS设置NSS信号由硬件(NSS管脚)还是软件控制,这里我们通过软件控制NSS关键,而不是硬件自动控制,所以选择 SPI_NSS_Soft。

    第七个参数 SPI_BaudRatePrescaler很关键,就是设置 SPI 波特率预分频值也就是决定 SPI 的时钟的参数,从不分频道256分频8个可选值,初始化的时候我们选择256分频值SPI_BaudRatePrescaler_256,传输速度为36M/256=140.625KHz。

    第八个参数 SPI_FirstBit设置数据传输顺序是 MSB 位在前还是LSB位在前,这里我们选择SPI_FirstBit_MSB高位在前。

    第九个参数 SPI_CRCPolynomial是用来设置CRC校验多项式,提高通信可靠性,大于1即可。

    示例代码:

    void  SPIInit( void )
    {
        SPI_InitTypeDef SPI_InitStructure;
        FLASH_GPIO_Init();
        /*!< Deselect the FLASH: Chip Select high */
        GPIO_SetBits( GPIOA, GPIO_Pin_4 );
        /*!< SPI configuration */
        SPI_InitStructure.SPI_Direction     = SPI_Direction_2Lines_FullDuplex;      /* 双线双向全双工 */
        SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;                      /* 主 SPI */
        SPI_InitStructure.SPI_DataSize      = SPI_DataSize_8b;                      /* SPI 发送接收 8 位帧结构 */
        SPI_InitStructure.SPI_CPOL      = SPI_CPOL_High;                        /* 串行同步时钟的空闲状态为高电平 */
        SPI_InitStructure.SPI_CPHA      = SPI_CPHA_2Edge;                       /* 第二个跳变沿数据被采样 */
        SPI_InitStructure.SPI_NSS       = SPI_NSS_Soft;                         /* NSS 信号由软件控制 */
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;             /* 预分频 16 */
     
        SPI_InitStructure.SPI_FirstBit      = SPI_FirstBit_MSB;                     /* 数据传输从 MSB 位开始 */
        SPI_InitStructure.SPI_CRCPolynomial = 7;                                    /* CRC 值计算的多项式 */
        SPI_Init( SPI1, &SPI_InitStructure );
        /*!< Enable the sFLASH_SPI  */
        SPI_Cmd( SPI1, ENABLE );
    }

    看到这里,可能觉的前面讲原理并没有太大的用处,因为STM32集成了SPI控制器,配置一下即可。

     

    一方面我们学习原理是为了更好的理解SPI,用于对接不同的SPI设备,像norflash的spi驱动网上有大量的例子,不容易出错。但并不是特别常见的,spi驱动SD卡,SPI驱动网络PHY,SPI驱动ESP8266,甚至在设计两个IC通信时,由于没有过多GPIO,又觉的IIC通信速度慢的话,可以设计两个IC之间使用SPI通信,显然这些场景就需要了解SPI的原理

     

    另外一方面,实际应用中,有可能因为芯片其他管脚用于特殊功能,留下的管脚没有硬件SPI功能,只能模拟实现,这个时候学习SPI原理就很有必要了。

    5、SPI的应用

    SPI的常用应用NorFlash

    从数据手册上看到,SPI传输:CKPOL=1 , CKPHA=1

    所以STM32的SPI读取NorFlash的配置如下

    抓取下面代码波形

    抓取的波形如下

    0100 1011 就是0X4B

     

    其中看到:

    起始电平是高电平,也就是CKPOL=1

    第二个边沿采样,也就是CKPHA=1

    其实说成类似IIC的高电平有效也是没有问题的

    下面这句话是写模拟SPI的核心

    自己的理解:在下降沿转换数据,在上升沿采样数据

     

    除了抓取波形,在华邦Flash也看到了时序图

    6、code

    读取norflash

    使用STM32F207硬件SPI模块

    /**
      * @brief  Initializes the peripherals used by the SPI FLASH driver.
      * @param  None
      * @retval None
      */
    void FLASH_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;
      
      /*!< Enable the SPI clock */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
      
      /*!< Enable GPIO clocks */
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 
      /*!< SPI pins configuration *************************************************/
      
      /*!< Connect SPI pins to AF5 */  
      GPIO_PinAFConfig(GPIOA, 5, GPIO_AF_SPI1);
      GPIO_PinAFConfig(GPIOA, 6, GPIO_AF_SPI1);
      GPIO_PinAFConfig(GPIOB, 5, GPIO_AF_SPI1);
      
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;//GPIO_PuPd_DOWN;
      
      /*!< SPI SCK pin configuration */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      /*!< SPI MISO pin configuration */
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      /*!< SPI MOSI pin configuration */
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      
      /*!< Configure sFLASH Card CS pin in output pushpull mode */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_Init(GPIOE, &GPIO_InitStructure);
    }
    
    /**
      * @brief  Initializes the peripherals used by the SPI FLASH driver.
      * @param  None
      * @retval None
      */
    void  FLASH_SPIInit(void)
    {  
      
      SPI_InitTypeDef  SPI_InitStructure;
      
      FLASH_GPIO_Init();
      
      /*!< Deselect the FLASH: Chip Select high */
      GPIO_SetBits(GPIOE,GPIO_Pin_12);
      
      /*!< SPI configuration */
      SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线双向全双工
      SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主 SPI
      SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;// SPI 发送接收 8 位帧结构
      SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平 
      SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样
      SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS 信号由软件控制
      SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//预分频 16
      
      SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//数据传输从 MSB 位开始
      SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC 值计算的多项式
      SPI_Init(SPI1, &SPI_InitStructure);
      /*!< Enable the sFLASH_SPI  */
      SPI_Cmd(SPI1, ENABLE);
    }

    软件模拟SPI协议

    /**
      * @brief  Sends a byte through the SPI interface and return the byte received
      *         from the SPI bus.
      * @param  byte: byte to send.
      * @retval The value of the received byte.
      */
    uint8_t SPI_ReadWriteByte(uint8_t data)
    {
      uint8_t i,data_read = 0;  
      if(data!=0xA5){
        for(i=0;i<8;i++){
          MSPI_CLK_L(); 		                                               
          if(data&0x80){		                                                
    	MSPI_MOSI_H();
          }else{
    	MSPI_MOSI_L();
          }
          MSPI_DELAY();
          data = data<<1;		                                                
          MSPI_CLK_H(); 		                                                
          MSPI_DELAY();	                                                        
        }
        return data_read;
      }else{
        for(i=0;i<8;i++){
          MSPI_CLK_L();			                                 
          MSPI_DELAY();			                                 
          data_read = data_read<<1;			                               
          MSPI_CLK_H();			                                
          if(MSPI_READ_IN()){	                                                
    	data_read |= 0x01;		                               
          }
          MSPI_DELAY();
        }
        return data_read;
      }                                              
    }
    
    /**
      * @brief  Initializes the peripherals used by the SPI FLASH driver.
      * @param  None
      * @retval None
      */
    void FLASH_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;
    
      /*!< Enable GPIO clocks */
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
      
      /*!< Configure sFLASH Card CS pin in output pushpull mode */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_Init(GPIOE, &GPIO_InitStructure);
      
      /*!< SPI SCK pin configuration */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      MSPI_CLK_H();
      
      /*!< SPI MOSI pin configuration */
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      MSPI_MOSI_H();
      
      /*!< SPI MISO pin configuration */
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    
    /**
      * @brief  Initializes the peripherals used by the SPI FLASH driver.
      * @param  None
      * @retval None
      */
    void  FLASH_SPIInit(void)
    {  
      
      FLASH_GPIO_Init();
      
      /*!< Deselect the FLASH: Chip Select high */
      GPIO_SetBits(GPIOE,GPIO_Pin_12);
    }

     

    开源地址:

    https://github.com/strongercjd/STM32F207VCT6

     

    点击查看本文所在的专辑,STM32F207教程

     

    关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通

     

     

     

    展开全文
  • SPI接口详细介绍

    万次阅读 多人点赞 2018-10-16 20:02:45
    SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线。常规只占用四根线,节约了芯片管脚,PCB的布局省空间。现在越来越多的芯片集成了这种通信协议,常见的有EEPROM、...

    1. 概述

    SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线。常规只占用四根线,节约了芯片管脚,PCB的布局省空间。现在越来越多的芯片集成了这种通信协议,常见的有EEPROM、FLASH、AD转换器等。

    • 优点:

    支持全双工,push-pull的驱动性能相比open-drain信号完整性更好

    支持高速(100MHz以上);

    协议支持字长不限于8bits,可根据应用特点灵活选择消息字长;

    硬件连接简单;

    • 缺点:

    相比IIC多两根线;

    没有寻址机制,只能靠片选选择不同设备;

    没有从设备接受ACK,主设备对于发送成功与否不得而知;

    典型应用只支持单主控;

    相比RS232 RS485和CAN总线,SPI传输距离短;

     

    2. 硬件结构

    SPI总线定义两个及以上设备间的数据通信,提供时钟的设备为主设备Master,接收时钟的设备为从设备Slave;

    • 信号定义如下:

    SCK : Serial Clock 串行时钟

    MOSI : Master Output, Slave Input 主发从收信号

    MISO : Master Input, Slave Output 主收从发信号

    SS/CS : Slave Select 片选信号

    • 电路连接如下:

    单个主设备和单个从设备:

    单个主设备和多个从设备,通过多个片选信号或者菊花链方式实现:

    3. 寄存器类型

    Motorola定义的SPI寄存器包括:

    SPI Control Register 1 (SPICR1)    控制寄存器1

    SPI Control Register 2 (SPICR2)    控制寄存器2

    SPI Baud Rate Register (SPIBR)    波特率寄存器

    SPI Status Register (SPISR)            状态寄存器  (只读   其余均可读可写)

    SPI Data Register (SPIDR)              数据寄存器

    通过往寄存器中写入不同的值,设置SPI模块的不同属性。

     

    4. SPI传输模式

    通过设置控制寄存器SPICR1中的CPOLCPHA位,将SPI可以分成四种传输模式。

    CPOL,即Clock Polarity,决定时钟空闲时的电平为高或低。对于SPI数据传输格式没有显著影响。

    1 = 时钟低电平时有效,空闲时为高

    0 = 时钟高电平时有效,空闲时为低

    CPHA,即Clock Phase,定义SPI数据传输的两种基本模式。

    1 = 数据采样发生在时钟(SCK)偶数(2,4,6,...,16)边沿(包括上下边沿)

    0 = 数据采样发生在时钟(SCK)奇数(1,3,5,...,15)边沿(包括上下边沿)

     

    四种模式如下图所示:

    先看第一列两张图(CPHA = 0),采样发生在第一个时钟跳变沿,即数据采样发生在SCK奇数边沿;再看第二列(CPHA =1),采样发生在第二个时钟跳变沿,即数据采样发生在SCK偶数边沿

    第一行两张图,第二行两张图(CPOL = 1),SCK空闲状态为高电平。

    主从设备进行SPI通讯时,要确保它们的传输模式设置相同。

    其中mode0mode3最为常见,SPI接口的flash中均会有标注。

    5. 读写操作

    • 标准SPI读写为例

    片选---读指令---地址---数据读出

     

    片选---写指令---地址---数据写入

     

    • Dual I/O Fast Read Sequence Diagram  双路IO

    • Quad I/O Fast Read Sequence Diagram  四路IO

    与IIC一样,是一种最常见的板内芯片间的串行接口。

    欢迎加入硬件QQ群:1018083751,一起讨论硬件问题,分享调试心得,共同成长。

     

    展开全文
  • SPI协议详解

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

    万次阅读 多人点赞 2018-05-16 14:51:34
    《STM32中文参考手册V10》-第23章 串行外设接口SPI   SPI的基本介绍 SPI的简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是Motorola首先在其MC68HCXX系列处理器上定义的...
  • 2、spi控制器驱动(作为spi master) 3、spi设备驱动(作为spi slave) 本来,master与slave之间可以直接进行通信,但是这样耦合程序就很大。 更改一点就得全改,因为spi的时钟有不同的极性以及空闲时时间线的定义...
  • 标准SPI、DUAL SPI、Quad SPI

    千次阅读 2019-05-22 16:57:06
    1. 标准SPI 标准SPI通常就称SPI,它是一种串行外设接口规范,有4根引脚信号:clk , cs, mosi, miso 2. Dual SPI 它只是针对SPI Flash而言,不是针对所有SPI外设。对于SPI Flash,全双工并不常用,因此扩展了mosi...
  • 标准SPI,Dual SPI和Qual SPI

    万次阅读 2018-01-13 14:25:41
    1. 标准SPI 标准SPI通常就称SPI,它是一种串行外设接口规范,有4根引脚信号:clk , cs, mosi, miso 2. Dual SPI 它只是针对SPI Flash而言,不是针对所有SPI外设。对于SPI Flash,全双工并不常用,因此扩展了mosi...
  • spi 01-spi 是什么?入门使用 spi 02-spi 的实战解决 slf4j 包冲突问题 spi 03-spi jdk 实现源码解析 spi 04-spi dubbo 实现源码解析 spi 05-dubbo adaptive extension 自适应拓展 spi 06-自己从零手写实现 SPI 框架...
  • 如何理解Stand SPI Dual SPI 和Quad SPI

    千次阅读 2019-04-18 10:37:20
    如何理解Stand SPI Dual SPI 和Quad SPI 1.首先看一下接口 Standard SPI: CLK, /CS, DI, DO, /WP, /Hold 这是全双工模式,输入和输出可以同时进行(mosi, miso分别对应的是DI和DO) Dual SPI: CLK, /CS, IO0, IO1, /WP...
  • 如何区分标准SPI, Dual SPI, Quad SPI?

    万次阅读 2018-11-02 09:16:59
    最近在拿ESP8266做项目,在烧录Bin文件到模组时,遇到SPI接口的配置问题,在此,对SPI Flash的模式做一个小结: 知识点转载于https://blog.csdn.net/miaokoko/article/details/79051209, 感谢分享! 1. 标准SPI...
  • java SPI 04-spi dubbo 实现源码解析

    万次阅读 2020-06-18 22:52:42
    spi 01-spi 是什么?入门使用 spi 02-spi 的实战解决 slf4j 包冲突问题 spi 03-spi jdk 实现源码解析 spi 04-spi dubbo 实现源码解析 spi 05-dubbo adaptive extension 自适应拓展 spi 06-自己从零手写实现 SPI 框架...
  • 再学 SPI ——(一)SPI片选信号

    万次阅读 2019-04-12 17:16:00
    前面也就 SPI 的通信进行过基础的学习,针对的是标准 4 线的 SPI ,近期因为芯片资源有限,不得不使用一根片选 CS 去控制两个 SPI 从设备,在这个过程中,也重新对 SPI 的通信细节有了进一步的了解与认识,还是觉得...
  • SPI interface SPI接口介绍  SPI是由美国摩托罗拉公司推出的一种同步串行传输规范,常作为单片机外设芯片串行扩展接 口。SPI有4个引脚:SS(从器件选择线)、SDO(串行数据输出线)、SDI(串行数据输入线)和SCK(同步...
  • SPI通信

    万次阅读 多人点赞 2018-03-26 16:49:28
    1 SPI的简介及基本特点1 SPI的简单介绍最近工作中使用了SPI通信方式来做TM4C129和STM32之间的通信,为了更好地解决问题就学习了SPI原理的相关内容,完成了项目之后,也对这种通信方式有了较为深入的了解,现在来对...
  • 【组件】spi抽象/硬件spi

    万次阅读 2018-01-07 23:09:16
    1.写在前面 spi(Serial Peripheral Interface)即串行外设接口。与i2c一样,spi也常用外设设备通信的总线,从事嵌入式开发必不可少的掌握。根据本人以往的经历,对spi进行总结...c)方便移植spi总线设备及spi外设...
  • 上两篇文章完成了spi总线、设备、驱动、master的分析,下面我们分析下spi模块提供的通信方法,通过该通信方法,即可完成cpu与具体spi设备之间的通信(借助spi controller)。 其实,spi_sync、spi_async的实现也...
  • STM32 SPI DMA收发 GPIO初始化 SPI初始化 DMA初始化 问题记录 STM32F103 SPI DMA收发 GPIO初始化 void my_spi_init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; ...
  • STM32系统学习——SPI(读写串行 FLASH)

    万次阅读 多人点赞 2017-12-09 16:55:23
    一、SPI 协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,227
精华内容 18,490
关键字:

spi