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

GD32F303固件库开发(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash

2023-08-20 14:50 作者:记帖  | 我要投稿

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/BV16W4y147R1/


样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#

csdn课程

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

生成例程

这里准备了自己绘制的开发板进行验证。

在这里插入图片描述

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接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

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即可。

在这里插入图片描述
在这里插入图片描述

擦除扇区

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

在这里插入图片描述
在这里插入图片描述

写数据

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

在这里插入图片描述


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

在这里插入图片描述


keil配置

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。 

在这里插入图片描述

使能GPIO


SPI初始化

SPI挂载在APB2线上。 

在这里插入图片描述

 下面将SPI0分频256倍,那么速率为120M/256=468.75KHz。


使能串口


开启串口DMA接收


串口中断设置


W25Qx.c


W25Qx.h


案例

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

头文件定义


串口接收和flash数组定义


串口重定向


串口中断设置


主程序

读取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。 

在这里插入图片描述















GD32F303固件库开发(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash的评论 (共 条)

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