通用SPI的一般应用讲义

上传人:我** 文档编号:114824656 上传时间:2019-11-12 格式:PPT 页数:39 大小:2.39MB
返回 下载 相关 举报
通用SPI的一般应用讲义_第1页
第1页 / 共39页
通用SPI的一般应用讲义_第2页
第2页 / 共39页
通用SPI的一般应用讲义_第3页
第3页 / 共39页
通用SPI的一般应用讲义_第4页
第4页 / 共39页
通用SPI的一般应用讲义_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《通用SPI的一般应用讲义》由会员分享,可在线阅读,更多相关《通用SPI的一般应用讲义(39页珍藏版)》请在金锄头文库上搜索。

1、SPI接口原理,SPI接口简介,SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,,SPI接口原理,STM32 SPI接口可配置为支持SPI协议或者支持I2S音频协议,默认是SPI模式。可以通过软件切换到I2S方式。,SPI功能描述,SPI引脚,通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。 MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。 SCK:串口时钟,作为主设备的输出,从设备的输入,NSS:从设备选择,NSS:从设备选择。这是一个可选的引脚,用来

2、选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。 从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低; 此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。,SPI接口原理,从选择(NSS)脚管理,有2种NSS模式: 软件NSS模式:可以通过设置SPI_CR1寄存器的SSM位来使能这种模式(见图211)。在这种模式下NSS引脚可以用作它用,而内部NSS信号电平

3、可以通过写SPI_CR1的SSI位来驱动 硬件NSS模式,分两种情况: NSS输出被使能:当STM32F10xxx工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。 当一个SPI设备需要发送广播数据,它必须拉低NSS信号,以通知所有其它的设备它是主设备;如果它不能拉低NSS,这意味着总线上有另外一个主设备在通信,这时将产生一个硬件失败错误(Hard Fault)。 NSS输出被关闭:允许操作于多主环境。,MOSI引脚相互连接,MISO引脚相互连接。

4、这样,数据在主和从之间串行地传输(MSB 位在前)。 通信总是由主设备发起,主设备通过MOSI引脚把数据发送给从设备,从设备通 过MISO引脚回传数据。 这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK引脚提供。图9-1-1所示是一个单主和单从互连的例子。,SPI数据传输模式,SPI接口原理,SPI接口原理,SPI接口原理,利用DMA与SPI的通信,为了达到最大通信速度,需要及时向SPI发送缓冲区填数据,同样接收缓冲器中的数据也必须及时读走,以防止溢出。 为了方便高速率的数据传输,SPI实现了一种采用简单 的请求/应答的DMA机制。SPI_CR2寄存器上

5、的对应使能位被设置时,发出DMA传输请求。发送缓冲器和接收缓冲器也有各自的DMA请求。 注意:当SPI时钟频率较高时,建议采用DMA模式以避免SPI速度性能的降低。,SPI接口原理,SPI接口原理,SPI引脚配置(3个SPI),SPI接口原理,SPI引脚配置(中文参考手册8.11小节),SPI接口原理,常用寄存器,SPI控制寄存器1(SPI_CR1) SPI控制寄存器2(SPI_CR2) SPI状态寄存器(SPI_SR) SPI数据寄存器(SPI_DR) SPI_I2S配置寄存器(SPI_I2S_CFGR) SPI_I2S预分频寄存器(SPI_I2SPR),配置SPI为从模式,配置步骤 1.

6、设置DFF位以定义数据帧格式为8位或16位。 2. 选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系。为保证正确的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。 3. 帧格式(SPI_CR1寄存器中的LSBFIRST位定义的”MSB在前”还是”LSB在前”)必须与主设备相同。 4. 硬件模式下(参考从选择(NSS)脚管理部分),在完整的数据帧(8位或16位)传输过程中,NSS引脚必须为低电平。在NSS软件模式下,设置SPI_CR1寄存器中的SSM位并清除SSI位。 5. 清除MSTR位、设置SPE位(SPI_CR1寄存器),使相应引脚工作于SPI模式下。 在

7、这个配置中,MOSI引脚是数据输入,MISO引脚是数据输出。,SPI为从模式数据发送过程,在写操作中,数据字被并行地写入发送缓冲器。 当从设备收到时钟信号,并且在MOSI引脚上出现第一个数据位时,发送过程开始(此时第一个位被发送出去)。 余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时,SPI_SP寄存器的TXE标志被设置,如果设置了SPI_CR2寄存器的TXEIE位,将会产生中断。,SPI为从模式数据接收过程,对于接收器,当数据接收完成时: 移位寄存器中的数据传送到接收缓冲器,SPI_SR 寄存器中的RXNE标

8、志被设置。 如果设置了SPI_CR2寄存器中的RXNEIE位,则产生中断。 在最后一个采样时钟边沿后,RXNE位被置1,移位寄存器中接收到的数据字节被传送到接收缓冲器。当读SPI_DR寄存器时,SPI设备返回这个接收缓冲器的数值。 读SPI_DR寄存器时,RXNE位被清除。,配置SPI为主模式,配置步骤 1. 通过SPI_CR1寄存器的BR2:0位定义串行时钟波特率。 2. 选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系(见图212)。 3. 设置DFF位来定义8位或16位数据帧格式。 4. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。 5. 如果需要NSS引脚工作在

9、输入模式,硬件模式下,在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作在输出模式,则只需设置SSOE位。 6. 必须设置MSTR位和SPE位(只当NSS脚被连到高电平,这些位才能保持置位)。 在这个配置中,MOSI引脚是数据输出,而MISO引脚是数据输入。,SPI常用库函数,SPI接口原理,程序配置过程:,配置相关引脚的复用功能,使能SPIx时钟 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 初始化SPIx,设置SPIx

10、工作模式 void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); 使能SPIx void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); SPI传输数据 void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) ; 查看SPI传输状态 SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_F

11、LAG_RXNE);,函数SPI_Init,SPI_InitTypeDef structure,SPI_InitTypeDef structure SPI_InitTypeDef定义于文件“stm32f10x_spi.h”: typedef struct u16 SPI_Direction; u16 SPI_Mode; u16 SPI_DataSize; u16 SPI_CPOL; u16 SPI_CPHA; u16 SPI_NSS; u16 SPI_BaudRatePrescaler; u16 SPI_FirstBit; u16 SPI_CRCPolynomial; SPI_InitType

12、Def;,SPI_Direction SPI_Dirention设置了SPI单向或者双向的数据模式,SPI_BaudRatePrescaler SPI_BaudRatePrescaler用来定义波特率预分频的值,这个值用以设置发送和接收的SCK时钟,SPI使用,在本实例中,使用SPI1为主设备来进行数 据的接收和发送,每次发送8个数据位,高位在前,SPI时钟频率为9MHz,数据捕获在第 2个时钟沿,时钟空闲时为低电平,NSS引脚由软件控制。,SPI初始化,根据系统对该功能的需求,初始化该功能外设,初始化SPI设备,初始化SPI同 步串口设备要复杂得多了,在这里着重讲解。 STM32F10X系列

13、所有的SPI同步串口引脚都 与GPIO共用,SPI的初始化分为两大块,即SPI所使用I/O 口的初始化和SPI功能的初始 化。对于SPI同步串口要用到的引脚,根据其数据方向,要设置其为GPIO_Mode_IN_ FLOATING浮空输入或GPIO_Mode_AF_PP复用推挽输出,其他的和GPIO引脚设置一样。 如要用PA7作SPI1同步串口的MOSI引脚,用PA6作SPI1同步串口的MISO引脚,同PA5 作SCK引脚,用PA4作NSS片选引脚,可以进行如下设置:,SPI同步串口所使用I/O 口的初始化,/配置SPI1的MISO (PA.6)为浮空输入 GPIO_InitTypeDef GP

14、IO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPI0_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, ,SPI同步串口参数的初始化,上面讲解了 SPI同步串口所使用I/O 口的初始化,接下来讲解SPI同步串口参数的初 始化方法。 SPI同步串口参数使用库函数SPI_lnit()进行参数配置。例如,定义同步串口 SPI1 为主设备,每次发送8个数据位,高位在前,SPI时钟频率为9MHz,数据捕获在第2个时 钟沿,时钟空闲时为低电平,NSS

15、引脚由软件控制。可以用以下方法来配置:,SPI同步串口参数的初始化,SPI_lnitTypeDef SPI_InitStructure; RCC_APBlPeriphClockCmci(RCC_APBiPeriph_SPI2,ENABLE) SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; /SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; /设置为主 SPI SPI_In

16、itStructure.SPI_DataSize = SPI_DataSize_8b; /SPI 发送接收 8 位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; /时钟悬空低 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; /数据捕获于第 1 个时钟沿 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; /软件控制 NSS 信号 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; /比特率预分频值为4. PCLK,APB1=36MHz SPI_InitStructure. SPI_FirstBit = SPI_FirstBit_MSB; /数据传输从 MSB 位开始 SPI_InitStructure. SPI_CRCPolynomial = 7; /定义了用于 CRC 值计算的多项式 7 SPI Init(SPI2,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号