SPI总线详细说明

1. SPI简介

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

2. SPI特点

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

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

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

Controller, 泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式。通常情况下, 我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信;

SCK, Serial Clock, 主要的作用是 Master 设备往 Slave 设备传输时钟信 , 控制数据交换的时机以及速率;

SS/CS, Slave Select/Chip Select, 用于 Master 设备片选 Slave 设备, 使被选中的 Slave 设备能够被 Master 设备所访问;

SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被称为 Tx-Channel, 作为数据的出口, 主要用于 SPI 设备发送数据;

SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被称为 Rx-Channel, 作为数据的入口, 主要用于SPI 设备接收数据;

SPI 设备在进行通信的过程中, Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop), 就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF, Controller 确定 SPI 总线的通信模式, SCK 传输时钟信 。

3.2 Timing

3.2.3 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.2.4 CPHA相位

首先说明一点,capture strobe = latch = read = sample,都是表示数据采样,数据有效的时刻。
相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。
对于:
CPHA=0,表示第一个边沿:对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;
CPHA=1,表示第二个边沿:对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;还是上图大家更容易看懂

3.4 SSPBUF

4. SPI举例

上面说了那么多,在这里我来举一个例子帮助大家理解。
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所接收数据存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序
举例:假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据.

SPI总线详细说明

5. STM32驱动

STM32的spi较为简单,因为STM32的内部集成有SPI。

5.1 SPI的初始化

[cpp] view plaincopy

  1. void SPIInit(void)
  2. {
  3. SPI_InitTypeDef SPI_InitStructure;
  4. //初始化SPI与GPIO口的连接
  5. FLASH_GPIO_Init();
  6. /*!
  7. CE_High();
  8. /*!
  9. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  10. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  11. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  12. SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  13. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  14. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  15. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  16. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  17. SPI_InitStructure.SPI_CRCPolynomial = 7;
  18. SPI_Init(SPI1, &SPI_InitStructure);
  19. /*!
  20. SPI_Cmd(SPI1, ENABLE);
  21. }

5.2 SPI写1个字节

[cpp] view plaincopy

  1. uint8 Send_Byte(uint8 data)
  2. {
  3. }

5.3 SPI读一个字节

[cpp] view plaincopy

  1. uint8 Get_Byte(void)
  2. {
  3. //发送不为空
  4. }

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月17日
下一篇 2020年3月17日

相关推荐