SPI协议详解

一、SPI简介

SPI(Serial Peripheral interface)是由摩托罗拉公司定义的一种串行外围设备接口,是一种高速、全双工、同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB的布局。正是出于这种简单易用的特性,现在越来越多的芯片集成了SPI通信协议,如FLASH、AD转换器等。SPI的通信原理比较简单,它以主从方式工作,通常有一个主设备和一个或多个从设备。

二、SPI接口

SPI通信需要四根线,分别为SPI_CS、SPI_CLK、SPI_MOSI和SPI_MISO。其中SPI_CS、SPI_CLK和SPI_MOSI由主机输出给从机,而SPI_MISO由从机输出给主机。

  • SPI_CS用于控制芯片是否被选中,也就是说只有片选信号有效时,对芯片的操作才有效;
  • SPI_CLK是由主机产生的同步时钟,用于同步数据;
  • SPI_MOSI和SPI_MISO是主机发送和接收的数据脚。

在这里插入图片描述

三、SPI工作模式

一般而言,SPI通信有4种不同的模式,不同的从设备在出厂时被厂家配置为其中一种模式,模式是不允许用户修改的。主设备和从设备必须在同一模式下进行通信,否则数据会接收错误。

SPI的通信模式是由CPOL(时钟极性)和CPHA(时钟相位)来决定的,四种通信模式如下:

  • 模式0:CPOL = 0,CPHA = 0;
  • 模式1:CPOL = 0,CPHA = 1;
  • 模式2:CPOL = 1,CPHA = 0;
  • 模式3:CPOL = 1,CPHA = 1。

1、CPOL控制着SPI_CLK的时钟极性,时钟极性变化如下图所示:
在这里插入图片描述
由上图可知,当CPOL = 1时,SPI_CLK在空闲时为高电平,发起通信后的第一个时钟沿为下降沿;CPOL = 0时,SPI时钟信号SPI_CLK空闲时为低电平,发起通信后的第一个时钟沿为上升沿。

2、CPHA用于控制数据与时钟的对齐模式,其不同模式下的时序图如下图所示:
在这里插入图片描述
由上图可知,当CPHA = 1时,时钟的第一个变化沿(上升沿或者下降沿)数据开始改变,那么也就意味着时钟的第2个变化沿(与第一个变化沿相反)锁存数据;当CPHA = 0时,数据在时钟的第一个变化沿之前就已经改变,并且保持稳定,也就意味着在时钟的第一个变化沿锁存数据。

下面是四种模式下的时序图:
在这里插入图片描述

  • CPOL和CPHA都为' 0 '(定义为模式0),则在时钟的前上升沿采样数据。目前,模式0是SPI总线通信最常见的模式。
  • CPOL为' 1 ',CPHA为' 0 '(模式2),则在时钟的前降边缘采样数据
  • CPOL = ' 0 '和CPHA = ' 1 '(Mode 1)在尾降边缘采样
  • CPOL = ' 1 '和CPHA = ' 1 '(Mode 3)在尾升边缘采样

四、SPI总线事务

1、简单SPI写事务

大多数SPI闪存都有一个写状态寄存器命令,用于写入一个或两个字节的数据,如下图所示。要写入状态寄存器,SPI主机首先启用当前器件的从选择线。然后,主设备输出适当的指令,后跟两个数据字节,用于定义预期的状态寄存器内容。由于事务不需要返回任何数据,因此从设备将MISO线保持在高阻抗状态,并且主设备屏蔽任何输入数据。最后,从机选择信号被取消以结束事务。

在这里插入图片描述
2、简单SPI读事务

状态寄存器读取事务与写入事务类似,但现在利用从器件返回的数据,如下图所示。在发送读取状态寄存器指令后,从器件开始以MISO线路传输数据,数率为每八个时钟周期一个字节。主机接收比特流并通过取消SS信号来完成事务。

在这里插入图片描述

五、多从机模式

该部分内容来自https://great.blog.csdn.net/article/details/109460814

前面说到SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种:

1、第一种方法:多NSS

  • 通常,每个从机都需要一条单独的SS线。
  • 如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。

具体连接方式如下图所示:
在这里插入图片描述
2、第二种方法:菊花链

在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链

  • 菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
  • 另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

具体的连接如下图所示:
在这里插入图片描述
所以最终的数据流向图可以表示为:
在这里插入图片描述

六、SPI优缺点

1、SPI通讯的优势

  • 全双工串行通信;
  • 高速数据传输速率;
  • 简单的软件配置;
  • 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
  • 非常简单的硬件结构;从站不需要唯一地址(与I2C不同);从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同);不需要收发器(与CAN不同)。

2、SPI的缺点

  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
  • 通常仅支持一个主设备;
  • 需要更多的引脚(与I2C不同);
  • 没有定义硬件级别的错误检查协议;
  • 与RS-232和CAN总线相比,只能支持非常短的距离;
posted @ 2021-01-26 10:07  耐心的小黑  阅读(1329)  评论(0编辑  收藏  举报