第九章通用SPI的一般应用.docx

上传人:李司机 文档编号:5424302 上传时间:2023-07-05 格式:DOCX 页数:16 大小:85.97KB
返回 下载 相关 举报
第九章通用SPI的一般应用.docx_第1页
第1页 / 共16页
第九章通用SPI的一般应用.docx_第2页
第2页 / 共16页
第九章通用SPI的一般应用.docx_第3页
第3页 / 共16页
第九章通用SPI的一般应用.docx_第4页
第4页 / 共16页
第九章通用SPI的一般应用.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《第九章通用SPI的一般应用.docx》由会员分享,可在线阅读,更多相关《第九章通用SPI的一般应用.docx(16页珍藏版)》请在三一办公上搜索。

1、第九章通用SPI的一般应用9.1 SPI简介在大容量产品上,SPl接口可以配置为支持SPl协议或者支持I2S音频协议。SPl接口默认工作在SPl协议下,可以通过软件把功能从SPl模式切换到I2S模式。在小容量和中容量产品上,不支持I2S音频协议。串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。I2S也是一种3管脚的同步串行接口通讯协议。它支持四种音频标准,包括飞利浦I2S标准,MSB和LS

2、B对齐标准,以及PCM标准。它在半双工通讯中,可以工作在主和从2种模式下。当它作为主设备时,通过接口向外部的从设备提供时钟信号。警告:由于SPI3/I2S3的部分管脚与JTAG管脚共享(SPI3_NSS/I2S3_WS与JTDl,SPI3_SCK/I2S3_CK与JTDO),因此这些管脚不受IO控制器丽W,他们(注每次复位后)被默认保留为JTAG用途。如果用户想把管脚配置给SPI3/I2S3,必须(在DEBUG时)关闭JTAG并切换至SWD接口,或者(在标准应用时)同时关闭JTAG和SWD接口。9.1.1 SPI特征3线全双工同步传输;带或不带第三根双向数据线的双线单工同步传输;8或16位传输

3、帧格式选择;主或从操作;支持多主模式;8个主模式波特率预分频系数(最大为fPCLK/2);从模式频率(最大为iPCLK/2);主模式和从模式的快速通信:最大SPl速度达到18MHz;主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变;可编程的时钟极性和相位;可编程的数据顺序,MSB在前或LSB在前;可触发中断的专用发送和接收标志;SPI总线忙状态标志;支持可靠通信的硬件CRC;可触发中断的主模式故障、过载以及CRC错误标志;支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求o9.1.2 SPI引脚描述通常SPI通过4个管脚与外部器件相连:1MISO:主设备输入/

4、从设备输出管脚。该管脚在从模式下发送数据,在主模式下接收数据。2M0SI:主设备输出/从设备输入管脚。该管脚在主模式下发送数据,在从模式下接收数据。3SCK:串口时钟,作为主设备的输出,从设备的输入4NSS:从设备选择。这是一个可选的管脚,用来选择主/从设备。它的功能是用来作为“片选管脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS管脚可以由主设备当作一个标准的IO来驱动。一旦被使能(SSOE位),NSS管脚也可以作为输出管脚,并在SPl设置为主模式时拉低;此时,所有NSS管脚连接到主设备NSS管脚的SPl设备,会检测到低电平,如果它们被设置为NSS硬件模式,就会自

5、动进入从设备状态。从 MSBlt LSBIt8-bit移位寄存器卜一IMISOMOSI如果没有使用NSSNSS可被软件控制图911是一个单主和单从设备互连的例子。主IMSBItLSBitJ1MOSI&bit移位寄存装卜SPl时钟发生器图911单主和单从应用Me)SI脚相互连接,MlSe)脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MoSl脚把数据发送给从设备,从设备通过MlSO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。NSS脚管理有2种NSS模式:1软件NSS模式:可以通过设置

6、SPLCRl寄存器的SSM位来使能这种模式。在这种模式下NSS管脚可以用作它用,而内部NSS信号电平可以通过写SPLCRl的SSI位来驱动2硬件NSS模式,分两种情况:NSS输出被使能:当STM32F10xx工作为主SPI并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS管脚被拉低,所有NSS管脚与它的NSS管脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。此时该设备不能工作在多主环境。NSS输出被关闭:允许操作于多主环境。9.1.3 数据传输模式SPl有四种不同的数据传输格式时序。SPLCR寄存器的CPoL和CPHA位,能够组合成四种可能的时序关系。CPOL

7、:时钟极性位,控制在没有数据传输时时钟的空闲状态电平。此位对主模式和从模式下的设备都有效。如果CPoL被清XT,SCK引脚在空闲状态保持低电平;如果CPOL被置”SCK引脚在空闲状态保持高电平。CPHA:时钟相位,被置,r,SCK时钟的第二个边沿(CPoL位为O时就是下降沿,CPoL位为1时就是上升沿)进行数据位的采样,数据在第一个时钟边沿被锁存。如果CPHA位被清U,SCK时钟的第一边沿(CPoL位为。时就是下降沿,CPoL位为1时就是上升沿)进行数据位采样,数据在第二个时钟边沿被锁存。CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。图9-1-2显示了SPI传输的4种CPHA

8、和CPoL位组合。此图可以解释为主设备和从设备的SCK脚、MISo脚、MoSl脚直接连接的主或从时序图。注意:1.在改变CPoL/CPHA位之前,必须清除SPE位将SPl禁止。2 .主和从必须配置成相同的时序模式。3 .SCK的空闲状态必须和SPLCRl寄存器指定的极性一致(CPoL为1时,空闲时应上拉SCK为高电平;CPe)L为。时,空闲时应下拉SCK为低电平)。4 .数据帧格式(8位或16位)由SPI-CRl寄存器的DFF位选择,并且决定发送/接收的数据长度CPHA=1皿=I-LnLrLrLnLrLrLrcpol=-I!*_II11(frol)MXXMJL8。16位数据X啊A*/*NSS.

9、/II11lII11lII1III1.IIII;。从)IV,TI1,IIII1IIICPHA=0I1I1I1I1I1II1ICPOL=1,_n_njjnjn_rJCiML(from主)8Ar16位数据”;MOS.NMS血XT:XlX7rTl蚓册Uronl从)NSS三!:=:K:II。从):;81II1IIII图9-l2SPl数据传输格式的四种时序数据帧格式:根据SPLCRl寄存器中的LSBHRST位,输出数据位时可以MSB在先也可以LSB在先。根据SPLCRl寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。9.1.4 SPI从模式在从配置里,SCK引

10、脚用于接收到从主设备来的串行时钟。配置步骤:1设置DFF位以定义数据帧格式为8位或16位2选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系(见图9-2)。为保证正确的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。3帧格式(MSB在前还是LSB在前取决于SPLCRl寄存器中的LSBFIRST位)必须和主设备相同。4硬件模式下(参考从选择(NSS)脚管理部分),在完整的数据帧(8位或16位)发送过程中,NSS引脚必须为低电平。软件模式下,设置SPLCRI寄存器中的SSM位并清除SSl位。5清除MSTR位,设置SPE位,使相应引脚工作于SPl模式下。在这个配置里,

11、MoSl引脚是数据输入,MISO引脚是数据输出。数据发送过程数据字被并行地写入发送缓冲器。当从设备收到时钟信号,并且在MOSI引脚上出现第一个数据位时,发送过程开始,第一个位被发送出去。余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时,SPLSP寄存器里的TXE标志被设置。如果设置了APLCR2寄存器上的TXElE位,将会产生中断。数据接收过程对于接收方,当数据接收完成时:移位寄存器中的数据传送到接收缓冲器,SPLSR寄存器中的RXNE标志被设置。如果设置了SPLCR2寄存器中的RXEIE位,则产生中断。在最后一

12、个采样时钟边沿后,RXNE位被置“二移位寄存器中接收到的数据字节被传送到接收缓冲器。当读SPLDR寄存器时,SPl设备返回这个值。读SPLDR寄存器时,RXNE位被清除。9.1.5 SPl主模式在主配置时,串行时钟在SCK脚产生。配置步骤:1通过SPLCRl寄存器的BR2:0位定义串行时钟波特率。2选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系(见图9-2)。3设置DFF位来定义8或16位数据帧格式。4配置SPLCRl寄存器的LSBFIRST位定义帧格式。5如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式中,需设置SPLCRI寄

13、存器的SSM和SSI位。如果NSS引脚工作在输出模式,则只需设置SSoE位。6必须设置MSTR和SPE位(只当NSS脚被连到高电平,这些位才能保持置位)。在这个配置中,MoSl脚是数据输出,而MISo脚是数据输入。数据发送过程当一字节写进发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MoSl脚上;MSB在先还是LSB在先,取决于SPLCRl寄存器中的LSBFlRST位。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置SPLCRl寄存器中的TXElE位,将产生中断。数据接收过程对于接收器来说,当数据传输完成时:移位寄

14、存器里的数据传送到接收缓冲器,并且RXNE标志被置位。如果SPLCR2寄存器中的RXEIE位被设置,则产生中断。在最后采样时钟沿,RXNE位被设置,在移位寄存器中接收到的数据字被传送到接收缓冲器。读SPLDR寄存器时,SPI设备返回接收到的数据字。读SPLDR寄存器将清除RXNE位。一旦传输开始,如果下一个将发送的数据被放进了发送缓冲器,就可以维持一个连续的传输流。在试图写发送缓冲器之前,需确认TXE标志应该是1。9.1.6 状态标志应用程序通过3个状态标志可以完全监控SPI总线的状态。忙(BUSy)标志:此标志表明SPI通信层的状态。当它被设置时,表明SPI正忙于通信,并且/或者在发送缓冲器

15、里有一个有效的数据字正在等待被发送。此标志的目的是说明在SPI总线上是否有正在进行的通信。以下情况时此标志将被置位:1 .数据被写进主设备的SPI-DR寄存器上。2.SCK时钟出现在从设备的时钟引脚上。发送/接收一个字(字节)完成后,BUSY标志立即清除;此标志由硬件设置和清除。监视此标志可以避免写冲突错误。写此标志无效。仅当SPE位被设置时此标志才有意义。注:在主接收模式下(单线双向),不要查询忙标志位(BUSY_FLAG)发送缓冲器空闲标志(TXE)此标志被置位时表明发送缓冲器为空,因此下一个待发送的数据可以写进缓冲器里。当发送缓冲器有一个待发送的数据时,TXE标志被清除。当SPl被禁止时

16、,此标志被清除。接收缓冲器非空(RXNE)此标志为I时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志1.1.7 利用DMA的SPI通信为了达到最大通信速度,需要及时往SPl发送缓冲区填数据,同样接收缓冲器中的数据也必须及时读走以防止溢出。为了方便高速率的数据传输,SPI实现了一种采用简单的请求/应答的DMA机制。当SPLCR2寄存器上的对应使能位被设置时,发出DMA传输请求。发送缓冲器和接收缓冲器亦有各自的DMA请求。注意:当SPI时钟频率较高时,建议采用DMA模式以避免SPI速度性能的降低。1.1.8 SPI中断SPI有表9-1-1所示的这些中断请求。表9-1-ISP

17、l中断请求事件表中断事件事件标志使能控制位发送缓冲器空标志TXETXEIE接收缓冲器非空标志RXNERXNEIE主模式错误事件MODFERRIE溢出错误OVRCRe错误标志CRCERR9.2 SPl库函数介绍在这一节中,将介绍SPl库函数,只是介绍一些常用函数的用法以及参数定义。本书中所有涉及到的库函数都是2.0.3版本的函数库。9.2.1 SPLDeInit表9-2-1.描述了函数SPLDeInit函数名SPLDeInit函数原形voidSPLDeIniKSPLTypeDef*SPIx)功能描述将外设SPIx寄存器重设为缺省值输入参数SPIx:X可以是1或者2,来选择SPl外设输出参数无返回

18、值无先决条件无被调用函数对SPIl,RCC_APB2PeriphClockCmd().对SPI2,RCC_APB1PeriphClockCmdO.例:*SPI2设置为缺省值*/SPI_DeInit(SPI2);9.2.2 函数SPLlst表9-2-2.描述了函数SPIJnit函数名SPIJnit函数原形voidSPlJnit(SPI_TypcDcf*SPIx,SPlJnitTypcDcficSPlJnitStruct)功能描述根据SPLInitStruct中指定的参数初始化外设SPIX寄存器输入参数ISPIx:X可以是1或者2,来选择SPl外设输入参数2SPLInitStruct:指向结构SP

19、UnitTyPeDef的指针,包含了外设SPl的配置信息参阅SeCtiOn:SPLInitTypeDef查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无SPLInitTypeDef结构体定义于文件“stm32fl0x_spi.h:typedefstruct(u!6SPI_Direction;ul6SPIJIodc;u!6SPI_DataSize;ul6SPI_CP0L;ul6SPLCPHA;ul6SPLNSS;ul6SPIBaudRatePrescaler;ul6SPIFirstBit;ul6SPICRCPolynomial;SPIInitTypeDef;SPLDirecti

20、on:设置了SPl单向或者双向的数据模式。见表9-2-3.查阅该参数可取的值。表923.SPLModeffiLSPLDirection描述SPI_Direction_2Lines_FullDuplexSPl设置为双线双向全双工SPI_Direction_2Lines_RxOnlySPI设置为双线单向接收SPI_Direction_lLine_RxSPl设置为单线双向接收SPI_Direction_lLine_TxSPl设置为单线双向发送SPLMode:设置了SPl工作模式。见表9-24查阅该参数可取的值。表924.SPLMOde值SPLMOde描述SPI_Mode_Master设置为主SPlS

21、Pl_Modc_Slavc设置为从SPlSPLDataSize:设置了SPl的数据大小。见表925.查阅该参数可取的值。表925.SPLDataSiZe值SPLDataSize描述SPLDataSize6bSPl发送接收16位帧结构SPLDataSize_8bSPl发送接收8位帧结构SPLCPOL:SPLCPoL选择了串行时钟的稳态。见表926.查阅该参数可取的值。表926.SPI-SPLCPoL值SPI.CPOL描述SPI_CP0L_High时钟悬空高SPI_CPOL_Low时钟悬空低SPLCPHA:设置了位捕获的时钟活动沿。见表9-2-7.查阅该参数可取的值。衰927.SPI_SPI_CP

22、HA值SPI.CPHA描述SPI_CPHA_2Edge数据捕获于第二个时钟沿SPI_CPHA_IEdge数据捕获于第一个时钟沿SPI_NSS:SPLNSS指定了NSS信号由硬件(NSS管脚)还是软件(使用SSl位)管理。见表9-2-8.查阅该参数可取的值。表928.SPLNSS值SPI_NSS描述SPI_NSS_HardNSS由外部管脚管理SPI_NSS_Soft内部NSS信号有SSl位控制SPLBaudRatePrescaler:用来定义波特率预分频的值,这个值用以设置发送和接收的SeK时钟。见表9-2-9.查阅该参数可取的值。表9-2-9.SPLBaUdRatePreSCaIer值SPCB

23、audRatePrescaie描述SPLBaUdRatePreSCaler2波特率预分频值为2SPLBaudRatePrescaleM波特率预分频值为4SPI_BaudRatePrescaler8波特率预分频值为8SPLBaudRatePrescaler16波特率预分频值为16SPLBaUdRatePreSCaIer32波特率预分频值为32SPLBaudRatePrescalerM波特率预分频值为64SPl_BaudRatcPrescalcr128波特率预分频值为128SPLBaUdRatePreSCaler256波特率预分频值为256注意:通讯时钟由主SPl的时钟分频而得,不需要设置从SPl

24、的时钟。SPLFirstBit:指定了数据传输从MSB位还是LSB位开始。见表9-2-10.查阅该参数可取的值。表9210.SPLFirStBit值SPLFirstBit描述SPLFisrtBiCMSB数据传输从MSB位开始SPLFisrtBiCLSB数据传输从LSB位开始SPLCRCPolynomial:SPLCRCPoIynomial定义了用于CRC值计算的多项式。例:/*初始化SPIl*/SPInitTypeDefSPIInitStructure;SPLDirection=SPIDirection_2Lines.FullDuplex:SPIMode=SPIModeMaster;SPIDa

25、tSize=SPIDatSize16b;SPICPOL=SPICPOLLow;SPLCPHA=SPICPHA2Edge;SPI_NSS=SPI_NSS_Soft;SPIBaudRatePrescaler=SPLBaUdRatePreSCaIer28;SPLFirstBit=SPIFirstBitMSB;SPI_CRCPoIynomial=7;SPI.Init(SPIl,&SPIInitStructure);9.2.3函数SPLCm(I表9-2-IL描述了函数SPLCmd函数名SPI_Cmd函数原形voidSPI_Cmd(SPI_TypeDef*SPIx,FunctionalStateNewSt

26、ate)功能描述使能或者失能SPI外设输入参数ISPIx:X可以是1或者2,来选择SPl外设输入参数2NewState:外设SPlX的新状态,这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无例:/*使能SPIl*/SPICmd(SPII,ENABLE);9.2.4 函数SPIJTConfig表9-2-12.描述了函数SPIJTConfig函数名SPLITConfig函数原形voidSPI_ITConfig(SPI_TypeDef*SPIx,u16SPI_IT,FunctionalStateNewState)功能描述使能或者失能指定的SPl中断输入参数1SP

27、Ix:X可以是1或者2,来选择SPl外设输入参数2SPIJT:待使能或者失能的SPl中断源参阅SeeIiOn:SPIJT查阅更多该参数允许取值范围输入参数3NcwStatc:SPIX中断的新状态这个参数可以取:ENABLE或者DISABLE输出参数无返回值无先决条件无被调用函数无SPIJT:输入参数SPIT使能或者失能SPI的中断。可以取表9-2-13的一个或者多个取值的组合作为该参数的值。表9-213.SPIT值SPIJT描述SPIJT.TXE发送缓存空中断屏蔽SPIJT_RXNE接收缓存非空中断屏蔽SPLnLERR错误中断屏蔽例:/*使能SPI2Tx寄存器空中断*/SPIJTConfig(

28、SPI2,SPI_IT_TXE,ENABLE);9.2.5函数SPLDMACmd表9-214.描述了函数SPLDMACmd函数名SPI_DMACmd函数原形voidSPLDMACmd(SPLTyPeDef*SPIx,u16SPLDMAReq,FunctionalStateNcwStatc)功能描述使能或者失能指定SPl的DMA请求输入参数1SPIx:X可以是1或者2,来选择SPl外设输入参数2SPLDMAReq:待使能或者失能的SPlDMA传输请求参阅SCCtion:SPLDMARcq查阅更多该参数允许取值范围输入参数3NewState:SPIxDMA传输的新状态这个参数可以取:ENABLE或

29、者DlSABLE输出参数无返回值无先决条件无被调用函数无SPLDMAReq:使能或者失能SPITX和/或SPIRX的DMA传输请求。见表表92H5.查阅该参数可取的值。表表9-2-15.SPLDMAReq值SPLDMAReq描述SPLDMAReqJTx选择TX缓存DMA传输请求SPl_DMARcq_Rx选择RX缓存DMA传输请求例:/*使能SPI2接收DMA请求*/SPIDMACmd(SPI2,SPIDMAReqRx.ENABLE);9.2.6函数SPLSendData表9-216.描述了函数SPLSendData函数名SPI_SendData函数原形voidSPLSendData(SPLTy

30、PeDef*SPIx,u!6Data)功能描述通过外设SPIX发送一个数据输入参数1SPIx:X可以是1或者2,来选择SPl外设输入参数2Data:待发送的数据输出参数无返回值无先决条件无被调用函数无例:i*通过SPIl发送0xA5*/SPCSendData(SPIl,0xA5);9.2.7函数SPLReCeiVeData表9217.描述了函数SPI_ReceiveData函数名SPLReceiveData函数原形ul6SPI_ReceiveData(SPI_TypeDef*SPIx)功能描述返回通过SPlX最近接收的数据输入参数SPIx:X可以是1或者2,来选择SPl外设输出参数无返回值接收

31、到的字先决条件无被调用函数无例:/*读SPI2最近接收到的数据*/ul6ReceivcdData;RcceivedData=SPLReCeiVeData(SPl2);9.2.8函数SPLGetFlagStatIlS表9218.描述了函数SPLGetFlagStatus函数名SPI-GetFlagStatus函数原形FlagStatusSPLGCtFlagStatUS(SPLTyPCDef*SPlx,ul6SPI_FLAG)功能描述检查指定的SPI标志位设置与否输入参数1SPIx:X可以是1或者2,来选择SPI外设输入参数2SPLFLAG:待检查的SPl标志位参阅SeCIion:SPLFLAG查

32、阅更多该参数允许取值范围输出参数无返回值SPLFLAG的新状态(SET或者RESET)先决条件无被调用函数无SPLFLAG:表表9219给出了所有可以被函数SPLGetFIagStatUS检杳的标志位列表表表9219.SPLFLAG值SPI-FLAG描述SPI_FLAG_BSY忙标志位SP1_FLAG_OVR超出标志位SPI_FLAG_MODF模式错位标志位SPI_FLAG_RXNE接受缓存非空标志位9.2.9函数SPLClearFlag表9220.描述亍函数SPLClearFIag函数名SPI-ClearFlag函数原形voidSPLClearFlag(SPLTyPeDef*SPIx,ul6

33、SPI_FLAG)功能描述清除SPlX的待处理标志位输入参数ISPIx:X可以是1或者2,来选择SPI外设输入参数2SPLFLAG:待清除的SPl标志位参阅SeCIiOn:SPLFLAG查阅更多该参数允许取值范围注意:标志位BSY,TXE和RXNE由硬件重置输出参数无返回值无先决条件无被调用函数无例:/*清SPI2超出标志位*/SPLClearFlag(SP12,SPLFLAGJ)VR);9.2.10函数SPLGetlTStatUS表9221.描述了函数SPLGetITStatus函数名SPI-GetITStatus函数原形ITStatusSPLGetlTStatUS(SPLTypeDe#SP

34、Ix,u8SPLIT)功能描述检杳指定的SPl中断发生与否输入参数ISPIx:X可以是1或者2,来选择SPl外设输入参数2SPIJT:待检查的SPI中断源参阅SCCtiOn:SPLIT查阅更多该参数允许取值范围输出参数无返回值SPIT的新状态先决条件无被调用函数无SPI-IT:表9222给出了所有可以被函数SPLGetlTStatUS检查的中断标志位列表表9222SPLlT值SPLIT描述SPIJT_OVR超出中断标志位SPIT_MODF模式错误标志位SPIJT_CRCERRCRC错误标志位SPlJTTXE发送缓存空中断标志位SPIJT_RXNE接受缓存非空中断标志位例:/*检测SPlI超出中

35、断是否发生/ITStatusStatus;Status=SPI-GetITStatus(SPI1,SPI_IT_OVR);9.2.11函数SPLaearITPendilIgBit表9-2-23.描述了函数SPI_ClearITPendingBit函数名SPI_ClearITPendingBit函数原形voidSPLClCarrrPendingBit(SPLTyPeDef*SPIx,u8SPI_IT)功能描述清除SPlX的中断待处理位输入参数1SPIx:X可以是1或者2,来选择SPI外设输入参数2SPIJT:待检查的SPl中断源参阅SCCtion:SPLlT查阅更多该参数允许取值范围注意:中断标

36、志位BSY,TXE和RXNE由硬件重置输出参数无返回值无先决条件无被调用函数无例:/*清除SPI2CRC错误标志位*/SPIC1earITPendingBit(SPI2,SPIITCRCERR);9.3 SPl使用在ST-EaSyM3开发板上有两个同步串口。在这个实例中,使用SPll为主设备来进行数据的接收和发送,每次发送8个数据位,高位在前,SPI时钟频率9MHz,数据捕获在第二个时钟沿,时钟空闲时为低电平,NSS脚由软件控制。9.3.1 SPl初始化前面介绍了SPl同步串口设备的库函数,通过使用这些库函数,可以初始化SPl同步串口设备。当然只有前面简单的介绍这些枯燥的库函数的定义和作用,您

37、可能还是不会完整的初始化SPl同步串口设备。在这里,将介绍如何初始化SPl同步串口设备。在STM32FlOX系列中,不同的型号所拥有的SPl同步串口数量各部相同,最少的有1个串口,最多的有3个串口,但其初始化得方法是一样的。回忆一下使用外设GPlO的情况,我们总结出,要使用一个外设,需要有6个方面要注意到。要使用SPl同步串口外设,我们一样要在处理这6个方面,现列出来如下:1在工程中要加入SPI同步串口库文件stm32f!0x_spi.c(加入FWLIB文件组);2在头文件stm32fl0x_conf.h中,启用要使用外设的宏定义;使4/#define_SPI”变成“#define_SPI”即

38、去掉前面的晶释符号即可3根据系统对该功能的需求,初始化该功能外设;4打开所使用SPI同步串口的时钟;5在NVIcLCOnfuralion()函数中,配置使能SPl中断的优先级;(如果开启中断的话)6在stm32fIOxJtx文件中加入相应SPI的中断执行语句。(如果开启中断的话)对照上面六项,裹们来一条一条的说明。一加入stm32f!0x_spi.c库文件。直接在项目工程中,从IibraryXsrc文件夹中添加到项目工程的FWLIB文件组即可完成;二启用SPl串口外设的宏定义。在项目工程中,打开头文件stm32flOx_conf.h,在这个头文件中删去相关SPI同步串口前的注释符即可;三初始化

39、SPl设备。初始化SPI同步串口设备要复杂得多了,在这里着重讲解。STM32F10x系列所有的SPl同步串口引脚都与GPIO共用,SPI的初始化分为两大块,SPI所使用I/O口的初始化和SPI功能的初始化。对于SPI同步串口要用到的引脚,根据其数据方向,要设置其为GPlO_Modc_IN_FLOATING浮空输入或GPlO_Modc_AF_PP复用推挽输出,其他的和GPlO引脚设置一痒。比如Ml,要用PA7作SPn同步串口而MOSl脚,用PA6作SPII同步串口的MlSO脚,同PA5作SCK脚,用PA4作NSS片选脚,可以如下设置:配置SPIl的MlSo(PA.6)为浮空输入GPIO_Pin=

40、GPI0_Pin_6;GPIO_Modc=GPIO_ModeJN_FLOATING;GPlOnit(GPIOA,&GPIO_InitStructure);/配置SPIl的MoSl(PA.7)和SPn的SCK(PA.5)复用推挽输出GPIO_Pin=GPIO_Pin_7GPleLPin_5;GPIO_Speed=GPiOjPeed_50MHz;GPIO_Modc=GPlO_Mode_AF_PP;GPlOnit(GPIOA,&GPIOJnitStructure);/配置SPIl的NSS(PA.4)推挽输出GPlO_Pin=GPI0_Pin_4;GPIO_Speed=GPiO筝eed_50MHz;G

41、PIO_Modc=GPIO_Mode_Out_PP;GPlOnit(GPIOA,&GPIO_InitStructure);上面讲解了SPl同步串口所使用I/O口的初始化,接下来讲解SPl同步串口参数的初始化方法。SPl同步串口参数使用库函数SPLInit()进行参数配置。例如,定义SPn同步串口为SPn为主设备,每次发送8个数据位,高位在前,SPI时钟频率9MHz,数据捕获在第二个时钟沿,时钟空闲时为低电平,NSS脚由软件控制。则可以用以下方法来配置,如下/SPIl同步串口参数初始化定义*SPLlniITyPeDefSPLInitStructure;SPLDirection=SPLDireCI

42、iOn_2LineS_FUHDUPlex;/SPI设置为双线双向全双工SPI_Mode=SPI_Mode_Master;设置为主SPISPLDataSize=SPLDataSiZe_8b;/SPI发送接收8位帧结构SPI_CPOL=SPLCPOL_Low;/时钟悬空低SPI_CPHA=SPI_CPHA_2Edge;/数据捕获于第一个时钟沿SPI_NSS=SPLNSS_Soft;软件控制NSS信号SPI_BaudRatePrescaler=SPLBaUdRatePreSCaler_4;波特率预分频值为4SPI_FirstBit=SPLFirStBiLMSB;数据传输从MSB位开始SPI_CRCP

43、olynomial=7,定义了用于CRC值计算的多项式7SPlJniKSPI1,&SPIJnitStructure);使袖SPIlSPI_Cmd(SPIl,ENABLE);四打开SPlI同步串口时钟。只有打开SPIl外设的时钟,系统才能从这个SPIl同步串口发送和接收数据。如可用以下方法打开SPIl同步串口时钟。RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);使能SPIl时钟可以看出SPIl连接的是高速外设时钟。五配置中断优先级。由于没有使用串口中断,就不需要配置中断优先级了。六加入中断执行函数。由于没有串口中断,也就没有中断执行函数了。完

44、成这六项,就完整的设置好了要使用的串口,也就是初始化好了改外设。9.3.2 SPl主机发送接收数据从第一节中的介绍可以知道,SPl发送数据很简单,只要把要发送的数据字节写进发送缓冲器时,发送过程开始。在试图写发送缓冲器之前,需确认TXE标志应该是1。对于接收器来说,当数据传输完成时,也就是数据接收完成。在最后采样时钟沿,RXNE标志位置位。在移位寄存器中接收到的数据字被传送到接收缓冲器。读SPLDR寄存器时将清除RXNE位。所以我们在发送数据是要判断上一次数据是否发送完成,只有发送完成后才能开始新的数据发送。unsignedcharSpi1_SendByte(unsignedcharbyte)(*如果发送寄存器数据没有发送完,循环等待while(SPIJ1S_GetFlagStatus(SPI1.SPIJ1S_FLAG_TXE)=RESET);*往妥送容存器写入要发送的数线SPIJlS.SendData(SP12,byte);*加果接收寄存器没有收到数据,循环while(SPIJ1S_GctFlagStatus(SPI1,SPI_12S_FLAG_RXNE)=RESE

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号