● 3线全双工同步传输 ● 带或不带第三根双向数据线的双线单工同步传输 ● 8或16位传输帧格式选择 ● 主或从操作 ● 支持多主模式 ● 8个主模式波特率预分频系数(最大为fPCLK/2) ● 从模式频率 (最大为fPCLK/2) ● 主模式和从模式的快速通信 ● 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变 ● 可编程的时钟极性和相位 ● 可编程的数据顺序,MSB在前或LSB在前 ● 可触发中断的专用发送和接收标志 ● SPI总线忙状态标志 ● 支持可靠通信的硬件CRC ─ 在发送模式下,CRC值可以被作为最后一个字节发送 ─ 在全双工模式中对接收到的最后一个字节自动进行CRC校验 ● 可触发中断的主模式故障、过载以及CRC错误标志 ● 支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求
SPI的引脚
- MISO:主设备输入/从设备输出引脚
该引脚在从模式下发送数据,在主模式下接收数据。 - MOSI:主设备输出/从设备输入引脚
该引脚在主模式下发送数据,在从模式下接收数据。 - SCK:时钟信号,时钟信号由主设备产生,时钟频率由主设备决定
主设备产生(输出),从设备接收(输入) - NSS(CS):从设备使能信号,由主设备控制
从设备的NSS(CS)引脚可以由主设备的一个标准I/O引脚来驱动;也可以由STM32的SPI外设中的NSS引脚来驱动
NSS(CS)引脚管理
STM32的SPI有2种NSS模式:
- 软件NSS模式
可以由主设备的一个标准I/O引脚来驱动;也可以由STM32的SPI外设中的NSS引脚来驱动(通过设置SPI_CR1寄存器的SSM位来使能这种模式,内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动) - 硬件NSS模式:有2种情况
- NSS输出被使能:当工作在主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。(只能有一个主设备情况)
- NSS输出被关闭:允许操作于多主环境。(SPI_CR2寄存器的SSOE位复位)
时钟信号的相位与极性
配置SPI_CR1寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系
CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。
CPHA(时钟相位)位控制数据采样的边沿
主和从设备必须配置成相同的时序模式
数据帧格式
根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB位在先也可以LSB位在先。 根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。
所选择的数据帧格式对发送和接收都有效。
配置为主设备
在为主设备时,在SCK脚产生串行时钟;由主设备决定时钟频率。 置位SPI_CR1寄存器的MSTR位。
配置为从设备
在从模式下,SCK引脚用于接收从主设备来的串行时钟。 SPI_CR1寄存器中BR[2:0]的设置不影响数据传输速率。
建议在主设备发送时钟之前使能SPI从设备,否则可能会发生意外的数据传输
配置步骤
SPI发送/接收模式设置
在接收时,接收到的数据被存放在一个内部的接收缓冲器中; 在发送时,在被发送之前,数据将首先被存放在一个内部的发送缓冲器中。
模式 | BIDIMODE | BIDIOE | RXONLY | 工作引脚 |
---|
全双工模式 | 0 | 0 | 0 | TX:MOSI;RX:MISO | 单工模式(单向的只接收模式) | 0 | 0 | 1 | RX:MISO | 半双工模式(发送模式) | 1 | 1 | 0 | TX:MOSI | 半双工模式(接收模式) | 1 | 0 | 0 | RX:MOSI |
-
全双工模式 当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始; 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,然后按顺序被串行地移位送到MOSI引脚上; 与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。 -
单向的只接收模式 SPE=1时,传输开始; 只有接收器被激活,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。 -
半双工模式(发送模式) 当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始; 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,然后按顺序被串行地移位送到MOSI引脚上;不接收数据。 -
半双工模式(接收模式) SPE=1并且BIDIOE=0时,传输开始; 在MOSI引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。不激活发送器,没有数据被串行地送到MOSI引脚上。
模式 | BIDIMODE | BIDIOE | RXONLY | 工作引脚 |
---|
全双工模式 | 0 | 0 | 0 | TX:MISO;RX:MOSI | 单工模式(单向的只接收模式) | 0 | 0 | 1 | RX:MOSI | 半双工模式(发送模式) | 1 | 1 | 0 | TX:MISO | 半双工模式(接收模式) | 1 | 0 | 0 | RX:MISO |
- 全双工模式
当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随后的数据位依次移动进入移位寄存器; 与此同时,在传输第一个数据位时,发送缓冲器中的数据被并行地传送到8位的移位寄存器,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传输之前在发送寄存器中写入要发送的数据。 - 单向的只接收模式
当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随后数据位依次移动进入移位寄存器; 不启动发送器,没有数据被串行地传送到MISO引脚上。 - 半双工模式(发送模式)
当从设备接收到时钟信号并且发送缓冲器中的第一个数据位被传送到MISO引脚上的时候,数据传输开始; 在第一个数据位被传送到MISO引脚上的同时,发送缓冲器中要发送的数据被平行地传送到8位的移位寄存器中,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传输之前在发送寄存器中写入要发送的数据; 不接收数据。 - 半双工模式(接收模式)
当从设备接收到时钟信号并且第一个数据位出现在它的MISO时,数据传输开始; 从MISO引脚上接收到的数据被串行地传送到8位的移位寄存器中,然后被平行地传送到SPI_DR寄存器(接收缓冲器); 不启动发送器,没有数据被串行地传送到MISO引脚上。
在写入发送缓冲器之前,软件必须确认TXE标志为’1’
状态标志
应用程序通过3个状态标志可以完全监控SPI总线的状态。
- 发送缓冲器空闲标志(TXE)
此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被清除。 - 接收缓冲器非空(RXNE)
此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。 - 忙(Busy)标志
BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态。
关闭SPI
当通讯结束,可以通过关闭SPI模块来终止通讯。清除SPE位即可关闭SPI。 在某些配置下,如果在传输还未完成时,就关闭SPI模块并进入停机模式,则可能导致当前的传输被破坏,而且BSY标志也变得不可信。 为了避免发生这种情况,关闭SPI模块时,建议按照下述步骤操作:
- 在主或从模式下的全双工模式(BIDIMODE=0,RXONLY=0)
- 等待RXNE=1并接收最后一个数据;
- 等待TXE=1;
- 等待BSY=0;
- 关闭SPI(SPE=0),最后进入停机模式(或关闭该模块的时钟)。
- 在主或从模式下的单向只发送模式(BIDIMODE=0,RXONLY=0)或双向的发送模式(半双工模式)(BIDIMODE=1,BIDIOE=1)
在SPI_DR寄存器中写入最后一个数据后:
- 等待TXE=1;
- 等待BSY=0;
- 关闭SPI(SPE=0),最后进入停机模式(或关闭该模块的时钟)。
- 在主模式下的单向只接收模式(MSTR=1,BIDIMODE=0,RXONLY=1)或双向
的接收模式(半双工模式)(MSTR=1,BIDIMODE=1,BIDIOE=0)
这种情况需要特别地处理,以保证SPI不会开始一次新的传输:
- 等待倒数第二个(第n-1个)RXNE=1;
- 在关闭SPI(SPE=0)之前等待一个SPI时钟周期(使用软件延迟);
- 在进入停机模式(或关闭该模块的时钟)之前等待最后一个RXNE=1。
注: 在主模式下的单向只接收模式(MSTR=1,BDM=1,BDOE=0)时,传输过程中BSY标志始终为低。
- 在从模式下的只接收模式(MSTR=0,BIDIMODE=0,RXONLY=1)或双向的接收模
式(半双工模式)(MSTR=0,BIDIMODE=1,BIDIOE=0)
- 可以在任何时候关闭SPI(SPE=0),SPI会在当前的传输结束后被关闭;
- 如果希望进入停机模式,在进入停机模式(或关闭该模块的时钟)之前必须首先等待
BSY=0。
DMA发送与接收
为了达到最大通信速度,需要及时往SPI发送缓冲器填数据,同样接收缓冲器中的数据也必须及时读走以防止溢出。为了方便高速率的数据传输,SPI实现了一种采用简单的请求/应答的DMA机制。
在发送模式下,当DMA已经传输了所有要发送的数据(DMA_ISR寄存器的TCIF标志变为’1’)后,可以通过监视BSY标志以确认SPI通信结束,这样可以避免在关闭SPI或进入停止模式时,破坏最后一个数据的传输。因此软件需要先等待TXE=1,然后等待BSY=0。
CRC功能
以后再更
|