STM参考手册中文pdf.docx
《STM参考手册中文pdf.docx》由会员分享,可在线阅读,更多相关《STM参考手册中文pdf.docx(53页珍藏版)》请在冰豆网上搜索。
![STM参考手册中文pdf.docx](https://file1.bdocx.com/fileroot1/2023-4/23/bc28747e-6580-4522-ab50-6b11a74ca971/bc28747e-6580-4522-ab50-6b11a74ca9711.gif)
STM参考手册中文pdf
23串行外设接口(SPI)
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和
STM32F103xx微控制器。
大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。
互联型产品是指STM32F105xx和STM32F107xx微控制器。
除非特别说明,本章描述的模块适用于整个STM32F10xxx微控制器系列。
23.1SPI简介
在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。
SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。
在小容量和中容量产品上,不支持I2S音频协议。
串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。
此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。
接口还能以多主配置方式工作。
它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。
I2S也是一种3引脚的同步串行接口通讯协议。
它支持四种音频标准,包括飞利浦I2S标准,MSB和LSB对齐标准,以及PCM标准。
它在半双工通讯中,可以工作在主和从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.1SPI特征
●3线全双工同步传输
●带或不带第三根双向数据线的双线单工同步传输
●8或16位传输帧格式选择
●主或从操作
●支持多主模式
●8个主模式波特率预分频系数(最大为fPCLK/2)
●从模式频率(最大为fPCLK/2)
●主模式和从模式的快速通信
●主模式和从模式下均可以由软件或硬件进行NSS管理:
主/从操作模式的动态改变
●可编程的时钟极性和相位
●可编程的数据顺序,MSB在前或LSB在前
●可触发中断的专用发送和接收标志
●SPI总线忙状态标志
●支持可靠通信的硬件CRC
─在发送模式下,CRC值可以被作为最后一个字节发送
─在全双工模式中对接收到的最后一个字节自动进行CRC校验
●可触发中断的主模式故障、过载以及CRC错误标志
●支持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位数据帧扩展为32位通道帧)
●数据方向总是MSB在先
●发送和接收都具有DMA能力
●主时钟可以输出到外部音频设备,比率固定为256xFs(Fs为音频采样频率)
●在互联型产品中,两个I2S模块(I2S2和I2S3)有一个专用的PLL(PLL3),产生更加精准得时钟
23.3SPI功能描述
23.3.1概述
SPI的方框图见下图。
图209SPI框图
通常SPI通过4个引脚与外部器件相连:
●MISO:
主设备输入/从设备输出引脚。
该引脚在从模式下发送数据,在主模式下接收数据。
●MOSI:
主设备输出/从设备输入引脚。
该引脚在主模式下发送数据,在从模式下接收数据。
●SCK:
串口时钟,作为主设备的输出,从设备的输入
●NSS:
从设备选择。
这是一个可选的引脚,用来选择主/从设备。
它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。
一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。
当配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:
即MSTR位被自动清除,此设备进入从模式(参见)
下图是一个单主和单从设备互连的例子。
图210单主和单从应用
1.这里NSS引脚设置为输入
MOSI脚相互连接,MISO脚相互连接。
这样,数据在主和从之间串行地传输(MSB位在前)。
通信总是由主设备发起。
主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。
这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
─NSS输出被关闭:
允许操作于多主环境。
111
2016-08-0909:
13:
27
--------------------------------------------
在理解下啊
图211硬件/软件的从选择管理
时钟信号的相位和极性
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时钟相位的组合选择数据捕捉的时钟边沿。
图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位。
所选择的数据帧格式对发送和
/或接收都有效。
23.3.2配置SPI为从模式
在从模式下,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引脚是数据输入。
数据发送过程
当写入数据至发送缓冲器时,发送过程开始。
在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到
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寄存器的数据将被写入发送缓冲器中。
主模式下开始传输
●全双工模式(BIDIMODE=0并且RXONLY=0)
─当写入数据到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引脚上。
处理数据的发送与接收
当数据从发送缓冲器传送到移位寄存器时,设置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的变化示意图
图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变化示意图
图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位不会被清除。
如果软件不够快,则会导致不连续的通信;这时,在每个数据传输之间会被清除(见下图)。
在主模式的只接收模式下(RXONLY=1),通信总是连续的,而且BSY标志始终为’1’。
在从模式下,通信的连续性由SPI主设备决定。
不管怎样,即使通信是连续的,BSY标志会在每个数据项之间至少有一个SPI时钟周期为低(见图216)。
图218非连续传输发送(BIDIMODE=0并且RXONLY=0)时,TXE/BSY变化示意图
23.3.6CRC计算
CRC校验用于保证全双工通信的可靠性。
数据发送和数据接收分别使用单独的CRC计算器。
通过对每一个接收位进行可编程的多项式运算来计算CRC。
CRC的计算是在由SPI_CR1寄存器中CPHA和CPOL位定义的采样时钟边沿进行的。
注意:
该SPI接口提供了两种CRC计算方法,取决于所选的发送和/或接收的数据帧格式:
8位数据帧采用CR8;16位数据帧采用CRC16。
CRC计算是通过设置SPI_CR1寄存器中