——
SPI
SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,允许嵌入式处理器与各种外围设备以串行方式进行通信、数据交换。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
1 SPI简介
SPI 以主从方式工作,通常有一个主设备和一个或多个从设备。SPI 一般使用 4 根线通信:
• MOSI –主机输出 / 从机输入数据线( Master Output/Slave Input),别称 SDI(serial data input 串行数据输入)。
• MISO –主机输入 / 从机输出数据线(Master Input/Slave Output),别称 SDO(serial data output 串行数据输出)。
• SCLK –或称SCK,串行时钟线(Serial Clock),主设备输出时钟信号至从设备,MOSI、MISO 基于此脉冲完成数据传输。SCK信号线只由主设备控制。
• CS –从设备选择线 (Chip select)。也叫 NSS、SS、CSB、CSN、EN 等,主设备输出片选信号至从设备。任何时刻,一个 SPI 主设备上只有一个 CS 引脚处于有效状态,与该有效 CS 引脚连接的从设备此时可以与主设备通信。当只有一个从设备时,该线可省去。
有的SPI接口芯片带有中断信号线INT;有的没有MOSI只能作为从机。
在同一时刻SPI仅支持一主一从。
主从设备的接线如下图所示。
环形总线结构
SPI设备间的数据传输之所以又被称为数据交换,是因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)“或者"接收者(Receiver)”:在每个时钟周期内,SPI设备都会发送并接收一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了;这样在 8个时钟脉冲以后,两个8位寄存器的内容将互相交换一次。
参考自 https://wenku.baidu.com/view/3e6b2ecc767f5acfa1c7cdfa.html
SPI数据发送与接收机制
基本过程
通信由主设备发起,主设备通过 CS 选择要通信的从设备,然后通过 SCLK 给从设备提供时钟信号,主设备的数据通过 MOSI 输出给从设备,同时主设备通过MISO 接收从设备发送的数据。
在每个时钟周期内,主机的数据在时钟上升沿或下降沿时(具体由工作模式决定)发送,在紧接着的下降沿或上升沿读取从机数据,从机过程相反。如果主机需要读取子机的数据,也必须启动一次发送。
SPI允许数据一位一位的传送乃至暂停传送(普通的串行通讯一次至少连续传送8位数据),这是因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,因此主设备可通过对SCK时钟线的控制可以完成对通讯的控制。
优缺点
SPI 的优点:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。
SPI的缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
一般情况下,当一块电路板上有多个从设备时,往往选用I2C而非SPI,因为SPI增加了额外额硬件开销以及电路板走线。
读写冲突(read-write conflict):这是由一个活动需要读出一个工作流数据而同时另一 个活动需要对同一个工作流数据进行写入操作而产生的。
总线竞争(Bus contention):指总线上的多个设备同时尝试在总线上放置值。
流控制(Flow control):可以控制数据传输的进程,防止数据的丢失。当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。
*2起始和停止信号
如上图,编号1和6即为起始和停止信号的发生区域。CS电平由高变低,则产生起始信号;CS电平由低变高,则产生停止信号。从机检测到自己的CS线电平被置低,则开始与主机进行通讯;反之,检测到CS电平被拉高,则停止通讯。
即起始和停止信号与CS电平高低有关。
*本小节摘自https://zhuanlan.zhihu.com/p/27376153
SPI协议(上)——基础介绍,起始、停止信号
3 SPI总线工作方式
工作方式的确定
SPI通信有4种不同的模式,四种模式的主要区别便是总线空闲时SCLK的状态及数据采样时刻,总体要求为确保发送的数据在一周期开始的时刻上线,接收方在1/2周期的时刻从线上读取。其中使用的最为广泛的是方式一和方式三。
由于通信双方必须工作在同一模式下,因此从设备的SPI模式,决定了主设备的模式。从设备的SPI模式有:
- 固定的,由SPI从设备硬件决定
- 可配置的,由软件自己设定
主设备的通信模式可通过配置CPOL(Clock Polarity,时钟极性)和CPHA(Clock Phase,时钟相位)控制。
CPOL:时钟极性选择,为0时SCK空闲为低电平,为1时SCK空闲为高电平
CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样(上升或下降),在第一个跳变沿前发送数据;为1时在SCK第一个跳变沿(上升或下降)发送数据,在SCK第二个跳变沿采样(上升或下降)。
对应的是上升沿还是还是下降沿,要根据对应的CPOL的值,才能确定。
参考自https://www.cnblogs.com/shangdawei/p/4752476.html
详解SPI中的极性CPOL和相位CPHA
下表为模式配置表:
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
不管以哪种方式,都至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。
4种工作方式
——
一.在工作方式1和3中,MISO引脚上的MSB位在第一个SCK沿跳变前上线(主机要采样必须先发送数据),为了保证正确传输,MOSI引脚的MSB位必须与SCK的第一个边沿同步。
工作方式1:
在SPI传输过程中,首先主机将输出的数据上线并由从机接收,然后在同步时钟信号的上升沿时,主机采样一位来自从机的数据;在同步时钟信号的下降沿时,主机输出下一位数据并由从机采样。
工作方式3:
与前者唯一不同之处只是主机在同步时钟信号的下降沿时采样一位数据,上升沿时输出下一位数据。
——
二.在工作方式2和4中,MISO引脚和MOSI引脚上的数据的MSB位必须与SCK的第一个边沿同步。
工作方式2:
在SPI传输过程中,主机在同步时钟信号的上升沿时输出一位数据并由从机采样;在同步时钟信号的下降沿时,主机采样一位来自从机的数据。
工作方式4:
与前者唯一不同之处只是在同步时钟信号的上升沿时采样一位数据,下降沿时输出下一位数据。
——
4传输时序
下图来自百度百科 SPI , 原图有错误,已修正
图中表示了在四种方式下,传输8位数据的时序图。
一个字节按数据位从高位到低位(MSB到LSB,小端传输)的顺序传输。
LSB(the Least Significant Bit,最低有效位):指一个二进制数字中的第0位
MSB(the Most Significant Bit,最高有效位):指一个n位二进制数字中的n-1位
本文部分内容参考自以下文章:
https://blog.csdn.net/hzlarm/article/details/102751734 SPI协议
https://blog.csdn.net/weiqifa0/article/details/82765892 SPI协议详解
RTTHREAD 编程指南 v2.0.0 SPI设备