i.MX RT1061 串行非 Quadspi 或非 闪存启动 您好, 我有一个使用 i.MX RT1061 和W25Q128JVSIQ外置闪存的项目。我希望也能支持W25Q128JVSIM(视可用性而定)。不过,W25Q128JVSIM并没有将 QE 位(Quad Enable)锁定为启用状态。在尝试从它启动时,我看到我假设启动ROM在没有先启用Qe-bit的情况下尝试执行快速读取Quad I/O(参见发送的前两个命令的屏幕截图)。 它似乎首先读取了 FlexSPI 配置块(这在意料之中),但随后四重读取失败,什么也没发生(引导加载程序未启动)。 我怀疑我必须确保在生产过程中启用 Qe-bit 才能正常工作,但我很好奇 i.MX RT1061 是否支持从非 Quadspi NOR 闪存启动?似乎只支持 Quad 和 Octal 闪存(请参见 BOOT_CFG1 熔丝的屏幕截图)? 谢谢, Daniel i.MX RT106x Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot 你好,@Habib_MS、 感谢您的答复! 嗯......我的理解是,只有在调用flexspi_nor_get_config 时才会应用quad_mode_setting,我是不是理解错了? 是否有办法通过 FlexSPI 配置块将 BootROM 配置为以 QuadSPI 方式访问闪存? 谢谢, Daniel Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot 你好,@MulattoKid、
支持从非(串行)-QuadsPI NOR 闪存启动。有关支持哪些闪存设备的更多详细信息,请参阅 RM 中第 9.6 章 “启动设备”。我还知道您在图像中突出显示了 BOOT_CFG1[3:2] 位。这些字段由自动探测机制使用,如其定义所述。因此,这些位仅提供有关闪存设备的其他信息,而不是控制其配置。
关于 QSPI 或非 闪存的 QE 位配置:通常,选择正确的启动选项配置就足够了。
BR Habib Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot 你好 @dafela, 你可以使用我之前的消息中提到的配置,使用 FlexSPI 或非 API 来启用 QE 位。有关启用 QE 位的不同方法的更多详情,请参阅本帖第 19 项。 有关 FlexSPI ROM API 的更多信息,请参见 RM 第 9.13.2 节。 另一方面,如果您需要使用 J-Link 的指导,本篇文章提供了一个总体概述和几个有用的注意事项,或许对您有所帮助。
BR Habib Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot 我找到了为什么 bootROM 在读取 FCB 后立即发送四重READ命令:这是因为我们的引导加载程序在 FCB 中指定了自定义 LUT。更改读取 LUT 条目也会改变 SPI 流量。 如前所述,我之所以研究这个问题,是因为我希望能够同时支持 W25Q128JVSIQ 和 W25Q128JVSIM,而 W25Q128JVSIM 出厂默认设置中没有设置 QE 位。我想在我们自己的生产过程中设置 QE 位。我一直在研究的方法是使用 JLink 脚本直接控制 FLexSPI 外设。不过,我遇到了一些麻烦。 我有一个用于读出 W25Q128JVSIM 的状态寄存器-2 的命令序列,但它只有在 MCU 首次启动到我们的应用程序时才起作用(除非 QE 位已被设置,否则 MCU 无法启动)。如果闪存是空的,而 bootROM 没有任何东西可以启动,那么 jLink 脚本就不起作用,所以我想知道配置 FlexSPI 外围设备是否需要额外的设置? 以下是供参考的脚本: ExitOnError 1
Device MIMXRT1061xxx5B
SelectInterface SWD
Speed 4000
Connect
halt
// Enable clock
w4 0x400FC078, 0xFFFFFFFF
// Reset module
w4 0x402A8000, 0x00000002
sleep 20
w4 0x402A8000, 0x00000000
sleep 20
// Clear errors
w4 0x402A8014, 0xFFFFFFFF
w4 0x402A80B4, 0xFFFFFFFF
sleep 20
// 2) Update LUT to include Read Status Register 2 and Write Status Register 2 commands
w4 0x402A8018, 0x5AF05AF0 // Write magic value (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
w4 0x402A801C, 0x2 // Unlock LUT (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
// LUT entry structure (i.MX RT1060 reference manual rev3, p.1709):
// [31:26] = opcode1
// [25:24] = num_pads1
// [23:16] = operand1
// [15:10] = opcode0
// [ 9: 8] = num_pads0
// [ 7: 0] = operand0
// #include
//
// #define OPERAND_0(x) (x << 0)
// #define NUMPADS_0(x) (x << 8)
// #define OPCODE_0(x) (x << 10)
// #define OPERAND_1(x) (x << 16)
// #define NUMPADS_1(x) (x << 24)
// #define OPCODE_1(x) (x << 26)
//
// #define kFLEXSPI_Command_STOP 0x0
// #define kFLEXSPI_Command_SDR 0x1
// #define kFLEXSPI_Command_RADDR_SDR 0x2
// #define kFLEXSPI_Command_WRITE_SDR 0x8
// #define kFLEXSPI_Command_READ_SDR 0x9
// #define kFLEXSPI_1PAD 0x0
//
// #define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) (OPERAND_0(op0) | NUMPADS_0(pad0) | OPCODE_0(cmd0) | OPERAND_1(op1) | NUMPADS_1(pad1) | OPCODE_1(cmd1))
//
// int main()
// {
// printf("WriteEnable: 0x%08X\n", FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0));
// printf("ReadStatusRegister2: 0x%08X\n", FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04));
// printf("WriteStatusRegister2: 0x%08X\n", FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x31, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04));
//
// return 0;
// }
// Each command sequence in the LUT is 4 entires with each entry being 4 bytes (one word)
w4 0x402A82E0, 0x24040435 // LUT[14 * 4] = Read Status Register-2 command sequence
sleep 20
w4 0x402A8018, 0x5AF05AF0 // Write magic value (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
w4 0x402A801C, 0x1 // Lock LUT (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
// Read Status Register-2
w4 0x402A8080, 0x80000000 // Clear sequence pointer for port A
w4 0x402A8014, 0x1F // Clear pending status
w4 0x402A80A0, 0x0 // Set base address
w4 0x402A80B8, 0x1 // Reset RX FIFO
w4 0x402A80A4, 0xE0001 // SEQID=14, SEQNUM=1, 1 byte
w4 0x402A80B0, 0x00000001 // Trigger IP command
sleep 50 Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot 谢谢,我会看看的
查看全文