STM32_参考手册-中文.pdf 下载本文

SPI接口

STM32F10xxx参考手册

CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。图212显示了SPI传输的4种CPHA和CPOL位组合。此图可以解释为主设备和从设备的SCK脚、 MISO脚、MOSI脚直接连接的主或从时序图。

注意: 1. 在改变CPOL/CPHA位之前,必须清除SPE位将SPI禁止。

2.主和从必须配置成相同的时序模式。

3. SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为’1’时,空闲时应上拉SCK为高电平;CPOL为’0’时,空闲时应下拉SCK为低电平)。

4. 数据帧格式(8位或16位)由SPI_CR1寄存器的DFF位选择,并且决定发送/接收的数据长度。 图212 数据时钟时序图

数据帧格式根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB

在先。 根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和

/或接收都有效。

462/754

参照2009年12月RM0008ReferenceManual英文第10

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

版本

SPI接口

23.3.2 配置SPI为从模式

STM32F10xxx参考手册

在从模式下,SCK引脚用于接收从主设备来的串行时钟。SPI_CR1寄存器中BR[2:0]的设置不影响数据传输速率。

注: 建议在主设备发送时钟之前使能SPI从设备,否则可能会发生意外的数据传输。在通信时钟的第一个边沿到来之前或正在进行的通信结束之前,从设备的数据寄存器必须就绪。在使能从设备 和主设备之前,通信时钟的极性必须处于稳定的数值。

请按照以下步骤配置SPI为从模式:

配置步骤

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

2.选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系(见图212)。为保证正确

的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。

3.帧格式(SPI_CR1寄存器中的LSBFIRST位定义的”MSB在前”还是”LSB在前”)必须与主设备

相同。

4.硬件模式下(参考从选择(NSS)脚管理部分),在完整的数据帧(8位或16位)传输过程中,

NSS引脚必须为低电平。在NSS软件模式下,设置SPI_CR1寄存器中的SSM位并清除SSI位。

5.清除MSTR位、设置SPE位(SPI_CR1寄存器),使相应引脚工作于SPI模式下。 在这个配置中,MOSI引脚是数据输入,MISO引脚是数据输出。

数据发送过程

在写操作中,数据字被并行地写入发送缓冲器。

当从设备收到时钟信号,并且在MOSI引脚上出现第一个数据位时,发送过程开始(译注:此时第一个位被发送出去)。余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时,SPI_SP寄存器的TXE标志被设置,如果设置了SPI_CR2寄存器的TXEIE位,将会产生中断。

数据接收过程

对于接收器,当数据接收完成时:

● 移位寄存器中的数据传送到接收缓冲器,SPI_SR寄存器中的RXNE标志被设置。 ●如果设置了SPI_CR2寄存器中的RXNEIE位,则产生中断。

在最后一个采样时钟边沿后,RXNE位被置’1’,移位寄存器中接收到的数据字节被传送到接收缓冲器。当读SPI_DR寄存器时,SPI设备返回这个接收缓冲器的数值。 读SPI_DR寄存器时,RXNE位被清除。

23.3.3 配置SPI为主模式

在主配置时,在SCK脚产生串行时钟。

配置步骤

1. 通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率。

2. 选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系(见图212)。 3. 设置DFF位来定义8位或16位数据帧格式。

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

5.如果需要NSS引脚工作在输入模式,硬件模式下,在整个数据帧传输期间应把NSS脚连

接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作 在输出模式,则只需设置SSOE位。

6.必须设置MSTR位和SPE位(只当NSS脚被连到高电平,这些位才能保持置位)。在这个配置中,MOSI引脚是数据输出,而MISO引脚是数据输入。

463/754

参照2009年12月RM0008ReferenceManual英文第10

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

版本

SPI接口

数据发送过程

STM32F10xxx参考手册

当写入数据至发送缓冲器时,发送过程开始。 在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到

MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。数据从

发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。

数据接收过程

对于接收器来说,当数据传输完成时:

●传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位。

●如果设置了SPI_CR2寄存器中的RXNEIE位,则产生中断。 在最后采样时钟沿,RXNE位被设置,在移位寄存器中接收到的数据字被传送到接收缓冲器。读 SPI_DR寄存器时,SPI设备返回接收缓冲器中的数据。

读SPI_DR寄存器将清除RXNE位。 一旦传输开始,如果下一个将发送的数据被放进了发送缓冲器,就可以维持一个连续的传输 流。在试图写发送缓冲器之前,需确认TXE标志应该为’1’。

注: 在NSS硬件模式下,从设备的NSS输入由NSS引脚控制或另一个由软件驱动的GPIO引脚控制。

23.3.4 配置SPI为单工通信

SPI模块能够以两种配置工作于单工方式: ●1条时钟线和1条双向数据线;

●1条时钟线和1条数据线(只接收或只发送);

1条时钟线和1条双向数据线(BIDIMODE=1) 设置SPI_CR1寄存器中的BIDIMODE位而

启用此模式。在这个模式下,SCK引脚作为时钟,主设备使用MOSI引脚而从设备使用MISO引脚作为数据通信。传输的方向由SPI_CR1寄存器里的

BIDIOE控制,当这个位是’1’的时候,数据线是输出,否则是输入。

1条时钟和1条单向数据线(BIDIMODE=0)

在这个模式下,SPI模块可以或者作为只发送,或者作为只接收。

●只发送模式类似于全双工模式(BIDIMODE=0,RXONLY=0):数据在发送引脚(主模式时是

MOSI、从模式时是MISO)上传输,而接收引脚(主模式时是MISO、从模式时是MOSI)可以作为通用的I/O使用。此时,软件不必理会接收缓冲器中的数据(如果读出数据寄存器,它不 包含任何接收数据)。 ●在只接收模式,可以通过设置SPI_CR2寄存器的RXONLY位而关闭SPI的输出功能;此时,

发送引脚(主模式时是MOSI、从模式时是MISO)被释放,可以作为其它功能使用。 配置并使能SPI模块为只接收模式的方式是:

●在主模式时,一旦使能SPI,通信立即启动,当清除SPE位时立即停止当前的接收。在此模

式下,不必读取BSY标志,在SPI通信期间这个标志始终为’1’。

●在从模式时,只要NSS被拉低(或在NSS软件模式时,SSI位为’0’)同时SCK有时钟脉冲,

SPI就一直在接收。

23.3.5 数据发送与接收过程

接收与发送缓冲器

在接收时,接收到的数据被存放在一个内部的接收缓冲器中;在发送时,在被发送之前,数据将首先被存放在一个内部的发送缓冲器中。

对SPI_DR寄存器的读操作,将返回接收缓冲器的内容;写入SPI_DR寄存器的数据将被写入发送缓冲器中。

464/754

参照2009年12月RM0008ReferenceManual英文第10

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

版本

SPI接口

主模式下开始传输

● 全双工模式(BIDIMODE=0并且RXONLY=0)

STM32F10xxx参考手册

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

─ 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,

然后按顺序被串行地移位送到MOSI引脚上;

─ 与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存

器 中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。

●单向的只接收模式(BIDIMODE=0并且RXONLY=1)

SPE=1时,传输开始;

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

●双向模式,发送时(BIDIMODE=1并且BIDIOE=1)

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

─ 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,

然后按顺序被串行地移位送到MOSI引脚上; ─ 不接收数据。

●双向模式,接收时(BIDIMODE=1并且BIDIOE=0)

─ ─ ─

SPE=1并且BIDIOE=0时,传输开始;

在MOSI引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被 并行地传送到SPI_DR寄存器(接收缓冲器)中。 不激活发送器,没有数据被串行地送到MOSI引脚上。 ─ ─

从模式下开始传输

● 全双工模式(BIDIMODE=0并且RXONLY=0)

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

─ 与此同时,在传输第一个数据位时,发送缓冲器中的数据被并行地传送到8位的移

位 寄存器,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传 输之前在发送寄存器中写入要发送的数据。

●单向的只接收模式(BIDIMODE=0并且RXONLY=1)

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

─ 不启动发送器,没有数据被串行地传送到MISO引脚上。 ●双向模式,发送时(BIDIMODE=1并且BIDIOE=1)

当从设备接收到时钟信号并且发送缓冲器中的第一个数据位被传送到MISO引脚上的 时候,数据传输开始;

─在第一个数据位被传送到MISO引脚上的同时,发送缓冲器中要发送的数据被平行地

传送到8位的移位寄存器中,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传输之前在发送寄存器中写入要发送的数据; ─ 不接收数据。

●双向模式,接收时(BIDIMODE=1并且BIDIOE=0)

─ ─ ─

当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始; 从MISO引脚上接收到的数据被串行地传送到8位的移位寄存器中,然后被平行地传送 到SPI_DR寄存器(接收缓冲器);

不启动发送器,没有数据被串行地传送到MISO引脚上。 ─ ─ ─

465/754

参照2009年12月RM0008ReferenceManual英文第10

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

版本

SPI接口

处理数据的发送与接收

STM32F10xxx参考手册

当数据从发送缓冲器传送到移位寄存器时,设置TXE标志(发送缓冲器空),它表示内部的发送缓冲器可以接收下一个数据;如果在SPI_CR2寄存器中设置了TXEIE位,则此时会产生一个中断;写入SPI_DR寄存器即可清除TXE位。

注: 在写入发送缓冲器之前,软件必须确认TXE标志为’1’,否则新的数据会覆盖已经在发送缓冲器中的数据。 Txe为0时发送新数据

在采样时钟的最后一个边沿,当数据被从移位寄存器传送到接收缓冲器时,设置RXNE标志(接收缓冲器非空);它表示数据已经就绪,可以从SPI_DR寄存器读出;如果在SPI_CR2寄存器中设置了RXNEIE位,则此时会产生一个中断;读出SPI_DR寄存器即可清除RXNIE标志位。 在一些配置中,传输最后一个数据时,可以使用BSY标志等待数据传输的结束。 主或从模式下(BIDIMODE=0并且RXONLY=0)全双工发送和接收过程模式软件必须遵循下述过程,发

送和接收数据(见图213和图214):

1. 设置SPE位为’1’,使能SPI模块;

2. 在SPI_DR寄存器中写入第一个要发送的数据,这个操作会清除TXE标志;

3.等待TXE=1,然后写入第二个要发送的数据。等待RXNE=1,然后读出SPI_DR寄存器

并 获得第一个接收到的数据,读SPI_DR的同时清除了RXNE位。重复这些操作,发送后续 的数据同时接收n-1个数据; 4. 等待RXNE=1,然后接收最后一个数据;

5.等待TXE=1,在BSY=0之后关闭SPI模块。也可以在响应RXNE或TXE标志的上升沿产生的中断的处理程序中实现这个过程。

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

466/754

参照2009年12月RM0008ReferenceManual英文第10

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

版本