理论教育 STM32单片机应用与实践:SPI协议详解

STM32单片机应用与实践:SPI协议详解

时间:2023-11-09 理论教育 版权反馈
【摘要】:图5.22SPI框图通常SPI通过4个引脚与外部器件相连。图5.23SPI内部结构简明图从图中可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。图5.24数据时钟时序图8.数据帧格式根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先,也可以LSB在先。

STM32单片机应用与实践:SPI协议详解

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

1.种通信协议

①3线全双工同步传输。

②8或16位传输帧格式选择。

③主或从操作,支持多主模式。

④8个主模式波特率预分频系数(最大为fPCLK/2)。

⑤主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变。

⑥可编程的时钟极性和相位。

⑦可编程的数据顺序,MSB在前或LSB在前。

⑧可触发中断的专用发送和接收标志。

⑨SPI总线忙状态标志。

⑩支持可靠通信的硬件CRC。

⑪可触发中断的主模式故障、过载以及CRC错误标志。

⑫支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求。

2.SPI工作模式

SPI在通信中可作为从机,也可以作为主机,这取决于硬件设计和软件设置。

当器件作为主机时,使用一个IO引脚拉低相应从机的选择引脚(NSS),传输的起始由主机发送数据来启动,时钟(SCK)信号由主机产生。通过MOSI发送数据,同时通过MISO引脚接收从机发出的数据。

当器件作为从机时,传输在从机选择引脚(NSS)被主机拉低后开始,接收主机输出的时钟信号,在读取主机数据的同时通过MISO引脚输出数据。

3.SPI框图

SPI框图如图5.22所示。

图5.22 SPI框图

通常SPI通过4个引脚与外部器件相连。

①MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

②MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。

③SCK:串口时钟,作为主设备的输出,从设备的输入。

④NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通信,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。

4.(NSS)输出管理

每个SPI的NSS可以输入,也可以输出。所谓输入,就是NSS的电平信号给自己;所谓输出,就是将NSS的电平信号发送出去,给从机。配置为输出还是不输出,我们可以通过SPI_CR2寄存器的SSOE位来实现。当SSOE=1时,并且SPI处于主模式控制时(MSTR=1),NSS就输出低电平,也就是拉低。因此,当其他SPI设备的NSS引脚与它相连,必然接收到低电平,则片选成功,都成为从设备了。

5.(NSS)输入管理

(1)NSS软件模式

①SPI主机。需要设置SPI_CR1寄存器的SSM=1和SSI=1,SSM=1是为了使能软件管理。NSS有内部和外部引脚。外部引脚留作他用(可以用来作为GPIO驱动从设备的片选信号)。内部NSS引脚电平则通过SPI_CRL寄存器的SSI位来驱动。SSI=1是为了使NSS内电平为高电平。为什么主设备的内部NSS电平要为1呢?

STM32手册上说,要保持MSTR=1和SPE=1,也就是说要保持主机模式。只有NSS接到高电平信号时,这两位才能保持置“1”。

②SPI从机。NSS引脚在完成字节传输之前必须连接到一个低电平信号。在软件模式下,则需要设置SPI_CR1寄存器的SSM=1(软件管理使能)和SSI=0。

(2)NSS硬件模式

对于主机,我们的NSS可以直接接到高电平;对于从机,NSS接低即可。

6.单主和单从应用

SPI内部结构简明图如图5.23所示。

图5.23 SPI内部结构简明图

从图中可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。

外设的写操作和读操作是同步完成的。如果只进行写操作,主机只须忽略接收到的字节:反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

7.时钟信号的相位和极性(www.daowen.com)

SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。CPOL(时钟极性)位控制在没有数据传输时的时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被清“0”,SCK引脚在空闲状态保持低电平;如果CPOL被置“1”,SCK引脚在空闲状态保持高电平。如果CPHA(时钟相位)位被置“1”,SCK时钟的第二个边沿(CPOL位为“0”时就是下降沿,CPOL位为“1”时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。如果CPHA位被清“0”,SCK时钟的第一边沿(CPOL位为“0”时就是下降沿,CPOL位为“1”时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。

CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。数据时钟时序图如图5.24所示。

图5.24 数据时钟时序图

8.数据帧格式

根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先,也可以LSB在先。根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送或接收都有效。

9.SPI主从模式工作原理

配置SPI主模式的步骤如下所述。

①设置SPI_CR1寄存器的BR[2:0]位,来定义串行时钟波特率。

②选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系。

③设置DFF位来定义8或16位数据帧格式。

④配置SPI_CR1寄存器的LSBFIRST位定义帧格式。

如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS引脚连接到高电平;在软件模式中,须设置SPI_CR1寄存器的SSM=1和SSI=1。如果NSS引脚工作在输出模式,则只须设置SSOE=1位。

⑤设置MSTR=1和SPE=1,只当NSS引脚被连到高电平,这些位才能保持置位。

配置SPI从模式的步骤如下所述。

①设置DFF位以定义数据帧格式为8位或16位。

②定义数据传输和串行时钟之间的相位关系。

③帧格式必须和主设备相同,MSB在前还是LSB在前,取决于SPI_CR1寄存器中的LSBFIRST位。

④硬件模式下,在完整的数据帧(8位或16位)发送过程中,NSS引脚必须为低电平。软件模式下,设置SPI_CR1寄存器中的SSM=1,SSI=0。

⑤MSTR=0位,设置SPE=1,使相应引脚工作于SPI模式下。

10.状态标志

应用程序通过3个状态标志可以完全监控SPI总线的状态。

(1)发送缓冲器空闲标志(TXE)

此标志为“1”时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被清除。

(2)接收缓冲器非空(RXNE)

此标志为“1”时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。

(3)忙(Busy)标志

Busy标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态。

11.SPI中断

SPI中断请求如表5.5所示。

表5.5 SPI中断请求信息表

12.SPI编程

SPI总线的特征和总线协议,具体的编程实现方法有两种。

①SPI总线协议的软件模拟实现方法,根据SPI时序图来编写。

②具有SPI接口的MCU,使用SPI库函数的方法实现。

STM32F10x系列单片机SPI库函数保存在stm32f10x_spi.c文件中,头文件为stm32f10x_spi.h,定义的函数如表5.6所示。

表5.6 SPI库函数

续表

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈