0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何开发功能齐全的QSPI驱动

嵌入式程序员 来源:嵌入式程序猿 作者:嵌入式程序猿 2020-09-25 14:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 摘要

本篇笔记主要介绍,如何开发稳定可靠,功能齐全的QSPI驱动。

2. 准备工作

1, IAR 8.32.1

2, STM32Cube_FW_H7_V1.6.0

3. QSPI简介

4. QSPI驱动

在项目的开发中,我们经常会使用外挂Flash在做一些应用,而STM32H743带QSPI接口,可以用来外挂QSPI Flash,在之前的推送中我们以winbond华邦的W25Q256为例给大家说明了下QSPI的操作,借助ST的HAL库例程可以快速验证,不同型号的QSPI Flash会有一些参数和命令区别,大家应用时候要注意,例如美光和华邦的有的命令码就不同。ST的驱动里STM32H743的评估板是以美光的MT25T_QLKT_L_01G为例。如果你使用不同的型号,请注意区分,既然是评估板,那么就只是给大家参考,在正式的项目中,还需要考虑一些其他的问题。

5. 驱动架构

驱动的架构可以参考STM32Cube_FW_H7中对QSPI Flash驱动架构,也可以自己做架构,尽量简单明了,易用且稳定。对具体型号Flash的驱动可以放在一个文件下建立一个.c和.h. 如我们以华邦的W25Q系列为例,

还可以建立一个文本文档,用来记录驱动的一些变更,发布笔记等。

BSP层可以在BSP文件夹下建立QSPI的驱动,名字可以参考ST库,也可以按照自己的命名规则来定,或者企业的软件文件命名规则来定。

建立好这些文件后,接下来可以动手开发了。开发的时候可以先画一些图,除过正常的初始化,去初始化,外,考虑都包含那些功能,那些模式,那些命令,那些安全管理。那些中断,是否可以用DMA操作等。还要考虑数据结构类型,配置信息,错误码等。这些一定要结合数据手册来考虑和分析。

5.1 初始化和去初始化

这部分相对比较简单,可以参考例程,市面上的开发板,编码风格和良莠不齐,大家尽量参考官方的资料和文档,要考虑检查返回值,初始化有没有成功。跟硬件相关的管脚,时钟等大家根据自己的应用去定,H743我一般跑400M. 官方的大部分例程也都是跑在400M.

5.2 驱动模式

从手册可以知道分为间接模式,状态轮询模式,内存映射模式,那么我们的驱动就要能够分别支持这三种模式。在stm32h743i_eval_qspi.h里面定义这些模式和其他数据类型。这些可以参考官方的定义

在w25q256.h中定义跟flash相关的数据类型,结构体,宏定义等。如QSPI的操作模式,这里要明白1-1-1,1-1-2,1-1-4,1-4-4等的含义,因为QSPI包含这四种,指令单线,地址单线/4线,数据单线/两线/四线,这些在flash的数据手册指令表里都会标出,支持那种操作,而我们在驱动中要综合考虑这四种。

命令表的定义,这个要注意不同型号的FLASH,会稍有区别,即使同一家的不同型号的可能也有区别,如华邦256M和1G的指令就有一些个别的不同。恰好这两款我都用过,在这里给大家提一下。由于指令比较多,这里就不一一列举了,只截取其中一部分,具体指令表的定义可以参考flash手册,

但是建议大家在做驱动的时候对所有指令做支持,这样在用的时候就很方便,而不是用的时候发现少,在去填补。可以分别做成子函数,例如读取ID,可以做一些校验

很多指令的内容官网的驱动里都没有,需要我们自己去做。

5.3 状态寄存器读写

W25Q系列一般有三个状态寄存器,用来表示一些状态,如状态寄存器1就可以通过读取来判断flash的状态,有没有忙,写使能有没有打开,以及保护位保护了那些地址,这些都要自己去实现,市面上包括官方的例程驱动里都没有,假如你不判断的话,如果要写的地址被保护,是写不进去的,还有可能出现异常,这些都可以通过读取状态寄存器1和2来判断和处理。以及结合WP脚。

这些功能在正式的产品中我们一定要考虑,否则你的驱动就不稳定,不安全,因为工业现场各种干扰,以及其他异常情况。可能你在实验室跑的好好的代码,到现场就不行了

5.4 读写擦驱动

擦除操作比较耗时,所以如果你是用查询模式的话,要不断去查询状态,而不能死等,从手册可以看除时间量级,擦除正片最大需要1000s,还是比较耗时,即使最小的擦除单元4k擦除,最坏情况也需要400ms。用中断或者DMA方式操作的话不涉及,但DMA的话中断需要好几个,有命令,完成,状态匹配,收发完成等。要熟悉这些大概时间量级。方便参考。基于不同模式的驱动我们在公众号里都给大家介绍过。

读写驱动,可以参考官网的例程,但是要加一些改动,如考虑读写失败怎么办,超时退出,如果连续两次还是失败,怎么考虑,我们一般会考虑尝试三次,如果第一次失败就尝试第二次读取,第二次失败,尝试第三次,这样可以大大加强安全性,可能99.99%的情况下一次就成功,但不排除失败的可能性。此外还要考虑参数的保护。

5.4.1 擦除

可以按照擦除单位来综合写一个函数

这里要注意就是W25Q256 和W25Q01J 的一些区别。如有的指令前者支持指令地址四线,而后者不支持。

5.4.2 读操作

读操作要考虑是single还是dual模式,分别出两个子函数,读的指令不同,时序也不同

建议大家一个指令做一个子函数。如0x6C和0xEC的时序和操作模式就不同,如0X6c

代码实现

从时序图可以看到指令单线,地址单线,数据4线即 1-1-4模式。0xEC留给大家去联系实现。

5.4.3 写操作

写操纵也有几条不同的命令

不同的时序和方式,可以写成不同的子函数,我们以34h为例子

通过时序图可以看到是指令单线,地址单线,数据四线,这样就可以实现写操作了。

5.5 异常

通常我们还需要去管理和处理一些异常情况,例如下面的定义,你也可以按照自己的方式,总之要对异常和错误做一些管理。

官方的例子基本上每个都有返回值,大家可以去参考,这样使你的驱动更安全可靠。

5.6 其他

其他一些应考虑的问题,大家可以根据自己的需求和应用在添加,这里就不在赘述。

6. 测试验证

开发完后,就可以写一个简答的测试程序,对自己的驱动进行测试,因为我是在freeRTOS系统下用的,所以建立一个QSPI的测试任务,去实现擦,写,读,比较的功能和验证。截取几张测试图

7. 参考文档

序号 文献
1 STM32H743RM
2 STM32Cube_FW_H7_V1.6.0

原文标题:如何写好QSPI驱动

文章出处:【微信公众号:嵌入式程序猿】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1928

    浏览量

    88205
  • QSPI
    +关注

    关注

    0

    文章

    47

    浏览量

    13241

原文标题:如何写好QSPI驱动

文章出处:【微信号:InterruptISR,微信公众号:嵌入式程序员】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    QSPI PSRAM伪静态随机存储器选型攻略

    QSPI PSRAM是一种集成了QSPI接口与PSRAM存储功能的高效芯片。QSPI(四线串行外设接口)是一种高速串行通信接口,用于连接外部设备;而PSRAM(伪静态随机存储器)则结合
    的头像 发表于 10-23 15:40 304次阅读

    STM32H743 QSPI初始化成功,读数据失败怎么解决?

    在实验野火开发部STM32H743时,配置了QSPI驱动W25Q256JV,初始化成功,但后续都失败了,如图1 我的配置过程如下, 1、使用了CubMX,如下图 2、CubMX生成了代码 3
    发表于 10-14 07:14

    ART-Pi中启用外部flash是在哪里配置了qspi的引脚呢?

    1、我目前是自己学习画了一块儿板子,想要学习rtthread+lvgl,我在添加完lvgl包的时候报错rom超了。于是了解到需要使用外部flash。我的板子上也连接了QSPI接口的W25Q64JV
    发表于 10-10 06:09

    SFUD QSPI读写w25q64jv失败是什么原因导致的?

    了 sf无法读写 换了芯片换了开发板不管用, GD25Q64CS连ID都读不到 换了一块F429的板子, spi接口读写w25q64jv没有问题, 看来SFUD是支持W25Q64JV的, 那就是QSPI的问题了, 分享一下在artpi上的使用, 我后悔把artpi出掉了
    发表于 09-29 07:37

    【六岳微LY-F335开发板试用体验】基本接口/功能/开发环境及开发体验

    一、开箱与第一印象 收到 六岳微 LY-F335 开发板后,整体包装简洁大方,板卡及配件摆放规整,附带的资料也较齐全开发板基于LY-F335 芯片 ,主频高,集成度不错,接口种类丰富。第一眼印象
    发表于 09-26 14:43

    ZYNQ UltraScalePlus RFSOC QSPI Flash固化常见问题说明

    璞致 ZYNQ UltraScalePlus RFSOC QSPI Flash 固化常见问题说明
    发表于 08-08 15:49 0次下载

    杰里AC7925B双QSPI屏音箱参考原理图

    电子发烧友网站提供《杰里AC7925B双QSPI屏音箱参考原理图.pdf》资料免费下载
    发表于 07-10 14:14 4次下载

    LS1028 FSPI设备驱动程序不工作怎么解决?

    我想使用 ls1028 处理器的 qspi 功能。 我按如下方式更改 dts: dts: spi@20c0000 { 兼容 = “NXP,LX2160A-FPPI”; #address-cells
    发表于 04-10 07:20

    串行通信接口SPI与QSPI的区别

    在嵌入式系统的世界里,选择正确的通信技术可以对项目的性能和可扩展性产生重大影响。让我们比较两个流行的串行通信接口:SPI(串行外设接口)和QSPI(四路SPI)。
    的头像 发表于 04-09 15:24 2558次阅读
    串行通信接口SPI与<b class='flag-5'>QSPI</b>的区别

    QSPI启动模式EMMC跳转失败的原因?

    ) 根据 AN13750 文档,通过 QSPI 启动成功重定向到 SD 卡以启动内核。 SD 卡刻录命令为: $ sudo dd if=/dev/zero of=/dev/sda bs=512
    发表于 04-02 08:07

    LS1046A启动后,QSPI CS始终处于LOW状态,为什么?

    我创建了一个实现 LS1046A 的原始板。我正在尝试将 Flash Programmer 与 CodeWarrior 的 JTAG 一起使用,但 QSPI 信号无法正常工作。 具体来说
    发表于 03-25 06:05

    MRCANHUBK344测试Qspi_Ip_Example_S32K344,遇到Qspi_Ip_Init返回STATUS_QSPI_IP_BUSY的问题求解

    我目前正在 MRCANHUBK344 开发人员板上测试Qspi_Ip_Example_S32K344。示例项目使用 MX25L6433FM2R-08G 闪存器件,而 CANHUB 板卡配备了
    发表于 03-20 07:32

    使用FRDM-MXCN947板,在MCUXpresso IDE中调试期间尝试从下载写入QSPI闪存出现报错的原因?

    我正在使用 FRDM-MXCN947 板,并在 MCUXpresso IDE 中调试期间尝试从下载写入 QSPI 闪存,但出现以下错误。 闪存驱动程序使用 MCXN9xx_SFDP_FlexSPI.cfx。 我需要修改驱动
    发表于 03-17 07:13

    北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构

    北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构
    的头像 发表于 03-11 14:13 1561次阅读
    北京迅为RK3568<b class='flag-5'>开发</b>板OpenHarmony系统南向<b class='flag-5'>驱动</b><b class='flag-5'>开发</b>内核HDF<b class='flag-5'>驱动</b>框架架构

    AN210 GD32G5x3系列QSPI高速模式时钟调整方法

    电子发烧友网站提供《AN210 GD32G5x3系列QSPI高速模式时钟调整方法.pdf》资料免费下载
    发表于 01-20 14:33 0次下载
    AN210 GD32G5x3系列<b class='flag-5'>QSPI</b>高速模式时钟调整方法