2396782_ja-JP

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

2396782_ja-JP

2396782_ja-JP

フラッシュ構成の混乱 RT1176 オクタル DDR

こんにちは、NXP

Macronix Octal DDRモード用にフラッシュメモリを設定する際に、いくつか問題が発生しました。

NXP FMU-6XRTのリファレンスデザインをベースにしたカスタムボード上でPX4コードスタックを使っています。私はMX25UM51345Gの代わりにMX25UM51245Gを使用していますが、部品の違いはごくわずかです。

Macronix Octal 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を生成するにはBoot Memory Configurationを使うことを強くお勧めします。 Secure Provisioning Tool 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

マスミセイムさん、ありがとうございます。

確かに、例えばデータを入れ替える必要があることに気づきました。もう一度LUTを確認してみます。

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-...


Zephyr RTOSの指示に従って、ミスオプションを編集してデータの順序を入れ替えるべき https://github.com/zephyrproject-rtos/hal_nxp/blob/3a36ee1f8b9fc2168fc0bf80377ace8298292993/mcux/mcu...


データスワップバイトは挿入されるのですが、何か見落としているような気がします。

	.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(Double Transfer Rate OPI)バイトモードのデータシーケンスを明示的にサポートしていますが、MX25UM51245Gは別の製品バリアントに属しています。これにより、FlexSPIコントローラで使用されるコマンドフォーマット、バイト順序、LUT構成に影響を与えることがあります。

私の設定も比較できます。MX25UM513とMX25UW6345G:
https://github.com/Masmiseim36/Coremark_iMXRT/blob/master/XiP/flexspi_flash_OSPI_Macronix.c

よろしく


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