SPI接口STM32F10xxx参考手册457/75423串行外设接口(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值可以被作为最后一个字节发送SPI接口STM32F10xxx参考手册458/754─在全双工模式中对接收到的最后一个字节自动进行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),产生更加精准得时钟SPI接口STM32F10xxx参考手册459/75423.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位被自动清除,此设备进入从模式(参见)下图是一个单主和单从设备互连的例子。SPI接口STM32F10xxx参考手册460/754参照2009年12月RM0008ReferenceManual英文第10版本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本图210单主和单从应用1.这里NSS引脚设置为输入MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。─NSS输出被关闭:允许操作于多主环境。图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’时就是上升沿)进行从选择(NSS)脚管理有2种NSS模式:●软件NSS模式:可以通过设置SPI_CR1寄存器的SSM位来使能这种模式(见图211)。在这种模式下NSS引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动●硬件NSS模式,分两种情况:─NSS输出被使能:当STM32F10xxx工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。当一个SPI设备需要发送广播数据,它必须拉低NSS信号,以通知所有其它的设备它是主设备;如果它不能拉低NSS,这意味着总线上有另外一个主设备在通信,这时将产生一个硬件失败错误(HardFault)。1112016-08-0909:13:27--------------------------------------------在理解下啊SPI接口STM32F10xxx参考手册461/754参照2009年12月RM0008ReferenceManual英文第10版本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本数据位采样,数据在第一个时钟边沿被锁存。462/754参照2009年12月RM0008ReferenceManual英文第10版本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本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位。所选择的数据帧格式对发送和/或接收都有效。463/754参照2009年12月RM0008ReferenceManual英文第10版本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本SPI接口STM32F10xxx参考手册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寄存器的