查看: 8724|回复: 24

[求助] RT1052操作spi flah,擦除扇区,读写扇区的问题

[复制链接]
  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
    发表于 2020-7-17 14:20:09 | 显示全部楼层 |阅读模式
           大家好,各位大佬们我们公司准备开发一款产品,使用RT1052,通过spi flash存储数据。现在有个问题, 我们使用的spi flash是华邦的W25Q256JV,是用的野火给的demo,因为野火的demo在擦除、读写扇区的代码是下载到ram里执行的。       我将demo移植到我们的程序,程序的代码是下载到spi flash里的,在初始化spi flash就卡死,就是这句代码FlexSPI_NorFlash_Init(); 后来问了一个朋友,说要将执行擦除、读写扇区的函数放到ram执行。于是我改了分散加载文件

    #define m_flash_config_start           0x60000000
    #define m_flash_config_size            0x00001000

    #define m_ivt_start                    0x60001000
    #define m_ivt_size                     0x00001000

    #define m_interrupts_start             0x60002000
    #define m_interrupts_size              0x00000400

    #define m_text_start                   0x60002400
    //#define m_text_size                    0x01FFDC00
    #define m_text_size                    0x00600000

    #define m_data_start                   0x20000000
    #define m_data_size                    0x00020000

    #define m_data2_start                  0x20200000
    #define m_data2_size                   0x00040000

    #define m_data3_start                  0x80000000
    #define m_data3_size                   0x00200000

    #define m_ncache_start                 0x81C00000
    //#define m_ncache_size                  0x00400000
    //#define m_ncache_size                  0x02000000
    #define m_ncache_size                  0x01500000

    /* Sizes */
    #if (defined(__stack_size__))
      #define Stack_Size                   __stack_size__
    #else
      #define Stack_Size                   0x0400
    #endif

    #if (defined(__heap_size__))
      #define Heap_Size                    __heap_size__
    #else
      #define Heap_Size                    0x3000
    #endif


    LR_m_rom_config m_flash_config_start m_flash_config_size {   ; load region size_region
            RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
            * (.boot_hdr.conf, +FIRST)
            }
    }

    LR_m_rom_ivt m_ivt_start m_ivt_size {   ; load region size_region
            RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
            * (.boot_hdr.ivt, +FIRST)
            * (.boot_hdr.boot_data)
            * (.boot_hdr.dcd_data)
            }
    }

    LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {   ; load region size_region
      VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
        * (RESET,+FIRST)
      }
      ER_m_text m_text_start m_text_size { ; load address = execution address
        * (InRoot$$Sections)
        .ANY (+RO)
      }
      RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
        .ANY (+RW +ZI)
            bsp_norflash.o (+RO +RW +ZI)
            fsl_flexspi.o (+RO +RW +ZI)
            fsl_clock.o (+RO +RW +ZI)
      }
      RW_m_data2 m_data2_start m_data2_size { ; RW data
        .ANY (+RW +ZI)
      }
      RW_m_data3 m_data3_start m_data3_size { ; RW data
        .ANY (+RW +ZI)
      }

      ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
      }
      ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
      }
      RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
        * (NonCacheable.init)
        * (NonCacheable)
      }
    }


    这时候FlexSPI_NorFlash_Init();执行可以通过了,而且读写扇区也是可以执行的,但是在执行擦除扇区的时候程序卡死
    status_t FlexSPI_NorFlash_Erase_Sector(FLEXSPI_Type *base, uint32_t dstAddr)
    {
        status_t status;
        flexspi_transfer_t flashXfer;
            uint8_t is_os = 0;

        /* 写使能 */
        status = FlexSPI_NorFlash_Write_Enable(base);
        if (status != kStatus_Success)
        {
            return status;
        }
           
           
        /* 擦除扇区指令 */
        flashXfer.deviceAddress = dstAddr;
        flashXfer.port = kFLEXSPI_PortA1;
        flashXfer.cmdType = kFLEXSPI_Command;
        flashXfer.SeqNumber = 1;
        flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_ERASESECTOR;
        status = FLEXSPI_TransferBlocking(base, &flashXfer);
           
        if (status != kStatus_Success)
        {
            return status;
        }
           
        /* 等待FLASH至空闲状态 */
        status = FlexSPI_NorFlash_Wait_Bus_Busy(base);
           
        return status;
    }

    这个要怎么解决??????
    按理这段代码应该不会有问题啊,在demo程序里,分散加载文件直接将代码下载到ram,这段代码是可以执行的。
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-17 14:21:04 | 显示全部楼层
    深圳这边有没有NXP的技术支持啊??????
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-17 14:27:22 | 显示全部楼层
    分散加载文件里
    RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
        .ANY (+RW +ZI)
            bsp_norflash.o (+RO +RW +ZI)
            fsl_flexspi.o (+RO +RW +ZI)
            fsl_clock.o (+RO +RW +ZI)
      }
    这一段的作用就是讲spi flash读写、擦除扇区的函数放到ram里执行
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20017
    最后登录
    2024-4-25
    发表于 2020-7-20 10:41:37 | 显示全部楼层
    你的代码和数据存储都是在同一块W25Q256JV,建议先保证代码整体运行在RAM时可正常执行后,再尝试让代码在QSPI中运行,而其中设置FlexSPI模块的相关代码会迁移到RAM中
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-20 13:47:31 | 显示全部楼层
    小恩GG 发表于 2020-7-20 10:41
    你的代码和数据存储都是在同一块W25Q256JV,建议先保证代码整体运行在RAM时可正常执行后,再尝试让代码在QS ...

    谢谢小恩GG的回复,如果我想将代码下载到spi flash, 整体运行于SDRAM(整体代码4M多,内部ram放不下)里,并且让代码的执行从main开始就在SDRAM里执行(不在nor flash里执行),要怎么配置啊。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-20 13:51:30 | 显示全部楼层
    小恩GG 发表于 2020-7-20 10:41
    你的代码和数据存储都是在同一块W25Q256JV,建议先保证代码整体运行在RAM时可正常执行后,再尝试让代码在QS ...

    BOARD_ConfigMPU函数里有这样一段代码:
    #if defined(USE_RAM_VECTOR_TABLE)
        /* 启用SDRAM版本的中断向量表 */
        CopyAndUseRAMVectorTable();   
    #endif
    这段代码是不是就是将代码搬到ram里面的?如果我想要在这段代码之后的执行都在SDRAM里执行,该怎么做呢???
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-20 18:10:54 | 显示全部楼层
    我通过下面的配置,将程序下载到SDRAM,可以访问spi flash对flash进行操作了。

    #define m_flash_config_start           0x60000000
    #define m_flash_config_size            0x00001000

    #define m_ivt_start                    0x60001000
    #define m_ivt_size                     0x00001000

    #define m_interrupts_start             0x60002000
    #define m_interrupts_size              0x00000400

    #define m_text_start                   0x60002400
    #define m_text_size                    0x01FFDC00
    //#define m_text_size                    0x00600000

    #define m_data_start                   0x20000000
    #define m_data_size                    0x00020000

    #define m_data2_start                  0x20200000
    #define m_data2_size                   0x00040000

    #define m_data3_start                  0x80000000
    #define m_data3_size                   0x00200000

    #define m_data3_start                  0x80000000
    #define m_data3_size                   0x00200000

    #define m_sdram_interrupts_start             0x80200000
    #define m_sdram_interrupts_size              0x00000400

    #define m_sdram_text_start             0x80200400
    #define m_sdram_text_size              0x00600000

    #define m_ncache_start                 0x81C00000
    //#define m_ncache_size                  0x00400000
    //#define m_ncache_size                  0x02000000
    #define m_ncache_size                  0x01500000

    /* Sizes */
    #if (defined(__stack_size__))
      #define Stack_Size                   __stack_size__
    #else
      #define Stack_Size                   0x0400
    #endif

    #if (defined(__heap_size__))
      #define Heap_Size                    __heap_size__
    #else
      #define Heap_Size                    0x3000
    #endif
    /*
    LR_m_rom_config m_flash_config_start m_flash_config_size {   ; load region size_region
            RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
            * (.boot_hdr.conf, +FIRST)
            }
    }

    LR_m_rom_ivt m_ivt_start m_ivt_size {   ; load region size_region
            RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
            * (.boot_hdr.ivt, +FIRST)
            * (.boot_hdr.boot_data)
            * (.boot_hdr.dcd_data)
            }
    }

    LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {   ; load region size_region
      VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
        * (RESET,+FIRST)
      }
      ER_m_text m_text_start m_text_size { ; load address = execution address
        * (InRoot$$Sections)
        .ANY (+RO)
      }
      RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
        .ANY (+RW +ZI)
      }
      RW_m_data2 m_data2_start m_data2_size { ; RW data
        .ANY (+RW +ZI)
      }
      ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
      }
      ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
      }
      RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
        * (NonCacheable.init)
        * (NonCacheable)
      }
    }
    */

    LR_m_rom_config m_flash_config_start m_flash_config_size {   ; load region size_region
            RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
            * (.boot_hdr.conf, +FIRST)
            }
    }

    LR_m_rom_ivt m_ivt_start m_ivt_size {   ; load region size_region
            RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
            * (.boot_hdr.ivt, +FIRST)
            * (.boot_hdr.boot_data)
            * (.boot_hdr.dcd_data)
            }
    }

    LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {   ; load region size_region
      VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
        * (RESET,+FIRST)
      }
      ER_m_text m_text_start m_text_size { ; load address = execution address
        * (InRoot$$Sections)
        //.ANY (+RO)
            startup_mimxrt1052.o(+RO)
            system_mimxrt1052.o(+RO)
      }
      
      //////////////////////////////////
      VECTOR_RAM m_sdram_interrupts_start EMPTY m_sdram_interrupts_size {
      }
      ER_m_ram_text m_sdram_text_start m_sdram_text_size {
            .ANY (+RO)
      }
      /////////////////////////////////
      
      RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
        .ANY (+RW +ZI)
      }
      RW_m_data2 m_data2_start m_data2_size { ; RW data
        .ANY (+RW +ZI)
      }
      RW_m_data3 m_data3_start m_data3_size { ; RW data
        .ANY (+RW +ZI)
      }

      ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
      }
      ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
      }
      RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
        * (NonCacheable.init)
        * (NonCacheable)
      }
    }

    主要的配置:
    ER_m_text m_text_start m_text_size { ; load address = execution address
        * (InRoot$$Sections)
        //.ANY (+RO)
            startup_mimxrt1052.o(+RO)
            system_mimxrt1052.o(+RO)
      }
      
      //////////////////////////////////
      VECTOR_RAM m_sdram_interrupts_start EMPTY m_sdram_interrupts_size {
      }
      ER_m_ram_text m_sdram_text_start m_sdram_text_size {
            .ANY (+RO)
      }
      /////////////////////////////////
    我有个疑问,这样配置了以后,通过jtag下载的代码会存储在spi flash里面吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20017
    最后登录
    2024-4-25
    发表于 2020-7-21 11:10:09 | 显示全部楼层
    本帖最后由 小恩GG 于 2020-7-21 11:13 编辑
    stonege1019 发表于 2020-7-20 13:47
    谢谢小恩GG的回复,如果我想将代码下载到spi flash, 整体运行于SDRAM(整体代码4M多,内部ram放不下)里 ...

    代码存储在QSPI,启动后,代码整体搬移到SDRAM中运行,这是启动方式是RT MCU支持的,不需要像你改linker file这么复杂,这种方式叫做non-XIP模式,你可以参考此篇经验分享来了解整体的实现流程(https://www.nxpic.org.cn/module/forum/thread-619754-1-1.html),同时NXP现在提供了更简单的实现工具,你只需提供存放位置定位于SDRAM的image 文件其他又工具来完成,此工具名称为MCUXpresso Secure Provisioning Tools ,下载链接如下:http://www.nxp.com/design/softw ... SECURE-PROVISIONING
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-21 15:08:56 | 显示全部楼层
    小恩GG 发表于 2020-7-21 11:10
    代码存储在QSPI,启动后,代码整体搬移到SDRAM中运行,这是启动方式是RT MCU支持的,不需要像你改linker f ...

    多谢小恩GG。我去看看
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2020-8-18 09:16
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    5

    主题

    33

    帖子

    1

    注册会员

    Rank: 2

    积分
    111
    最后登录
    2020-10-9
     楼主| 发表于 2020-7-21 16:14:18 | 显示全部楼层
    小恩GG 发表于 2020-7-21 11:10
    代码存储在QSPI,启动后,代码整体搬移到SDRAM中运行,这是启动方式是RT MCU支持的,不需要像你改linker f ...

    我这里还遇到一个问题,使用spi flash需要关闭DCache功能,如果不关闭,操作spi flash时很容易卡死(随机的),卡死的地方通常是擦除扇区,读写扇区(某个状态位未恢复,卡死在循环里)。

    但是关闭了DCache功能后,UI界面的操作显示会变慢很多。这怎么解决?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 05:27 , Processed in 0.141057 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表