2396782_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2396782_zh-CN

2396782_zh-CN

Flash 配置混乱 RT1176 八路 DDR

您好,恩智浦

我在配置Macronix Octal DDR模式的闪存时遇到了一些问题。

我正在基于 NXP FMU-6XRT 参考设计的定制板上使用 PX4 代码栈。我使用的是 MX25UM51245G 而不是 MX25UM51345G,但这两个部件之间的差异很小。

我尝试在 Macronix 八进制 DDR 模式下运行它,并启用 DQS 外部采样,采样频率至少为 100MHz。参考设计运行频率为 200MHz。启动内存配置即使在 166MHz 的频率下也能成功测试所需配置的内存。


我尝试的配置是以下默认配置。第一个程序“g_flash_config”可以成功启动、写入、读取等,但对于软件来说并不理想。"g_flash_fast_config" 失败。

我尝试在“fast_config”的DTR模式下将频率降低到166MHz、133MHz、50MHz和30MHz,但都没有效果。


我尝试使用从启动内存配置生成的 FCB,但由于结构布局存在一些差异,因此很难将其应用于 PX4 代码。


我也尝试过 csHoldTime、csSetupTime 和 dataValidTime 的不同组合,但都没有结果。

我尝试在低频 DTR 八进制中使用 DQS 内部模式,但也没有成功。


接下来我还可以尝试什么?


#include 

/****************************************************************************
 * Public Data
 ****************************************************************************/

locate_data(".boot_hdr.conf")
const struct flexspi_nor_config_s g_flash_config = {
	.memConfig =
	{
#if !defined(CONFIG_BOARD_BOOTLOADER_INVALID_FCB)
		.tag                 = FLEXSPI_CFG_BLK_TAG,
#else
		.tag                 = 0xffffffffL,
#endif
		.version             = FLEXSPI_CFG_BLK_VERSION,
		.readSampleClksrc=kFlexSPIReadSampleClk_LoopbackInternally,
		.csHoldTime          = 1,
		.csSetupTime         = 1,
		.deviceModeCfgEnable = 1,
		.deviceModeType      = kDeviceConfigCmdType_Generic,
		.waitTimeCfgCommands = 1,
		.controllerMiscOption =
		(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable),
		.deviceType    = kFlexSpiDeviceType_SerialNOR,
		.sflashPadType = kSerialFlash_1Pad,
		.serialClkFreq = kFlexSpiSerialClk_100MHz,
		.sflashA1Size  = 64ul * 1024u * 1024u,
		.dataValidTime =
		{
			[0] = {.time_100ps = 0},
		},
		.busyOffset      = 0u,
		.busyBitPolarity = 0u,
		.lookupTable =
		{
			/* Read Dedicated 3Byte Address Read(0x03), 24bit address */
			[0 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x03, RADDR_SDR, FLEXSPI_1PAD, 0x18),    //0x871187ee,
			[0 + 1] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_1PAD, 0x04, STOP_EXE, FLEXSPI_1PAD, 0),//0xb3048b20
		},
	},
	.pageSize           = 256u,
	.sectorSize         = 4u * 1024u,
	.blockSize          = 64u * 1024u,
	.isUniformBlockSize = false,
	.ipcmdSerialClkFreq = 1,
	.serialNorType = 2,
	.reserve2[0] = 0x7008200,
};

const struct flexspi_nor_config_s g_flash_fast_config = {
	.memConfig =
	{
		.tag                 = FLEXSPI_CFG_BLK_TAG,
		.version             = FLEXSPI_CFG_BLK_VERSION,
		.readSampleClksrc=kFlexSPIReadSampleClk_LoopbackInternally,
		.csHoldTime          = 3,
		.csSetupTime         = 3,
		.deviceModeCfgEnable = 1,
		.deviceModeType      = kDeviceConfigCmdType_Spi2Xpi,
		.waitTimeCfgCommands = 1,
		.deviceModeSeq =
		{
			.seqNum   = 1,
			.seqId    = 6, /* See Lookup table for more details */
			.reserved = 0,
		},
		.deviceModeArg = 2, /* Enable OPI DDR mode */
		.controllerMiscOption =
		(1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DdrModeEnable),
		.deviceType    = kFlexSpiDeviceType_SerialNOR,
		.sflashPadType = kSerialFlash_8Pads,
		.serialClkFreq = kFlexSpiSerialClk_133MHz,
		.sflashA1Size  = 64ul * 1024u * 1024u,
		.dataValidTime =
		{
			[0] = {.time_100ps = 10},
		},
		.busyOffset      = 0u,
		.busyBitPolarity = 0u,
		.lookupTable =
		{
			/* Read */// EEH+11H+32bit addr+20dummy cycles+ 4Bytes read data
			/* Macronix manual says 20 dummy cycles @ 200Mhz, FlexSPI peripheral Operand value needs to be 2N in DDR mode hence 0x28 */
			[0 + 0] = FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0xEE, CMD_DDR, FLEXSPI_8PAD, 0x11),    //0x871187ee,
			[0 + 1] = FLEXSPI_LUT_SEQ(RADDR_DDR, FLEXSPI_8PAD, 0x20, DUMMY_DDR, FLEXSPI_8PAD, 0x28),//0xb3288b20,
			[0 + 2] = FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, 0x04, STOP_EXE, FLEXSPI_1PAD, 0x00), //0xa704,

			/* Read status */
			[4 * 2 + 0] = FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0x05, CMD_DDR, FLEXSPI_8PAD, 0xfa),
			[4 * 2 + 1] = FLEXSPI_LUT_SEQ(RADDR_DDR, FLEXSPI_8PAD, 0x20, DUMMY_DDR, FLEXSPI_8PAD, 0x04),
			[4 * 2 + 2] = FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, 0x04, STOP_EXE, FLEXSPI_1PAD, 0x00),

			/* Write enable SPI *///06h
			[4 * 3 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP_EXE, FLEXSPI_1PAD, 0x00),//0x00000406,

			/* Write enable OPI SPI *///06h
			[4 * 4 + 0] = FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0x06, CMD_DDR, FLEXSPI_8PAD, 0xF9),

			/* Erase sector */
			[4 * 5 + 0] = FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0x21, CMD_DDR, FLEXSPI_8PAD, 0xDE),
			[4 * 5 + 1] = FLEXSPI_LUT_SEQ(RADDR_DDR, FLEXSPI_8PAD, 0x20, STOP_EXE, FLEXSPI_1PAD, 0x00),

			/*Write Configuration Register 2 =01, Enable OPI DDR mode*/ //72H +32bit address + CR20x00000000 = 0x01
			[4 * 6 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x72, CMD_SDR, FLEXSPI_1PAD, 0x00),//0x04000472,
			[4 * 6 + 1] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x00, CMD_SDR, FLEXSPI_1PAD, 0x00),//0x04000400,
			[4 * 6 + 2] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x00, WRITE_SDR, FLEXSPI_1PAD, 0x01),//0x20010400,

			/*Page program*/
			[4 * 9 + 0] = FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0x12, CMD_DDR, FLEXSPI_8PAD, 0xED),//0x87ed8712,
			[4 * 9 + 1] = FLEXSPI_LUT_SEQ(RADDR_DDR, FLEXSPI_8PAD, 0x20, WRITE_DDR, FLEXSPI_8PAD, 0x04),//0xa3048b20,
		},
	},
	.pageSize           = 256u,
	.sectorSize         = 4u * 1024u,
	.blockSize          = 64u * 1024u,
	.isUniformBlockSize = false,
	.ipcmdSerialClkFreq = 1,
	.serialNorType = 2,
	.reserve2[0] = 0x7008200,
};

Re: Flash configuration confusion RT1176 Octal DDR

你好@SimonHugr
如果您计划使用 DDR 模式,请记住还必须考虑字节交换配置。本文提供了一些有用的信息,说明在使用 DDR 模式时,MX25UM51245GXDI00 的字节交换为何如此重要。

我强烈建议使用启动内存配置来生成 FCB,安全配置工具v26.6 提供了 MX25UM51245G 的模板,可以作为您配置的良好起点。另外,您可能也知道,这个工具可以帮助您测试配置。

此外,我建议查看这篇社区帖子,特别是从第 15 点开始的步骤。该部分更详细地解释了安全配置工具如何生成启动内存配置,并有助于阐明该工具生成的参数和输出。

最后,您可以使用 flexspi_nor_polling_transfer_cm7 示例来验证生成的 FCB,并在继续进行启动配置之前验证读取和写入操作是否正常工作。

BR
哈比卜

Re: Flash configuration confusion RT1176 Octal DDR

很遗憾,目前还没有结果。我仍然认为这与数据顺序互换有关,我可能漏掉了一些配置字节……

Re: Flash configuration confusion RT1176 Octal DDR

谢谢你,马斯米塞姆

事实上,我注意到例如数据应该互换一下。我将再次检查我的查找表。

Re: Flash configuration confusion RT1176 Octal DDR

参考此帖: https://community.nxp.com/t5/i-MX-RT-Crossover-MCUs/Internal-Boot-from-Flash-memory-not-starting-on-...


我应该通过编辑 misc 选项来交换数据顺序,根据 Zephyr RTOS 的说明(https://github.com/zephyrproject-rtos/hal_nxp/blob/3a36ee1f8b9fc2168fc0bf80377ace8298292993/mcux/mc...


数据交换字节已经插入,但我感觉好像漏掉了什么。

	.pageSize           = 256u,
	.sectorSize         = 4u * 1024u,
	.blockSize          = 64u * 1024u,
	.isUniformBlockSize = false,
	.ipcmdSerialClkFreq = 1,
        .isDataOrderSwapped = true
	.serialNorType = 2,
	.reserve2[0] = 0x7008200,

Re: Flash configuration confusion RT1176 Octal DDR

@SimonHugr

我首先要确认的是 MX25UM51245G 和 MX25UM51345G 之间的实际区别。虽然零件编号非常相似,但它们并不是完全相同的设备。根据 Macronix 的数据手册,MX25UM51345G 明确支持 DOPI(双倍传输速率 OPI)字节模式数据序列,而 MX25UM51245G 属于不同的产品型号。这会影响 FlexSPI 控制器使用的命令格式、字节顺序和 LUT 配置。

您还可以对比一下我的配置,我的配置适用于 MX25UM513 和 MX25UW6345G:
https://github.com/Masmiseim36/Coremark_iMXRT/blob/master/XiP/flexspi_flash_OSPI_Macronix.c

雷加尔斯


Re: Flash configuration confusion RT1176 Octal DDR

你好,哈比卜

对于我们的固件,我无法使用安全配置工具生成 FCB,而是需要在固件启动时加载 FCB,因此我需要创建 mem_config 和 flash_config 结构并自行配置。


我发现 Zephyr 项目在 flash_nor_config 中引用了一个 isDataOrderSwapped 字节。

https://github.com/zephyrproject-rtos/hal_nxp/blob/3a36ee1f8b9fc2168fc0bf80377ace8298292993/mcux/mcu...


Claude 提到 controllerMiscOption 的第 5 位有一个 padSettingOverride 位,第 7 位有一个 dataSwap 位,但我不太确定 LLM 是否严重地臆造了这些信息。


使用安全配置工具生成 FCB 并使用此工具将其转换为 C 结构体时


https://community.nxp.com/t5/i-MX-RT-Crossover-MCUs-Knowledge/i-MX-RT-FLEXSPI-booting-guide/ta-p/166...


我没有设置第 5 位或第 7 位,所以我认为 LLM 有问题,但是 isDataSwapped 已设置,并且在 FCB 中通常被引用为 reserved0[0]。


我在安全配置工具中找不到 MX25UM51245G 的模板,只有 MX25U51245G(四闪存)、MX25UM51345G 和 MX25UMxxx45G 的模板。


但我尝试过的所有八进制DDR配置都无法启动。

有趣的是,尽管 BT_FUSE_SEL = 1 且引脚 BOOTMODE0/1 = 0,MCU 在某些配置后通常会自动进入 ISP 模式。这种情况并不稳定,我不确定是什么配置导致了这个问题。


MCU在读取闪存失败后是否会进入ISP模式?

谢谢

BR





Re: Flash configuration confusion RT1176 Octal DDR

你好@SimonHugr
很抱歉,MX25UM51245G 没有模板,只有 MX25U51245G 和 MX25UM51345G 可用。

根据您的描述,使用您当前的启动内存配置设置,与闪存设备的通信似乎工作正常。单击“转换为完整 FCB”后,该工具会将配置编程到闪存中,然后使用您指定的参数将其读取回来,如下所述:

Habib_MS_0-1784753481563.png

如果所选设置中有任何一项不被闪存设备支持,该工具应报告类似于以下内容的错误:

Habib_MS_1-1784753506390.png

为了进一步验证社区帖子中提到的使用 FCB 变流器生成的 LUT 是否正常工作,请您在从内部 RAM 运行应用程序时,使用 flexspi_nor_polling_transfer_cm7 SDK 示例进行测试。如果您对示例有任何疑问,请随时联系我。

此外,您能否提供一些关于您尝试启动的应用程序的更多详细信息?
-这是 SDK 示例还是您自己的应用程序?
你使用的是哪个集成开发环境(IDE)?
-您的应用程序是执行 XIP 还是非 XIP?
-除了启动过程之外,您是否在任何其他阶段访问过闪存?

关于进入 ISP 模式,请确保您的定制板上的启动引脚符合MIMXRT1160/1170 硬件开发指南第 5 章“启动、复位和其他”中提到的建议?这样做是为了避免与启动引脚相关的任何硬件问题。

回答您的问题,如果没有有效的镜像文件,您可以进入ISP模式,如图10-1所示的RM“启动流程”:

Habib_MS_2-1784754516601.png



BR
哈比卜


Tags (1)
No ratings
Version history
Last update:
yesterday
Updated by: