赞
踩
目录
SPI Flash是使用SPI协议的Flash。
STM32也存在SPI硬件。
串行外围设备接口,是高速全双工(同时接受和发送)的通信总线。广泛应用在ADC,LCD等与MCU之间要求通讯速率较高的场合。

SPI协议规定了通讯的起始和停止信号,数据有效性,时钟同步等环节。

在什么时候触发和采样需要配置CPOL时钟极性和CPHA时钟相位。CPOL:=0,在空闲状态时,SCK为低电平;CPHA:=0,数据线的有效信号在SCK的奇数边沿采样。组合之后,会有四种模式。
在通讯时,通讯的两个设备之间SPI的模式一定要一样,包括CPOL,CPHA,还有数据高位先行还是低位先行。
STM32的SPI外设可用作通讯的主机及从机,完全支持SPI的四种模式。还支持双线全双工,双线单向以及单线模式。
STM32103有3个SPI外设,SPI2和SPI3可以作为I2S。SPI1是APB2上的设备,最高速率达36Mbits/s,SPI2和SPI3是APB1上的设备,最大速率18Mbits/s.
用软件控制NSS产生开始和停止信号,使用普通GPIO,设置为推挽输出输入,通过把GPIO端口拉低或者拉高来控制片选或非片选信号。硬件模式下,SPI片选信号由SPI硬件自动产生。



![]()



通讯开始,SCK时钟开始运行。MOSI把发送缓冲区中的数据一位一位地传输出去;MISO把数据一位一位地存储到数据缓冲区。在发送缓冲区中的数据全部被发送出去后,TXE置1,若要继续发送数据,则往DR中写入数据。在输入(接收缓冲区)满8位时,RXNE置1,从数据寄存器中读出数据。
假如设置了TXE或者RXNE的中断,则它们置一时,会触发SPI中断,进入同一个中断服务函数。进入中断服务程序后,可以通过检查寄存器位来了解是哪一个事件,再分别进入不同的程序执行不同的任务。也可以使用DMA方式来收发DR中的数据。
把以上的结构体成员配置好,再把结构体写到初始化函数中,实现初始化。使能SPI。
注:CS引脚可以不用引脚图上的分配,可以随便选一个引脚(设置为推挽输出),使用软件来控制高低电平。
其余三个引脚:MISO设置为浮空输入;MOSI和SCK设置为复用推挽输出。

WP写保护,CS片选信号,CLK时钟,HOLD:hold input。HOLD和WP直接接高电平,不需要使用。
实质就是一个存储器,相对EEPROM,内存较大,传输速度较快。型号:W25Q64,FLASH最高支持80KHZ,STM32最高36KHZ。FLASH支持SPI的Mode0和Mode3。FLASH的ID号可以用来检验STM32是否和FLASH正常连接。

norflash可以一个字节写入。nandflash必须以块或扇区为单位写入或读取。
Flash在写入之前要先擦除。擦除时会把数据位全部置1。写入数据时只能把原本为1的数据位改成0。擦除时必须按最小单位(扇区=4096字节,具体多少字节要看手册)来擦除。
根据FLASH通讯特点,可知,在配置好SPI_GPIO,初始化GPIO和SPI结构体之后,需要编写SPI-FLASH的写使能,发送-接收(FLASH状态检查),等待内部时序完成,擦除,写入,读取函数。
1.打印ID号是错误的,0xffffff.往FLASH中写入数据之后,把写入的数据读出来,显示的数据全为0,是不正确的数字。
错误代码如下:

修改代码:

程序代码是正确的,但是跑了程序之后仍然显示错误,打印出获得的ID号码是0xffffff,而不是0xef4017。这是为什么呢?
找到解决办法:打印的0Xffffff是FLASH原本的数值。FLASH并没有对SPI的指令作出反应。查看指南者电路原理图,发现SPI1的CS引脚是使用了PC0,不是PA4。还要记得打开GPIOC的时钟。
2.在解决问题1时,不断检查是否是SPI配置有问题,尝试修改代码,但是在调试过程中,使用单步调试,开始直接卡住,无法进行。出现Go to infinite loop when Hard Fault exception occurs (硬件错误)提示,程序进入硬件错误中断。表示可能出现程序访问超出越界,数组溢出,堆栈溢出等错误。问题出在了哪里?
解决办法:发现将两个存储数据的数组放在main函数内程序是无法进行的。必须将数组放在main函数外面。这是为什么,暂时不得而知。


Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。