NXP MCU 技术论坛
直播中

李秀珍

7年用户 956经验值
私信 关注
[问答]

MCU启动实用程序的FlexSPI NOR设备配置窗口应该如何工作?

大家好,
我们刚刚获得了自己设计的第一个原型,其中包含以下组件:
- MCU 是 MIMXRT1061CVL5B
- 闪存是连接到 QSPI1 的微芯片 SST26VF064B
- J-link SWD 用于调试
项目是用 MCUXpresso IDE 构建的。
构建的基础知识取自 MIMXRT1060-EVKB-DEVKIT 示例,设备更改为 1061,evkmimxrt1060_flexspi_nor_config.c 如下所示:
const flexspi_nor_config_t qspiflash_config = {
.memConfig =
    {
        .tag                  = FLEXSPI_CFG_BLK_TAG,
        .version              = FLEXSPI_CFG_BLK_VERSION,
        .readSampleClksrc=kFlexSPIReadSampleClk_LoopbackInternally,
        .csHoldtime           = 3u,
        .csSetupTime          = 3u,
        .controllerMiscOption = (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable),
        .deviceType           = kFlexSpiDeviceType_SerialNOR,
        .sflashPadType        = kSerialFlash_4pads,
        .serialClkFreq        = kFlexSpiSerialClk_80MHz,
        .sflashA1Size         = 8u * 1024u * 1024u,
        .lookupTable =
            {
                // Read LUTs
                [0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),  // SPI Quad I/O Read: EBH, 24bit address
                [1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04), // 6 dummy cycles, read data in 4 bit blocks

                // Read Status LUTs
                [4 * 1 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04), // Read-Status Register : 05H,

                // Write Enable LUTs
                [4 * 3 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x0), // Write-Enable: 06H

                // Erase Sector LUTs
                [4 * 5 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x18), // Sector-Erase:20H, 24bit address

                // Erase Block LUTs
                [4 * 8 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8, RADDR_SDR, FLEXSPI_1PAD, 0x18), // Block-Erase: D8H, 24bit address

                // Pape Program LUTs
                [4 * 9 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18), // Page-Program: 02H, 24bit address
                [4 * 9 + 1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0), // Write bytes. Stop.

                // Erase Chip LUTs
                [4 * 11 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xC7, STOP, FLEXSPI_1PAD, 0x0), // Chip-Erase: C7H
            },
    },
.pageSize           = 256u,
.sectorSize         = 4u * 1024u,
.ipcmdSerialClkFreq = 1u,
.blockSize          = 64u * 1024u,
.isUniformBlockSize = false,
};

MCU 启动并运行,我们可以使用 J-link 调试器运行链接在 SRAM 中的测试软件。
J-link 将位于 FLASH 的应用程序下载到设备,但问题开始了:
- 在调试器配置中,我们选择 NOT to reset the target before running。
- 调试器进入 main 中的断点,我们可以执行几个第一次调用,直到我们结束“deadbeef”。
复位后 MCU 不启动到 FLASH 应用程序。
当运行稍微修改过的evkmimxrt1060_flash_component_nor示例时,我们可以看到至少应用程序的第一段已正确加载到 FLASH。
这证明 FLASH 接口的写入/读取是有效的。
在选择Generate unsigned Bootable image时使用NXP MCU Boot Utility工具,该工具显示警告“ Invalid vector address found in image file: gen\user_file\proto0.srec ”,但这实际上并没有告诉我们那里出了什么问题。我们无法测试通过 USB 加载应用程序,因为 USB 连接似乎存在一些问题,仍在检查原因。

欢迎任何好的提示,无法从 FLASH 运行应用程序确实会停止我们的测试工作。NXP MCU Boot Utility
警告是什么意思?查看映射文件,至少二进制文件开头的地址似乎与从 SDK 示例生成的地址相同。
提前谢谢你,
朱卡
顺便说一句:从来没有真正理解NXP MCU 启动实用程序的FlexSPI NOR 设备配置窗口应该如何工作:如果我在那里选择 Microchip_SST26VFxxxB ,任何地方都没有改变,文件夹gen\bootable_image中生成的二进制映像的开头看起来仍然与它们最初是由 MCUXpresso 生成的。

                  

更多回帖

发帖
×
20
完善资料,
赚取积分