欢迎光临散文网 会员登陆 & 注册

STM32CUBEIDE(15)----移植兆易创新SPI Nor Flash之GD25Q64Flash

2023-08-07 03:16 作者:记帖  | 我要投稿

spi概述

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如 EEPROM,FLASH,实时时钟,AD转换器。 W25Q64 是一款SPI接口的Flash芯片,其存储空间为 64Mbit,相当于8M字节。W25Q64可以支持 SPI 的模式 0 和模式 3,也就是 CPOL=0/CPHA=0 和CPOL=1/CPHA=1 这两种模式。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:6_15061293 。

视频教学

https://www.bilibili.com/video/BV1nP411N7fu/


csdn课程

课程更加详细。 https://download.csdn.net/course/detail/35611

生成例程

使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板

 配置时钟树,配置时钟为64M。 

查看原理图,PA2和PA3设置为开发板的串口。 

 配置串口。 

 由于需要输入数据,开启DMA进行接收。 

 中断。 

SPI配置

在开发板中有arduino接口,配置这几个接口为spi。 

 本次实验使用的SPI与Flash通信,配置如下。 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。 (1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出; (2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入; (3)SCLK – Serial Clock,时钟信号,由主设备产生; (4)CS – Chip Select,从设备使能信号,由主设备控制。 

负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。 时钟信号线SCLK只能由主设备控制,从设备不能控制。同样,在一个基于SPI的设备中,至少有一个主设备。这样的传输方式有一个优点,在数据位的传输过程中可以暂停,也就是时钟的周期可以为不等宽,因为时钟线由主设备控制,当没有时钟跳变时,从设备不采集或传送数据。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。芯片集成的SPI串行同步时钟极性和相位可以通过寄存器配置,IO模拟的SPI串行同步时钟需要根据从设备支持的时钟极性和相位来通讯。 最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。 

 其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。 随便配置一个端口为CS片选,并且命名为CS。

NOR Flash

NOR Flash是一种非易失闪存技术,是Intel在1988年创建。是市场上两种主要的非易失闪存技术之一。 以GD25Q64E为例,该 Flash为64M-bit大小,即8192K-Byte。 

 W25Q64将8M的容量分为127个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。W25Q64的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。 即4K16128=8192K=8M 

W25Q64的原理及应用

复位初始化

对于复位,需要发送0x66和0x99 

 代码中的初始化。

ID

对于兆易创新W25Q64,主要有三种查询ID方式。

 可以使用90H查询设备ID,以判断是否是W25Q64设备。 

读取数据

对于兆易创新W25Q64,读取数据使用0x03指令,后面添加需要读取的数据地址。 数据可以一直进行读取,当不需要读取数据时候将片选CS拉高,关闭时钟SCLK即可。 


以读取10个数据为例子,波形如下所示。

  

擦除扇区

最小的擦除单位是扇区,擦除指令为0x20和3字节的地址。 

写数据

对于写数据到flash中,使用0x02指令进行写数据,后面还需要指定24位地址,才能进行写数据。 



对flash的0x1000地址进行写数据,指令如下。


波形如下所示。 

W25Qx.c


W25Qx.h

案例

向0扇区(0块0扇区),17扇区(1块1扇区),34扇区(2块2扇区)分别写入0x200的数据。

头文件定义


串口接收和flash数组定义


串口重定向


串口中断设置

#include "stm32f1xx_it.c"文件中断外部变量引用:


串口2中断函数:


主程序

读取ID和flash数据及擦除。


主程序。


数据处理


演示

W25Q64芯片型号的ID为0XEF17,下方读取为0XC816,所以读取成功。 

开机会打印出0,17,34扇区的前0x200个数据。 

 打印完原始数据之后将数据全部清零,清零完成如下图所示。

 串口定义了ReceiveBuff[0]的数据为写入什么扇区,ReceiveBuff[0]为1写入扇区1,ReceiveBuff[0]为2写入扇区2,ReceiveBuff[0]为3写入扇区3,若为其他数据,则打印输入错误;ReceiveBuff[1]则为写入的位置。 输入:00 05 01 02 03 04 向扇区0的的05号位置开始写入数据01 02 03 04。 

 输入:00 28 11 12 13 14 15 向扇区0的的40(28是十六进制)号位置开始写入数据11 12 13 14 15。 

 输入:17 10 aa bb 向扇区17的的16(10是十六进制)号位置开始写入数据aa bb。 















STM32CUBEIDE(15)----移植兆易创新SPI Nor Flash之GD25Q64Flash的评论 (共 条)

分享到微博请遵守国家法律