STM32SPI接⼝读写SPIflash实验STM32 SPI flash读写测试实验报告
⼀、实验⽬的
1.学习SPI的基本⼯作原理
2.通过实验加深对STM32SPI的理解
3. 利⽤STM32的SPI11和SPI接⼝的flash芯⽚进⾏通信,读写测试,并将测试结果⽤串⼝打印出来
⼆、实验原理
1.SPI基础知识
SPI特征
● 3线全双⼯同步传输
●  带或不带第三根双向数据线的双线单⼯同步传输
● 8或16位传输帧格式选择
●  主或从操作
●  ⽀持多主模式
● 8个主模式波特率预分频系数(最⼤为fPCLK/2)
●  从模式频率(最⼤为fPCLK/2)
●  主模式和从模式的快速通信
●  主模式和从模式下均可以由软件或硬件进⾏NSS管理:主/从操作模式的动态改变
●  可编程的时钟极性和相位
●  可编程的数据顺序,MSB在前或LSB在前
●  可触发中断的专⽤发送和接收标志
● SPI总线忙状态标志
●  ⽀持可靠通信的硬件CRC
─  在发送模式下,CRC值可以被作为最后⼀个字节发送
─  在全双⼯模式中对接收到的最后⼀个字节⾃动进⾏CRC校验
●  可触发中断的主模式故障、过载以及CRC错误标志
●  ⽀持DMA功能的1字节发送和接收缓冲器:产⽣发送和接受请求
从选择(NSS)脚管理
有2种NSS模式:
图211 ●  软件NSS模式:可以通过设置SPI_CR1寄存器的SSM位来使能这种模式(见 )。在这种模式下NSS引脚可以⽤作它⽤,⽽内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动
●  硬件NSS模式,分两种情况:
─NSS输出被使能:当STM32F10xxx⼯作为主SPI,并且NSS输出已经通过SPI_CR2寄存
器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并
配置为硬件NSS的SPI设备,将⾃动变成从SPI设备。
当⼀个SPI设备需要发送⼴播数据,它必须拉低NSS信号,以通知所有其它的设备它是主
设备;如果它不能拉低NSS,这意味着总线上有另外⼀个主设备在通信,这时将产⽣⼀个
硬件失败错误(Hard Fault)。
─NSS输出被关闭:允许操作于多主环境。
时钟信号的相位和极性可以组合成四种不同的模式,下⾯为其中来两种模式
数据帧格式
根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。
根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和或接收都有效。
配置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引脚是数据输⼊。
SPI模块能够以两种配置⼯作于单⼯⽅式:
● 1条时钟线和1条双向数据线;
● 1条时钟线和1条数据线(只接收或只发送);
SPI通信可以通过以下步骤使⽤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数值,CRCNext位被清除。同样,接收到
的CRC与SPI_RXCRCR值进⾏⽐较,如果⽐较不相配,则设置SPI_SR上的CRCERR标志
位,当设置了SPI_CR2寄存器的ERRIE时,则产⽣中断。
个⼈理解:CRC校验,计算发送端是CRC值,接收端计算CRC值,然后发送端将计算的CRC值发送出去,接收端接收到之后与接收端计算的值相⽐较,若不同则返回错误标志
利⽤DMA的SPI通信
为了达到最⼤通信速度,需要及时往SPI发送缓冲器填数据,同样接收缓冲器中的数据也必须及
时读⾛以防⽌溢出。为了⽅便⾼速率的数据传输,SPI实现了⼀种采⽤简单的请求/应答的DMA
机制。
当SPI_CR2寄存器上的对应使能位被设置时,SPI模块可以发出DMA传输请求。发送缓冲器和
接收缓冲器亦有各⾃的DMA请求(见)。
●  发送时,在每次TXE被设置为’1’时发出DMA请求,DMA控制器则写数据⾄SPI_DR寄存
器,TXE标志因此⽽被清除。
●  接收时,在每次RXNE被设置为’1’时发出DMA请求,DMA控制器则从SPI_DR寄存器读出数
write的返回值据,RXNE标志因此⽽被清除。
当只使⽤SPI发送数据时,只需使能SPI的发送DMA通道。此时,因为没有读取收到的数据,
OVR被置为’1’(译注:软件不必理会这个标志)。
当只使⽤SPI接收数据时,只需使能SPI的接收DMA通道
SPI寄存器
SPI控制寄存器1  SPI_CR1
(其中每个位的作⽤参阅数据⼿册486页)
SPI控制寄存器2(SPI_CR2)
SPI 状态寄存器(SPI_SR)
SPI 数据寄存器(SPI_DR)
SPI CRC多项式寄存器
SPI Rx CRC寄存器(SPI_RXCRCR)
在启⽤CRC计算时,RXCRC[15:0]中包含了依据收到的字节计算的CRC数值。当在SPI_CR1
的CRCEN位写⼊’1’时,该寄存器被复位。CRC计算使⽤SPI_CRCPR中的多项式。
当数据帧格式被设置为8位时,仅低8位参与计算,并且按照CRC8的⽅法进⾏;当数据帧格式
为16位时,寄存器中的所有16位都参与计算,并且按照CRC16的标准。
SPI Tx CRC寄存器(SPI_TXCRCR)
在启⽤CRC计算时,TXCRC[15:0]中包含了依据将要发送的字节计算的CRC数值。当在
SPI_CR1中的CRCEN位写⼊’1’时,该寄存器被复位。CRC计算使⽤SPI_CRCPR中的多项
式。
当数据帧格式被设置为8位时,仅低8位参与计算,并且按照CRC8的⽅法进⾏;当数据帧格式
为16位时,寄存器中的所有16个位都参与计算,并且按照CRC16的标准
2.实验电路图
W25X16有8192个可编程页,每页256字节。⽤“页编程指令”每次可以编程256个字节。⽤“扇区(sector)指令”每次可以擦除16页,⽤“块(block)擦除指令”每次可以擦除256页,⽤“整⽚擦除指令”即可擦除整个芯⽚。W25X16有512个可擦除扇区或32个可擦除块。
W25X16⽀持标准的SPI接⼝,传输速率最⼤75MHz。
双输出SPI⽅式
W25X16⽀持SPI双输出⽅式,需要使⽤“快读双输出指令0x3B”,这时,传输速率相当于两倍的标准SPI速率。这个命令⾮常适合于在需要⼀上电就快速下载代码到内存中的情况或者需要缓存代码段到内存中运⾏的情况下。在使⽤“快速双输出指令”后,DIO引脚变为输出引脚。
指令:写使能(Write Enable),页编程(Page Program),扇区擦除(Sector Erase),块区擦除(Block Erase),芯⽚擦除(Chip Erase),写状态寄存器指令(Write Status Register)
三、实验内容
软件设计
配置STM32 的SPI为主模式来读取SPI  flash实现读写功能。
下⾯对SPI1部分进⾏配置。
在主模式时,SCK脚输出串⾏时钟。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。