《嵌入式系统原理与应用》 |(十一)SPI知识梳理

 

系列索引:《嵌入式系统原理与应用》 | 嵌入式系统 重点知识梳理


 

目录

 

SPI的物理层接口及互联

SPI的时钟极性及时钟相位

SPI的数据格式及传输速率

STM32中SPI的特性

SPI的工作模式、配置步骤及数据收发过程

SPI的状态标志和中断(两个重要的:TXE和RXNE)

SPI的常用库函数(初始化设置、收发数据)


SPI的物理层接口及互联

SPI(Serial Peripheral Interface,串行外围设备接口),是由摩托罗拉公司提出的一种高速全双工串行同步通信接口,首先出现在其M68HC系列处理器中。由于其传输速度快、简单方便成本低

物理层接口

 

主设备和从设备通信之间,主设备片选信号拉高,从设备拉低

互联

多个并联,主微控制器花费GPIO引脚作为片选信号

 

 

SPI的时钟极性及时钟相位

SPI时序,与其时钟极性和时钟相位有关。

时钟极性  (CPOL)

时钟线和时钟极性同高同低

时钟相位(CPHA:

0奇数,1偶数

 

SPI的数据格式及传输速率

SPI数据格式

SPI数据传输也是以帧为单位,通常可以选择8位或16位数据帧格式

SPI数据,可以由高位到低位(即MSB在前LSB在后),也可以由低位到高位(即LSB在前MSB在后)依次传输。到底采用什么数据格式,由具体SPI设备指定。

 根据不同的SPI时序(时钟极性和时钟相位)和数据格式,SPI数据传输实例如下:

SPI时序为CPOL=0CPHA=0且数据格式为8位数据帧、低位在前高位在后传输:

SPI时序为CPOL=0CPHA=1且数据格式为8位数据帧、高位在前低位在后传输

SPI时序为CPOL=1CPHA=0且数据格式为8位数据帧、低位在前高位在后传输

SPI时序为CPOL=1CPHA=1且数据格式为8位数据帧、高位在前低位在后传输

(UART低位在前,IIC高位在前)

SPI传输速率

    SPI具有较高的传输速率,它的时钟SCK最高可达18MHz

 

STM32中SPI的特性

通常,它被配置为主模式,并为各个从设备提供通信时钟SCK。

 

 

SPI的工作模式、配置步骤及数据收发过程

工作模式

主模式和从模式,主模式和从模式下均可由软件或硬件进行NSS管理,动态改变主∕从操作模式;

收发过程

在STM32F103微控制器使用SPI发送数据前,程序员完成SPI物理层(如引脚)和协议层(时钟极性、时钟相位、数据格式和传输速率等)的相关配置,并将数据并行地写入发送缓冲区,进行SPI数据的收发。

在接收时,接收到的数据被存放在一个内部的接收缓冲器中;在发送时,在被发送之前,数据将首先被存放在一个内部的发送缓冲器中。对SPI_DR寄存器的读操作,将返回接收缓冲器的内容;写入SPI_DR寄存器的数据将被写入发送缓冲器中。   

从模式下开始传输 

 ─ 当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随后的数据位依次移动进入移位寄存器;

 

─ 与此同时,在传输第一个数据位时,发送缓冲器中的数据被并行地传送到8位的移位寄存器,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传输之前在发送寄存器中写入要发送的数据。   

主模式下开始传输 

─ 当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;

─ 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,然后按顺序被串行地移位送到MOSI引脚上;

─ 与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。   

 

SPI的状态标志和中断(两个重要的:TXE和RXNE)

状态标志:

 

中断:

不同的SPI,有着不同的中断向量。而对于同一个SPI,它的各种中断事件都被连接到同一个中断向量。

 

SPI的常用库函数(初始化设置、收发数据)

 

SPI_I2S_DeInit:将SPIx的寄存器恢复为复位启动时的默认值。

SPI_Init:根据SPI_InitStruct中指定的参数初始化指定SPI的寄存器。

SPI_Cmd:使能或禁止指定SPI。

SPI_I2S_SendData:通过SPI/I2S发送单个数据。

SPI_I2S_ReceiveData:返回指定SPI/I2S最近接收到的数据。

SPI_I2S_GetFlagStatus:查询指定SPI/I2S的标志位状态。

SPI_I2S_ClearFlag:清除指定SPI/I2S的标志位(SPI_FLAG_CRCERR)。

SPI_I2S_ITConfig:使能或禁止指定的SPI/I2S中断。

SPI_I2S_GetITStatus:查询指定的SPI/I2S中断是否发生。

SPI_I2S_ClearITPendingBit:清除指定的SPI/I2S中断挂起位(SPI_IT_CRCERR)。

 

发布了112 篇原创文章 · 获赞 975 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_41523096/article/details/103790144