STM32_参考手册-中文.pdf

SPI接口

STM32F10xxx参考手册

图214 从模式、全双工模式下(BIDIMODE=0并且RXONLY=0)连续传输时,TXE/RXNE/BSY的变化示意图

只发送过程(BIDIMODE=0并且RXONLY=0)

在此模式下,传输过程可以简要说明如下,使用BSY位等待传输的结束(见图215和图216): 1. 设置SPE位为’1’,使能SPI模块;

2. 在SPI_DR寄存器中写入第一个要发送的数据,这个操作会清除TXE标志; 3. 等待TXE=1,然后写入第二个要发送的数据。重复这个操作,发送后续的数据; 4.写入最后一个数据到SPI_DR寄存器之后,等待TXE=1;然后等待BSY=0,这表示最后一

个数据的传输已经完成。

也可以在响应TXE标志的上升沿产生的中断的处理程序中实现这个过程。

注: 1. 对于不连续的传输,在写入SPI_DR寄存器的操作与设置BSY位之间有2个APB时钟周期的延迟,因此在只发送模式下,写入最后一个数据后,最好先等待TXE=1,然后再等待BSY=0。

2. 只发送模式下,在传输2个数据之后,由于不会读出接收到的数据,SPI_SR寄存器中的OVR位会变为’1’。(译注:软件不必理会这个OVR标志位)

图215 主设备只发送模式(BIDIMODE=0并且RXONLY=0)下连续传输时,,TXE/BSY变化示意图

467/754

参照2009年12月RM0008ReferenceManual英文第10

版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新

版本

SPI接口

STM32F10xxx参考手册

图216 从设备只发送模式(BIDIMODE=0并且RXONLY=0)下连续传输时,TXE/BSY变化示意图

双向发送过程(BIDIMODE=1并且BIDIOE=1)

在此模式下,操作过程类似于只发送模式,不同的是:在使能SPI模块之前,需要在SPI_CR2寄存器中同时设置BIDIMODE和BIDIOE位为’1’。 单向只接收模式(BIDIMODE=0并且

RXONLY=1)

在此模式下,传输过程可以简要说明如下(见): 1. 在SPI_CR2寄存器中,设置RXONLY=1; 2. 设置SPE=1,使能SPI模块:

a)主模式下,立刻产生SCK时钟信号,在关闭SPI(SPE=0)之前,不断地接收串行数据; b)从模式下,当SPI主设备拉低NSS信号并产生SCK时钟时,接收串行数据。 3.等待RXNE=1,然后读出SPI_DR寄存器以获得收到的数据(同时会清除RXNE位)。重复这

个操作接收所有数据。

也可以在响应RXNE标志的上升沿产生的中断的处理程序中实现这个过程。

如果在最后一个数据传输结束后关闭SPI模块,请按照第23.3.8节的建议操作。 图217 只接收模式(BIDIMODE=0并且RXONLY=1)下连续传输时,RXNE变化示意图

注:

单向接收过程(BIDIMODE=1并且BIDIOE=0)

在此模式下,操作过程类似于只接收模式,不同的是:在使能SPI模块之前,需要在SPI_CR2寄存器中设置BIDIMODE为’1’并清除BIDIOE位为’0’。

连续和非连续传输

当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。

468/754

参照2009年12月RM0008ReferenceManual英文第10

版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新

版本

SPI接口

STM32F10xxx参考手册

如果软件不够快,则会导致不连续的通信;这时,在每个数据传输之间会被清除(见下图)。 在主模式的只接收模式下(RXONLY=1),通信总是连续的,而且BSY标志始终为’1’。

在从模式下,通信的连续性由SPI主设备决定。不管怎样,即使通信是连续的,BSY标志会在每个数据项之间至少有一个SPI时钟周期为低(见图216)。

图218 非连续传输发送(BIDIMODE=0并且RXONLY=0)时,TXE/BSY变化示意图

23.3.6 CRC计算

CRC校验用于保证全双工通信的可靠性。数据发送和数据接收分别使用单独的CRC计算器。通过对每一个接收位进行可编程的多项式运算来计算CRC。CRC的计算是在由SPI_CR1寄存器中CPHA和CPOL位定义的采样时钟边沿进行的。

注意: 该SPI接口提供了两种CRC计算方法,取决于所选的发送和/或接收的数据帧格式:8位数据帧采用CR8;16位数据帧采用CRC16。

CRC计算是通过设置SPI_CR1寄存器中的CRCEN位启用的。设置CRCEN位时同时复位CRC寄存器(SPI_RXCRCR和SPI_TXCRCR)。当设置了SPI_CR1的CRCNEXT位,SPI_TXCRCR的内

容将在当前字节发送之后发出。

在传输SPI_TXCRCR的内容时,如果在移位寄存器中收到的数值与SPI_RXCRCR的内容不匹配,则SPI_SR寄存器的CRCERR标志位被置1。

如果在TX缓冲器中还有数据,CRC的数值仅在数据字节传输结束后传送。在传输CRC期间, CRC计算器关闭,寄存器的数值保持不变。

注意: 请参考产品说明书,以确认有此功能(不是所有型号都有此功能)。

SPI通信可以通过以下步骤使用CRC:

● 设置CPOL、CPHA、LSBFirst、BR、SSM、SSI和MSTR的值; ●在SPI_CRCPR寄存器输入多项式;

●通过设置SPI_CR1寄存器CRCEN位使能CRC计算,该操作也会清除寄存器SPI_RXCRCR

和SPI_TXCRC;

●设置SPI_CR1寄存器的SPE位启动SPI功能;

●启动通信并且维持通信,直到只剩最后一个字节或者半字;

●在把最后一个字节或半字写进发送缓冲器时,设置SPI_CR1的CRCNext位,指示硬件在发

送完成最后一个数据之后,发送CRC的数值。在发送CRC数值期间,停止CRC计算; ●当最后一个字节或半字被发送后,SPI发送CRC数值,CRCNext位被清除。同样,接收到的

CRC与SPI_RXCRCR值进行比较,如果比较不相配,则设置SPI_SR上的CRCERR标志 位,当设置了SPI_CR2寄存器的ERRIE时,则产生中断。

469/754

参照2009年12月RM0008ReferenceManual英文第10

版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新

版本

SPI接口

注意:当SPI模块处于从设备模式时,请注意在时钟稳定之后再使能CRC计算,否则可能会得到错误的CRC计算结果。事实上,只要设置了CRCEN位,只要在SCK引脚上有输入时钟,不管SPE位的状态,都会进行CRC的计算。

当SPI时钟频率较高时,用户在发送CRC时必须小心。在CRC传输期间,使用CPU的时间应尽可能少;为了避免在接收最后的数据和CRC时出错,在发送CRC过程中应禁止函数调用。必须在发送/接收最后一个数据之前完成设置CRCNEXT位的操作。

当SPI时钟频率较高时,因为CPU的操作会影响SPI的带宽,建议采用DMA模式以避免SPI降低的速度。

当STM32F10xxx配置为从模式并且使用了NSS硬件模式,NSS引脚应该在数据传输和CRC传输期间保持为低。

当配置SPI为从模式并且使用CRC的功能,即使NSS引脚为高时仍然会执行CRC的计算(译注:当NSS信号为高时,如果SCK引脚上有时钟脉冲,则CRC计算会继续执行)。例如:当主设备交替地与多个从设备进行通信时,将会出现这种情况(译注:此时要想办法避免CRC的误操作)。

在不选中一个从设备(NSS信号为高)转换到选中一个新的从设备(NSS信号为低)的时候,为了保持主从设备端下次CRC计算结果的同步,应该清除主从两端的CRC数值。 按照下述步骤清除CRC数值: 1. 关闭SPI模块(SPE=0); 2. 清除CRCEN位为’0’; 3. 设置CRCEN位为’1’; 4. 使能SPI模块(SPE=1)。

STM32F10xxx参考手册

23.3.7 状态标志

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

发送缓冲器空闲标志(TXE)此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进

入缓冲器中。当写入SPI_DR时,TXE标志被清除。

接收缓冲器非空(RXNE)此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。 忙(Busy)标志BSY标志由硬件设置与清除(写入此位无效果),

此标志表明SPI通信层的状态。

当它被设置为’1’时,表明SPI正忙于通信,但有一个例外:在主模式的双向接收模式下 (MSTR=1、BDM=1并且BDOE=0),在接收期间BSY标志保持为低。

在软件要关闭SPI模块并进入停机模式(或关闭设备时钟)之前,可以使用BSY标志检测传输是否结束,这样可以避免破坏最后一次传输,因此需要严格按照下述过程执行。 BSY标志还可以用于在多主系统中避免写冲突。

除了主模式的双向接收模式(MSTR=1、BDM=1并且BDOE=0),当传输开始时,BSY标志被置’1’。

以下情况时此标志将被清除为’0’:

●当传输结束(主模式下,如果是连续通信的情况例外); ●当关闭SPI模块;

●当产生主模式失效(MODF=1)。 如果通信不是连续的,则在每个数据项的传输之间,BSY标志为低。 当通信是连续时:

●主模式下:在整个传输过程中,BSY标志保持为高;

●从模式下:在每个数据项的传输之间,BSY标志在一个SPI时钟周期中为低。

470/754

参照2009年12月RM0008ReferenceManual英文第10

版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新

版本

SPI接口

注: STM32F10xxx参考手册

不要使用BSY标志处理每一个数据项的发送和接收,最好使用TXE和RXNE标志。

23.3.8 关闭SPI

当通讯结束,可以通过关闭SPI模块来终止通讯。清除SPE位即可关闭SPI。

在某些配置下,如果再传输还未完成时,就关闭SPI模块并进入停机模式,则可能导致当前的传输被破坏,而且BSY标志也变得不可信。

为了避免发生这种情况,关闭SPI模块时,建议按照下述步骤操作:

在主或从模式下的全双工模式(BIDIMODE=0,RXONLY=0)

1. 等待RXNE=1并接收最后一个数据; 2. 等待TXE=1; 3. 等待BSY=0;

4.关闭SPI(SPE=0),最后进入停机模式(或关闭该模块的时钟)。在主或从模式下的单向只

发送模式(BIDIMODE=0,RXONLY=0)或双向的发送模式(BIDIMODE=1,BIDIOE=1)

在SPI_DR寄存器中写入最后一个数据后: 1. 等待TXE=1; 2. 等待BSY=0;

3.关闭SPI(SPE=0),最后进入停机模式(或关闭该模块的时钟)。在主或从模式下的单向只

接收模式(MSTR=1,BIDIMODE=0,RXONLY=1)或双向的接收模式(MSTR=1,BIDIMODE=1,BIDIOE=0)

这种情况需要特别地处理,以保证SPI不会开始一次新的传输: 1. 等待倒数第二个(第n-1个)RXNE=1;

2. 在关闭SPI(SPE=0)之前等待一个SPI时钟周期(使用软件延迟); 3. 在进入停机模式(或关闭该模块的时钟)之前等待最后一个RXNE=1。

注: 在主模式下的单向只发送模式(MSTR=1,BDM=1,BDOE=0)时,传输过程中BSY标志始终为低。

在从模式下的只接收模式(MSTR=0,BIDIMODE=0,RXONLY=1)或双向的接收模式(MSTR=0,BIDIMODE=1,BIDIOE=0)

1. 可以在任何时候关闭SPI(SPE=0),SPI会在当前的传输结束后被关闭;

2. 如果希望进入停机模式,在进入停机模式(或关闭该模块的时钟)之前必须首先等待

BSY=0。

23.3.9 利用DMA的SPI通信

为了达到最大通信速度,需要及时往SPI发送缓冲器填数据,同样接收缓冲器中的数据也必须及时读走以防止溢出。为了方便高速率的数据传输,SPI实现了一种采用简单的请求/应答的DMA机制。

当SPI_CR2寄存器上的对应使能位被设置时,SPI模块可以发出DMA传输请求。发送缓冲器和接收缓冲器亦有各自的DMA请求(见)。

●发送时,在每次TXE被设置为’1’时发出DMA请求,DMA控制器则写数据至SPI_DR寄存 器,

TXE标志因此而被清除。 ●接收时,在每次RXNE被设置为’1’时发出DMA请求,DMA控制器则从SPI_DR寄存器读出

数 据,RXNE标志因此而被清除。

当只使用SPI发送数据时,只需使能SPI的发送DMA通道。此时,因为没有读取收到的数据, OVR被置为’1’(译注:软件不必理会这个标志)。 当只使用SPI接收数据时,只需使能SPI的接收DMA通道。

470/754

参照2009年12月RM0008ReferenceManual英文第10

版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新

版本

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4