更换QSPI Flash品牌后I.MXRT1020不能正常操作

解决QSPI FLASH品牌兼容型,需要更改QE位的设置

由于QSPI NorFlash面临缺货涨价的情况,一些之前厂家推荐的Flash买不到,需要更换Flash,原本想来引脚完全兼容,硬件不用改动的器件,是否直接贴上去就可以替代,结果发现不是那么回事?本文介绍关键需要修改的点。

问题具体分析

目前采用I.MXRT1020跨界的MCU,使用官方标准的SDK软件包,基于SDK_2.6.1_EVK-MIMXRT1020的IAR 工程中的flexspi_nor_polling_transfer例子进行测试。

官方采用的是ISSI的QSPI NorFlash ISSI IS25LP064A-JBLE,这里更换为 Winbond的W25Q32。

通常QSPI闪存大部分是兼容相同的,只需要关心QE位的设置,如果这个位设置不对的话会导致器件启动异常。

参考W25Q32器件手册修改关键的QE位,使能四线制模式。修改代码部分关于QE使能的定义,从官方默认的QE位的数值0x40修改为0x0200。

#define FLASH_QUAD_ENABLE 0x0200 //0x40

这是为什么呢,为什么做这个修改呢?

因为正常如果需要使用Quad 4线模式IO0,IO1,IO2,IO3,需要将QE位置为1。它是状态寄存器S9中的一个非易失的位,写该状态寄存器位是非易失的,写过之后这个位就不会因为掉电而丢失。

由于不同厂家这个QE位不一样,因此要按照Winbond手册中的描述进行修改,其QE参数信息描述如下。

更换QSPIFlash品牌后I.MXRT1020不能正常操作

更换QSPIFlash品牌后I.MXRT1020不能正常操作

为了执行反复的在线更新应用程序代码,测试块擦除功能,在配置代码里面删除了如下的全擦除代码,只对部分需要升级的应用程序块执行擦除操作。


// PRINTF("Erasingwhole chip over FlexSPI...\r\n");

//

// status = flexspi_nor_erase_chip(EXAMPLE_FLEXSPI);

// if (status !=kStatus_Success)

// {

// return status;

// }

// PRINTF("Erasefinished !\r\n");

在使能Enable Quad模式后,将代码执行运行到函数Flexspi_nor_flash_erase_sector以后,仿真调试时代*会码**停在红色断点处。

如果第一次如果芯片是全空的情况下,可以跳过断点并正常执行;但是如果对Sector做过一次编程后,再次执行就会一直停在红色断点处。

更换QSPIFlash品牌后I.MXRT1020不能正常操作

问题解决办法:

说明上述问题和擦除Flash有关系,仔细检查擦除相关的命令,发现Winbond的块擦除命令是 0x20,而不是0xD7。将LUT表中关于块擦除的命令修改为0x20后,代码就执行正常了。

更换QSPIFlash品牌后I.MXRT1020不能正常操作

更换QSPIFlash品牌后I.MXRT1020不能正常操作

总结和建议

对于更换片外的 QSPI Flash,除了QE位不同厂家在寄存器中的位不一样以外,还需要仔细查看一些常规的命令,比如擦写块等,如果命令不一致就会出现操作异常的情况,移植修改的过程中,一定要完整的修改LUT表参数。

参考文档:

https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/i-mx-rt-crossover-mcus/i-mx-rt1020-crossover-mcu-with-arm-cortex-m7-core:i.MX-RT1020?tab=Design_Tools_Tab