1、23串行外设接口(SPI)小容量产品 是指闪存存储器容量在 16K 至32K 字节之间的 STM32F101xx、STM32F102xx和 STM32F103xx微控制器。中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控 制器。互联型产品是指STM32F105xx和STM32F107xx微控制器。 除非特别说明,本章描述的模块合用于整个STM32F10xxx微控制器系列。23.1SPI简介在大容量产品
2、和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。SPI接 口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。在小容量和中容量产品上,不支持I2S音频协议。串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置 成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。它可用于多种用途,涉及使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠 通信。I2S也是一种3引脚的同步串行接口通讯协议。它支持四种音频标准,涉及飞利浦I2S标准,MSB 和LSB对齐标准,以及PCM标准。它在半双工
3、通讯中,可以工作在主和从2种模式下。当它作为 主设备时,通过接口向外部的从设备提供时钟信号。警告: 由于 SPI3/I2S3 的部 分引 脚 与 JTAG 引脚 共享 (SPI3_NSS/I2S3_WS 与 JTDI , SPI3_SCK/I2S3_CK与JTDO),因此这些引脚不受IO控制器控制,他们(在每次复位后) 被默认保存为JTAG用途。假如用户想把引脚配置给SPI3/I2S3,必须(在调试时)关闭 JTAG并切换至SWD接口,或者(在标准应用时)同时关闭JTAG和SWD接口。详见第 8.3.5节:JTAG/SWD复用功能重映射。23.2SPI和I2S重要特性23.2.1 SPI特性
4、3线全双工同步传输 带或不带第三根双向数据线的双线单工同步传输 8或16位传输帧格式选择 主或从操作 支持多主模式 8个主模式波特率预分频系数(最大为fPCLK/2) 从模式频率 (最大为fPCLK/2) 主模式和从模式的快速通信 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变 可编程的时钟极性和相位 可编程的数据顺序,MSB在前或LSB在前 可触发中断的专用发送和接受标志 SPI总线忙状态标志 支持可靠通信的硬件CRC在发送模式下,CRC值可以被作为最后一个字节发送在全双工模式中对接受到的最后一个字节自动进行CRC校验 可触发中断的主模式故障、过载以及CRC错误标
5、志 支持DMA功能的1字节发送和接受缓冲器:产生发送和接受请求23.2.2I2S功能 单工通信(仅发送或接受) 主或者从操作 8位线性可编程预分频器,获得精确的音频采样频率(8KHz到96kHz) 数据格式可以是16位,24位或者32位 音频信道固定数据包帧为16位(16位数据帧)或32位(16、24或32位数据帧) 可编程的时钟极性(稳定态) 从发送模式下的下溢标志位和主/从接受模式下的溢出标志位 16位数据寄存器用来发送和接受,在通道两端各有一个寄存器 支持的I2S协议:I2S飞利浦标准MSB对齐标准(左对齐)LSB对齐标准(右对齐)PCM标准(16位通道帧上带长或短帧同步或者16位数据帧
6、扩展为32位通道帧) 数据方向总是MSB在先 发送和接受都具有DMA能力 主时钟可以输出到外部音频设备,比率固定为256xFs(Fs为音频采样频率) 在互联型产品中,两个I2S模块(I2S2和I2S3)有一个专用的PLL(PLL3),产生更加精确得时钟23.3SPI功能描述23.3.1概述SPI的方框图见下图。 图209SPI框图通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接受数据。 MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接受数据。 SCK:串口时钟,作为主设备的输出,从设备的输入 NSS
7、:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片 选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS 引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为 输出引脚,并在SPI处在主模式时拉低;此时,所有的SPI设备,假如它们的NSS引脚连接 到主设备的NSS引脚,则会检测到低电平,假如它们被设立为NSS硬件模式,就会自动进 入从设备状态。当配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,假如NSS 被拉低,则这个SPI设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从
8、模式 (参见)下图是一个单主和单从设备互连的例子。图210 单主和单从应用1. 这里NSS引脚设立为输入MOSI脚互相连接,MISO脚互相连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传 数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设 备通过SCK脚提供。NSS输出被关闭:允许操作于多主环境。1112023-08-09 09:13:27-在理解下啊图211 硬件/软件的从选择管理时钟信号的相位和极性SPI_CR寄存器的CPOL和CPHA位,可以组合成四种也许的时序
9、关系。CPOL(时钟极性)位控制 在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。假如CPOL被 清0,SCK引脚在空闲状态保持低电平;假如CPOL被置1,SCK引脚在空闲状态保持高电平。假如CPHA(时钟相位)位被置1,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位 为1时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。假如CPHA位被清0, SCK时钟的第一边沿(CPOL位为0时就是下降沿,CPOL位为1时就是上升沿)进行数据位采 样,数据在第一个时钟边沿被锁存。CPOL时钟极性和CPHA时钟相位的组合选择数据捕获的时钟边沿。 图212显示
10、了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位,输出数据位时可以MS
11、B在先也可以LSB在先。 根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接受都有效。23.3.2配置SPI为从模式在从模式下,SCK引脚用于接受从主设备来的串行时钟。SPI_CR1寄存器中BR2:0的设立不影 响数据传输速率。注:建议在主设备发送时钟之前使能SPI从设备,否则也许会发生意外的数据传输。在通信时钟的第 一个边沿到来之前或正在进行的通信结束之前,从设备的数据寄存器必须就绪。在使能从设备 和主设备之前,通信时钟的极性必须处在稳定的数值。请按照以下环节配置SPI为从模式:配置环节1. 设立DFF位以定义数据帧格式为8位或16位。2.
12、选择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引脚是数据输入,
13、MISO引脚是数据输出。数据发送过程在写操作中,数据字被并行地写入发送缓冲器。当从设备收届时钟信号,并且在MOSI引脚上出现第一个数据位时,发送过程开始(译注:此时 第一个位被发送出去)。余下的位(对于8位数据帧格式,尚有7位;对于16位数据帧格式,尚有 15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时,SPI_SP寄存器的TXE 标志被设立,假如设立了SPI_CR2寄存器的TXEIE位,将会产生中断。数据接受过程对于接受器,当数据接受完毕时: 移位寄存器中的数据传送到接受缓冲器,SPI_SR 寄存器中的RXNE标志被设立。 假如设立了SPI_CR2寄存器中的RXNEIE位,则
14、产生中断。在最后一个采样时钟边沿后,RXNE位被置1,移位寄存器中接受到的数据字节被传送到接受缓 冲器。当读SPI_DR寄存器时,SPI设备返回这个接受缓冲器的数值。读SPI_DR寄存器时,RXNE位被清除。23.3.3配置SPI为主模式在主配置时,在SCK脚产生串行时钟。配置环节1. 通过SPI_CR1寄存器的BR2:0位定义串行时钟波特率。2. 选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系(见图212)。3. 设立DFF位来定义8位或16位数据帧格式。4. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。5. 假如需要NSS引脚工作在输入模式,硬件模式下,在整个数据
15、帧传输期间应把NSS脚连接 到高电平;在软件模式下,需设立SPI_CR1寄存器的SSM位和SSI位。假如NSS引脚工作 在输出模式,则只需设立SSOE位。6. 必须设立MSTR位和SPE位(只当NSS脚被连到高电平,这些位才干保持置位)。 在这个配置中,MOSI引脚是数据输出,而MISO引脚是数据输入。数据发送过程当写入数据至发送缓冲器时,发送过程开始。 在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设立。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,假如设立
16、了SPI_CR1寄存器中的TXEIE 位,将产生中断。数据接受过程对于接受器来说,当数据传输完毕时: 传送移位寄存器里的数据到接受缓冲器,并且RXNE标志被置位。 假如设立了SPI_CR2寄存器中的RXNEIE位,则产生中断。 在最后采样时钟沿,RXNE位被设立,在移位寄存器中接受到的数据字被传送到接受缓冲器。读SPI_DR寄存器时,SPI设备返回接受缓冲器中的数据。读SPI_DR寄存器将清除RXNE位。 一旦传输开始,假如下一个将发送的数据被放进了发送缓冲器,就可以维持一个连续的传输 流。在试图写发送缓冲器之前,需确认TXE标志应当为1。注:在NSS硬件模式下,从设备的NSS输入由NSS引脚
17、控制或另一个由软件驱动的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模块可以或者作为只发送,或者作为只接
18、受。 只发送模式类似于全双工模式(BIDIMODE=0,RXONLY=0):数据在发送引脚(主模式时是 MOSI、从模式时是MISO)上传输,而接受引脚(主模式时是MISO、从模式时是MOSI)可以 作为通用的I/O使用。此时,软件不必理睬接受缓冲器中的数据(假如读出数据寄存器,它不 包含任何接受数据)。 在只接受模式,可以通过设立SPI_CR2寄存器的RXONLY位而关闭SPI的输出功能;此时, 发送引脚(主模式时是MOSI、从模式时是MISO)被释放,可以作为其它功能使用。配置并使能SPI模块为只接受模式的方式是: 在主模式时,一旦使能SPI,通信立即启动,当清除SPE位时立即停止当前的接
19、受。在此模 式下,不必读取BSY标志,在SPI通信期间这个标志始终为1。 在从模式时,只要NSS被拉低(或在NSS软件模式时,SSI位为0)同时SCK有时钟脉冲,SPI就一直在接受。23.3.5数据发送与接受过程接受与发送缓冲器在接受时,接受到的数据被存放在一个内部的接受缓冲器中;在发送时,在被发送之前,数据 将一方面被存放在一个内部的发送缓冲器中。对SPI_DR寄存器的读操作,将返回接受缓冲器的内容;写入SPI_DR寄存器的数据将被写入发 送缓冲器中。主模式下开始传输 全双工模式(BIDIMODE=0并且RXONLY=0)当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;在传送第一位
20、数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中, 然后按顺序被串行地移位送到MOSI引脚上;与此同时,在MISO引脚上接受到的数据,按顺序被串行地移位进入8位的移位寄存器 中,然后被并行地传送到SPI_DR寄存器(接受缓冲器)中。 单向的只接受模式(BIDIMODE=0并且RXONLY=1)SPE=1时,传输开始;只有接受器被激活,在MISO引脚上接受到的数据,按顺序被串行地移位进入8位的移 位寄存器中,然后被并行地传送到SPI_DR寄存器(接受缓冲器)中。 双向模式,发送时(BIDIMODE=1并且BIDIOE=1)当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;在传
21、送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中, 然后按顺序被串行地移位送到MOSI引脚上;不接受数据。 双向模式,接受时(BIDIMODE=1并且BIDIOE=0)SPE=1并且BIDIOE=0时,传输开始;在MOSI引脚上接受到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被 并行地传送到SPI_DR寄存器(接受缓冲器)中。不激活发送器,没有数据被串行地送到MOSI引脚上。从模式下开始传输 全双工模式(BIDIMODE=0并且RXONLY=0)当从设备接受届时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随 后的数据位依次移动进入移位寄存器;与此同
22、时,在传输第一个数据位时,发送缓冲器中的数据被并行地传送到8位的移位 寄存器,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传 输之前在发送寄存器中写入要发送的数据。 单向的只接受模式(BIDIMODE=0并且RXONLY=1)当从设备接受届时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随 后数据位依次移动进入移位寄存器;不启动发送器,没有数据被串行地传送到MISO引脚上。 双向模式,发送时(BIDIMODE=1并且BIDIOE=1)当从设备接受届时钟信号并且发送缓冲器中的第一个数据位被传送到MISO引脚上的 时候,数据传输开始; 在第一个数据位被传送到MI
23、SO引脚上的同时,发送缓冲器中要发送的数据被平行地 传送到8位的移位寄存器中,随后被串行地发送到MISO引脚上。软件必须保证在SPI 主设备开始数据传输之前在发送寄存器中写入要发送的数据;不接受数据。 双向模式,接受时(BIDIMODE=1并且BIDIOE=0)当从设备接受届时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始;从MISO引脚上接受到的数据被串行地传送到8位的移位寄存器中,然后被平行地传送 到SPI_DR寄存器(接受缓冲器);不启动发送器,没有数据被串行地传送到MISO引脚上。解决数据的发送与接受当数据从发送缓冲器传送到移位寄存器时,设立TXE标志(发送缓冲器空),它表达
24、内部的发送缓 冲器可以接受下一个数据;假如在SPI_CR2寄存器中设立了TXEIE位,则此时会产生一个中 断;写入SPI_DR寄存器即可清除TXE位。注:在写入发送缓冲器之前,软件必须确认TXE标志为1,否则新的数据会覆盖已经在发送缓冲器 中的数据。 Txe为0时发送新数据在采样时钟的最后一个边沿,当数据被从移位寄存器传送到接受缓冲器时,设立RXNE标志(接 收缓冲器非空);它表达数据已经就绪,可以从SPI_DR寄存器读出;假如在SPI_CR2寄存器中 设立了RXNEIE位,则此时会产生一个中断;读出SPI_DR寄存器即可清除RXNIE标志位。在一些配置中,传输最后一个数据时,可以使用BSY标
25、志等待数据传输的结束。 主或从模式下(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模块。
26、也可以在响应RXNE或TXE标志的上升沿产生的中断的解决程序中实现这个过程。图213主模式、全双工模式下(BIDIMODE=0并且RXONLY=0)连续传输时,TXE/RXNE/BSY 的变化示意图图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=
27、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主设备只
28、发送模式(BIDIMODE=0并且RXONLY=0)下连续传输时,TXE/BSY变化示 意图图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
29、) 主模式下,立刻产生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)在此模式下,
30、操作过程类似于只接受模式,不同的是:在使能SPI模块之前,需要在SPI_CR2寄 存器中设立BIDIMODE为1并清除BIDIOE位为0。连续和非连续传输当在主模式下发送数据时,假如软件足够快,可以在检测到每次TXE的上升沿(或TXE中断),并 立即在正在进行的传输结束之前写入SPI_DR寄存器,则可以实现连续的通信;此时,在每个数 据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。假如软件不够快,则会导致不连续的通信;这时,在每个数据传输之间会被清除(见下图)。 在主模式的只接受模式下(RXONLY=1),通信总是连续的,并且BSY标志始终为1。在从模式下,通信的连续性由SPI主设
31、备决定。不管如何,即使通信是连续的,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计
32、算是通过设立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通信可以通过以
33、下环节使用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数值,CRC
34、Next位被清除。同样,接受到 的CRC与SPI_RXCRCR值进行比较,假如比较不相配,则设立SPI_SR上的CRCERR标志 位,当设立了SPI_CR2寄存器的ERRIE时,则产生中断。注意: 当SPI模块处在从设备模式时,请注旨在时钟稳定之后再使能CRC计算,否则也许会得到错误的 CRC计算结果。事实上,只要设立了CRCEN位,只要在SCK引脚上有输入时钟,不管SPE位的 状态,都会进行CRC的计算。当SPI时钟频率较高时,用户在发送CRC时必须小心。在CRC传输期间,使用CPU的时间应尽 也许少;为了避免在接受最后的数据和CRC时犯错,在发送CRC过程中应严禁函数调用。必须 在发送/接
35、受最后一个数据之前完毕设立CRCNEXT位的操作。当SPI时钟频率较高时,由于CPU的操作会影响SPI的带宽,建议采用DMA模式以避免SPI减少 的速度。当STM32F10xxx配置为从模式并且使用了NSS硬件模式,NSS引脚应当在数据传输和CRC传输 期间保持为低。当配置SPI为从模式并且使用CRC的功能,即使NSS引脚为高时仍然会执行CRC的计算(译注: 当NSS信号为高时,假如SCK引脚上有时钟脉冲,则CRC计算会继续执行)。例如:当主设备交 替地与多个从设备进行通信时,将会出现这种情况(译注:此时要想办法避免CRC的误操作)。在不选中一个从设备(NSS信号为高)转换到选中一个新的从设备
36、(NSS信号为低)的时候,为了保 持主从设备端下次CRC计算结果的同步,应当清除主从两端的CRC数值。按照下述环节清除CRC数值:1. 关闭SPI模块(SPE=0);2. 清除CRCEN位为0;3. 设立CRCEN位为1;4. 使能SPI模块(SPE=1)。23.3.7状态标志应用程序通过3个状态标志可以完全监控SPI总线的状态。发送缓冲器空闲标志(TXE) 此标志为1时表白发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR 时,TXE标志被清除。接受缓冲器非空(RXNE) 此标志为1时表白在接受缓冲器中包具有效的接受数据。读SPI数据寄存器可以清除此标志。 忙(Busy
37、)标志 BSY标志由硬件设立与清除(写入此位无效果),此标志表白SPI通信层的状态。当它被设立为 1 时, 表白SPI正忙于通信,但有一个例外:在主模式的双向接受模式下 (MSTR=1、BDM=1并且BDOE=0),在接受期间BSY标志保持为低。在软件要关闭SPI模块并进入停机模式(或关闭设备时钟)之前,可以使用BSY标志检测传输是否 结束,这样可以避免破坏最后一次传输,因此需要严格按照下述过程执行。BSY标志还可以用于在多主系统中避免写冲突。除了主模式的双向接受模式(MSTR=1、BDM=1并且BDOE=0),当传输开始时,BSY标志被 置1。以下情况时此标志将被清除为0: 当传输结束(主模
38、式下,假如是连续通信的情况例外); 当关闭SPI模块; 当产生主模式失效(MODF=1)。 假如通信不是连续的,则在每个数据项的传输之间,BSY标志为低。 当通信是连续时: 主模式下:在整个传输过程中,BSY标志保持为高; 从模式下:在每个数据项的传输之间,BSY标志在一个SPI时钟周期中为低。注:不要使用BSY标志解决每一个数据项的发送和接受,最佳使用TXE和RXNE标志。23.3.8 关闭SPI当通讯结束,可以通过关闭SPI模块来终止通讯。清除SPE位即可关闭SPI。在某些配置下,假如再传输尚未完毕时,就关闭SPI模块并进入停机模式,则也许导致当前的传 输被破坏,并且BSY标志也变得不可信
39、。为了避免发生这种情况,关闭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),最后进入停机模式(或关闭该模块的时钟)。 在主或从模式下的
40、单向只接受模式(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)或双向的接受模
41、式(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请求(见)。 发送时,在每次
42、TXE被设立为1时发出DMA请求,DMA控制器则写数据至SPI_DR寄存 器,TXE标志因此而被清除。 接受时,在每次RXNE被设立为1时发出DMA请求,DMA控制器则从SPI_DR寄存器读出数 据,RXNE标志因此而被清除。当只使用SPI发送数据时,只需使能SPI的发送DMA通道。此时,由于没有读取收到的数据,OVR被置为1(译注:软件不必理睬这个标志)。 当只使用SPI接受数据时,只需使能SPI的接受DMA通道。在发送模式下,当DMA已经传输了所有要发送的数据(DMA_ISR寄存器的TCIF标志变为1)后, 可以通过监视BSY标志以确认SPI通信结束,这样可以避免在关闭SPI或进入停止模式
43、时,破坏 最后一个数据的传输。因此软件需要先等待TXE=1,然后等待BSY=0。注:在不连续的通信中,在写数据到SPI_DR的操作与BSY位被置为1之间,有2个APB时钟周期的 延迟,因此,在写完最后一个数据后需要先等待TXE=1再等待BSY=0。图219使用DMA发送图220使用DMA接受带CRC的DMA功能 当使能SPI使用CRC检查并且启用DMA模式时,在通信结束时,CRC字节的发送和接受是自动 完毕的。数据和CRC传输结束时,SPI_SR寄存器的CRCERR标志为1表达在传输期间发生错误。23.3.10 错误标志主模式失效错误(MODF) 主模式失效仅发生在:NSS引脚硬件模式管理下,
44、主设备的NSS脚被拉低;或者在NSS引脚软 件模式管理下,SSI位被置为0时;MODF位被自动置位。主模式失效对SPI设备有以下影响: MODF位被置为1,假如设立了ERRIE位,则产生SPI中断; SPE位被清为0。这将停止一切输出,并且关闭SPI接口; MSTR位被清为0,因此逼迫此设备进入从模式。 下面的环节用于清除MODF位:1. 当MODF位被置为1时,执行一次对SPI_SR寄存器的读或写操作;2. 然后写SPI_CR1寄存器。 在有多个MCU的系统中,为了避免出现多个从设备的冲突,必须先拉高该主设备的NSS脚,再 对MODF位进行清零。在完毕清零之后,SPE和MSTR位可以恢复到它
45、们的原始状态。出于安全的考虑,当MODF位为1时,硬件不允许设立SPE和MSTR位。 通常配置下,从设备的MODF位不能被置为1。然而,在多主配置里,一个设备可以在设立了MODF位的情况下,处在从设备模式;此时,MODF位表达也许出现了多主冲突。中断程序可以执行一个复位或返回到默认状态来从错误状态中恢复。溢犯错误当主设备已经发送了数据字节,而从设备还没有清除前一个数据字节产生的RXNE时,即为溢出 错误。当产生溢犯错误时: OVR位被置为1;当设立了ERRIE位时,则产生中断。此时,接受器缓冲器的数据不是主设备发送的新数据,读SPI_DR寄存器返回的是之前未读的数 据,所有随后传送的数据都被丢
46、弃。依次读出SPI_DR寄存器和SPI_SR寄存器可将OVR清除。CRC 错误 当设立了SPI_CR寄存器上的CRCEN位时,CRC错误标志用来核对接受数据的有效性。假如移 位寄存器中接受到的值(发送方发送的SPI_TXCRCR数值)与接受方SPI_RXCRCR寄存器中的数值不匹配,则SPI_SR寄存器上的CRCERR标志被置位为1。23.3.11 SPI中断表166SPI中断请求中断事件事件标志使能控制位发送缓冲器空标志TXETXEIE接受缓冲器非空标志RXNERXNEIE主模式失效事件MODFERRIE溢犯错误OVRCRC错误标志CRCERR23.4I2S功能描述小容量和中容量的STM32不支持I2S音频协议。本节仅合用于大容量产品和互联型产品。23.4.1I2S功能描述I2S的框图如下图所示:图221I2S框图通过将寄存器SPI_I2SCFGR的I2SMOD位置为1,即可使