外设驱动库开发笔记49:BY25Qxx存储器驱动

本文详细介绍了如何使用STM32H7微控制器通过QSPI接口驱动BY25QXXX系列NORFLASH存储器。内容包括QSPI接口的增强特性、NORFLASH的基本特点、操作指令以及驱动设计与实现。驱动设计基于对象模型,包含了写使能、读取数据、擦除和编程等关键操作。最后,通过实际读写操作验证了驱动的正确性,并提醒注意状态寄存器的QE位设置以及QSPI接口的GPIO速度配置。

  在有一些应用中,我们可能需要大一些容量的存储单元,而实现的形式多种多样,在这一篇中我们将来讨论怎么使用BY25QXXX系列NOR FLASH存储器的问题。

1、功能概述

  在开始实现BY25QXXX系列NOR FLASH存储器的驱动之前,我们需要先了解一下它的基本情况。

1.1、QSPI接口

  QSPI接口,是QueuedSPI的缩写。和之前谈到的SPI一样都是出自Motorola。QSPI在SPI基础上做了一些增强,且向下兼容SPI。QSPI相对SPI最显著的差异就是增加了发送接收数据队列,Queued的称呼就是这么来的。这样做的好处就是,无需每次数据传输都需要CPU参与,可以降低CPU的资源占用。
  QSPI采用6先模式,同样也可以按Standard SPI、Dual SPI方式工作。我们引用STM32H7上一张QSPI接口与Flash的连接图来展示其连线方式。

  QSPI接口可以在以下三种模式下工作:间接模式,使用 QSPI 寄存器执行全部操作;状态轮询模式,周期性读取外部 Flash 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写完成,会产生中断);内存映射模式,外部 Flash 映射到微控制器地址空间,从而系统将其视作内部存储器。我们在这里考虑BY25QXXX系列NOR FLASH存储器的驱动问题其实就是以间接模式访问的情况。
#1.2、BY25Q基本特点
  BY25QXXX系列NOR FLASH存储器支持标准SPI模式、双线SPI模式、四线SPI模式。其封装级引脚定义如下:

  这些引脚中,片选信号CS和始终信号SCLK在各种模式下是没有区别的。而SO(IO1)引脚在标准SPI模式下用作串行输出,在双线模式和四线模式下则是IO1。SI(IO0)引脚在标准SPI模式下用作串行输入,在双线模式和四线模式下则是IO0。WP(IO2)引脚在标准和双线模式下为写保护,在四线模式下为IO2。HOLD(IO3)引脚在标准和双线模式下为HOLD,在四线模式下为IO3。
#1.3、操作指令
  BY25QXXX系列NOR FLASH存储器在间接访问模式下,主要有四类指令:配置与状态指令、读指令、ID和安全指令、编程和擦除指令。。
配置与状态指令,用于配置操作方式及获取工作状态,主要包括使能及状态操作,具体指令如下所示:

  读指令,用于读取数据。读取数据支持在标准模式下、双线模式下、四线模式下进行操作,具体的指令如下所示:

  ID和安全指令,用于读取或配置一些特定操作,如获取制造商编号以及设备编号等,具体的指令如下所示:

  编程和擦除指令,用以实现对扇区、块以及整片的擦除以及指定的区域的编程等功能,具体的指令如下所示:

  对于BY25QXXX系列NOR FLASH存储器,不管是读写操作还是其它操作在指令阶段都是标准的SPI操作方式。

2、驱动设计与实现

  我们已经大致了解了BY25QXXX系列NOR FLASH存储器操作方式及指令,接下来我们就来考虑实现以间接模式访问它的驱动问题。

2.1、对象定义

  我们依旧是基于对象的模式来考虑这一问题,所以我们首先需要定义BY25QXXX系列NOR FLASH存储器的对象类型。我们先来分析一下,作为对象BY25QXXX系列NOR FLASH存储器都有哪些必要的属性和操作。
  先说一说属性问题,对于BY25QXXX系列NOR FLASH存储器对象来说可以标识器身份和状态的无非是ID和状态寄存器,而ID有包括制造商ID、设备ID、JEDEC ID和uniqueID等,我们可以将其作为对象的属性以标识不同的对象,当这些属性并不是必须的。
  再来看一看操作问题,对于BY25QXXX系列NOR FLASH存储器,它的操作指令有很多,但我们通过分析他们的时序不难发现所有的指令都可归纳为:命令发送、数据发送、数据接收等内容。不同的指令包括不同的组合,所以我们只需要将命令发送、数据发送、数据接收作为对象的操作,通过组合就可以实现全部的操作指令。还有一点需要考虑的是,在写  数据或者擦除是需要等待是否完成,所以我们额外添加一个就绪检测操作。通过上述分析我们可以定义BY25QXXX系列NOR FLASH存储器对象类型如下:

/*定义BY25QXX对象类型 */
typedef struct BY25QObject{
    uint8_t status[3];
    uint8_t mfrID[2];
    uint8_t jedecID[3];
    uint8_t uniqueID[8];
    
    void (*Write)(BY25QCommandConfigType config,uint8_t *wDatas);   //写数据操作指针
    void (*Read)(BY25QCommandConfigType config,uint8_t *rDatas);    //读数据操作指针
    void (*Command)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值