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总线相比,只能支持非常短的距离;