IMX93QSB の Flexspi_nor_polling_transfer SDKs の例におけるベンダー ID の問題 こんにちは、みんな、 imx93-qsb に似たカスタム ボードのペリフェラルをテストするために、VSCode 用の MCUXpresso を使用しています。SDK プロジェクト「flexspi_nor_polling_transfer」から始めて、例で使用されているチップMT25QU512ABB と非常によく似た NOR フラッシュ MT25QU01GBBB8E12 の機能をテストしたいと思います。 関数flexspi_nor_get_vendor_idでは0x20 ではなく 0xFF が返され、最後の操作は正常に完了します。 例と同じ SPI ペリフェラル (SD3 パッドの flexSPI1) を使用していますが、ID ベンダーを正しく読み取れない理由がわかりません。誰か助けてくれませんか? Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB ちなみに、拡張 SPI モードで IS25WX256 を使用する場合、Read ID コマンド 0x9E でも問題が発生します。コマンドは `FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9e, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 4),` です。使用するたびに `0x888cadce` を読み取ります。 Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは@AldoG 、 vendorID 値で何が起こっているかを理解するために、flexspi_nor_get_vendor_id 関数内に PRINTF コマンドをいくつか配置してみました。 出力は次のようになります。 また、flashXfer.seqIndex を 4 * NOR_CMD_LUT_SEQ_IDX_READID に変更してみましたが、出力は次のように変わりました。 関数内を何度も確認することが役に立つかどうかはわかりません。おそらく問題は seqIndex 値自体にあります。あなたの考えを聞かせてください。 よろしくお願いいたします。 ボブ Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、 私が推奨した追加事項からわかるように、あなたはまさにその例をそのまま使用しています。 メモリが正しく機能していないというよりは、ID を取得するための LUT コマンドが正しく機能していないのではないかと思います。そのため、正しく送信されているかどうかを確認できるかどうかを言及しました。 よろしくお願いいたします。 アルド。 Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、 次の UUU コマンドを使用して nor-flash をターゲットとするブートローダーを配置できたため、フラッシュ メモリが正常に動作していることはほぼ確実です。 uuu.exe -b qspi imx-boot-imx93-11x11-lpddr4x-evk-sd.bin-flash_singleboot FlexSPI Serial NOR でブート構成を設定すると、ブートローダが正しく実行されていることがわかります。しかし、なぜこのプロジェクトを MCUXpresso for VScode で使用すると問題が発生するのか、まだわかりません。 ご協力いただける場合はお知らせください。iMX93 の M33 コアでも作業する必要があります。 ありがとうございます ボブ Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、 共有していただきありがとうございます。注意深く確認させていただきます。 ところで、ハードウェア上の信号を確認する方法はありますか? よろしくお願いいたします。 アルド。 Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、アルドさん。 助けてくれてありがとう。残念ながら、この LUT の変更は解決策ではなく、ベンダー ID では依然として 0xff が読み取られます。C コード全体を皆さんと共有します。 /* * 著作権 (c) 2016、Freescale Semiconductor, Inc. * 著作権 2016-2018 NXP * 無断転載を禁じます。 * * * SPDXライセンス識別子: BSD-3条項 */ #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_debug_console.h" #include "fsl_rgpio.h" #include "fsl_lpi2c.h" #include "fsl_iomuxc.h" #include "fsl_lpi2c.c" #include "fsl_flexspi.h" #include "app.h" #include "fsl_debug_console.h" #include "fsl_cache.h" #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_common.h" /**************************************************************************************** * 定義 **********************************************************************************/ /**************************************************************************************** * プロトタイプ **********************************************************************************/ /**************************************************************************************** * 変数 **********************************************************************************/ /* プログラムデータバッファは4バイトのアラインメントにする必要があります。これにより、このメモリ領域が次のように構成されているため、バスフォールトをCAN。 MPU によるデバイス メモリ。*/ SDK_ALIGN (静的uint8_t s_nor_program_buffer [ 256 ], 4 ); 静的uint8_t s_nor_read_buffer [ 256 ]; extern status_t flexspi_nor_flash_erase_sector ( FLEXSPI_Type *ベース、 uint32_tアドレス); extern status_t flexspi_nor_flash_page_program ( FLEXSPI_Type * base 、 uint32_t dstAddr 、 const uint32_t * src ); 外部status_t flexspi_nor_get_vendor_id ( FLEXSPI_Type *ベース、 uint8_t *ベンダーID ); 外部status_t flexspi_nor_enable_quad_mode ( FLEXSPI_Type *ベース); 外部status_t flexspi_nor_erase_chip ( FLEXSPI_Type *ベース); 外部void flexspi_nor_flash_init ( FLEXSPI_Type *ベース); /**************************************************************************************** * コード **********************************************************************************/ flexspi_device_config_tデバイス構成= { . flexspiRootClk = 12000000 , //12 MHz、ノイズあたりOK .フラッシュサイズ = FLASH_SIZE 、 . CS間隔単位 = kFLEXSPI_CsIntervalUnit1SckCycle 、 . CS間隔 = 2 、 .CSホールド時間 = 3 、 . CSセットアップ時間 = 3 、 .データ有効時間 = 0 、 .列スペース = 0 、 . enableWordAddress = 0 、 . AWRSeqIndex = 0 、 . AWRシーケンス番号 = 0 、 . ARDSeqインデックス = NOR_CMD_LUT_SEQ_IDX_READ 、 . ARDシーケンス番号 = 1 、 . AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle 、 . AHBWriteWaitInterval = 0 , }; const uint32_t customLUT [ CUSTOM_LUT_LENGTH ] = { /* 高速読み取りクアッドモード -SDR */ [ 4 * NOR_CMD_LUT_SEQ_IDX_READ + 0 ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0xEB 、 kFLEXSPI_Command_RADDR_SDR 、 kFLEXSPI_4PAD 、 0x18 )、 [ 4 * NOR_CMD_LUT_SEQ_IDX_READ + 1 ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_DUMMY_SDR 、 kFLEXSPI_4PAD 、 0x0A 、 kFLEXSPI_Command_READ_SDR 、 kFLEXSPI_4PAD 、 0x04 )、 /* ステータスレジスタの読み取り */ [ 4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0xB5 、 kFLEXSPI_Command_DUMMY_SDR 、 kFLEXSPI_4PAD 、 0x0 )、 [ 4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG + 1 ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_READ_SDR 、 kFLEXSPI_4PAD 、 0x04 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x0 )、 /* ID を読み取る */ [ 4 * NOR_CMD_LUT_SEQ_IDX_READID ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x9E , kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x04 ), // 0x9F から 0X9E に変更 /* 書き込み可能4パッド */ [ 4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_OPI ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x06 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x00 )、 /* 書き込み許可 */ [ 4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x06 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0 )、 /* セクタ消去 */ [ 4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x20 、 kFLEXSPI_Command_RADDR_SDR 、 kFLEXSPI_4PAD 、 0x18 )、 /* プログラム */ [ 4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x32 、 kFLEXSPI_Command_RADDR_SDR 、 kFLEXSPI_4PAD 、 0x18 )、 [ 4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1 ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_WRITE_SDR 、 kFLEXSPI_4PAD 、 0x01 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_4PAD 、 0 )、 /* クアッドモードに入る */ [ 4 * NOR_CMD_LUT_SEQ_IDX_ENABLEQUAD ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_1PAD 、 0x35 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x00 )、 /* ダミー書き込み。AHB 書き込みコマンドがトリガーされたときには何もしません。*/ [ 4 * NOR_CMD_LUT_SEQ_IDX_WRITE ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x0 、 kFLEXSPI_Command_STOP 、 kFLEXSPI_1PAD 、 0x0 )、 /* Qual SDR読み取りを使用してステータスレジスタを読み取る */ [ 4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS_OPI ] = FLEXSPI_LUT_SEQ ( kFLEXSPI_Command_SDR 、 kFLEXSPI_4PAD 、 0x05 、 kFLEXSPI_Command_READ_SDR 、 kFLEXSPI_4PAD 、 0x02 )、 }; int main ( void ) { uint32_t i = 0 ; status_tステータス; uint8_tベンダーID = 0 ; pcal6524_handle_tハンドル; /* clang-format オフ */ const clock_root_config_t lpi2cClkCfg = { .clockOff = false 、 . mux = 0 , // 24MHz発振器ソース . div = 1 }; /* clang-format オン */ BOARD_ConfigMPU (); BOARD_InitBootPins (); BOARD_BootClockRUN (); BOARD_InitDebugConsole (); CLOCK_SetRootClock ( BOARD_PCAL6524_I2C_CLOCK_ROOT 、 & lpi2cClkCfg ); CLOCK_EnableClock ( BOARD_PCAL6524_I2C_CLOCK_GATE ); /* M.2 nor フラッシュカードに 3.3V を設定します */ BOARD_InitPCAL6524 ( &ハンドル); PCAL6524_SetDirection ( &ハンドル, ( 1 << BOARD_PCAL6524_EXT1_PWREN ), kPCAL6524_Output ); PCAL6524_SetPins ( &ハンドル, ( 1 << BOARD_PCAL6524_EXT1_PWREN )); flexspi_nor_flash_init ( EXAMPLE_FLEXSPI ); PRINTF ( " \r\n FLEXSPI の例を開始しました! \r\n " ); /* ベンダーIDを取得します。 */ ステータス= flexspi_nor_get_vendor_id ( EXAMPLE_FLEXSPI 、 & vendorID ); if (ステータス!= kStatus_Success ) { ステータスを返します。 } PRINTF ( "ベンダーID: 0x %x \r\n " , vendorID ); #if ! (定義済み( XIP_EXTERNAL_FLASH )) /* チップ全体を消去します。*/ PRINTF ( "FlexSPI 経由でチップ全体を消去しています... \r\n " ); ステータス= flexspi_nor_erase_chip (EXAMPLE_FLEXSPI); if (ステータス!= kStatus_Success) { ステータスを返します。 } PRINTF ( "消去が完了しました! \r\n " ); #endif /* クアッドモードに入ります。*/ ステータス= flexspi_nor_enable_quad_mode ( EXAMPLE_FLEXSPI ); if (ステータス!= kStatus_Success ) { ステータスを返します。 } /* セクタを消去します。*/ PRINTF ( "FlexSPI 経由のシリアル NOR を消去しています... \r\n " ); ステータス= flexspi_nor_flash_erase_sector ( EXAMPLE_FLEXSPI 、 EXAMPLE_SECTOR * SECTOR_SIZE ); if (ステータス!= kStatus_Success ) { PRINTF ( "セクター消去失敗! \r\n " ); - 1を返します。 } memset ( s_nor_program_buffer 、 0xFFU 、 sizeof ( s_nor_program_buffer )); DCACHE_InvalidateByRange ( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE 、 FLASH_PAGE_SIZE ); memcpy ( s_nor_read_buffer , ( void * )( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE ), sizeof ( s_nor_read_buffer )); memcmp ()の場合、 s_nor_program_buffer 、 s_nor_read_buffer 、 sizeof ( )の場合、 s_nor_program_bufferは、次のようになります。 { PRINTF ( "データを消去 - 読み取ったデータ値が正しくありません! \r\n " ); - 1を返します。 } それ以外 { PRINTF ( "データの消去 - 正常に完了しました。 \r\n " ); } ( i = 0 ; i < 0xFFU ; i ++ )の場合 { s_nor_program_buffer [ i ] = i ; } ステータス= flexspi_nor_flash_page_program ( EXAMPLE_FLEXSPI 、 EXAMPLE_SECTOR * SECTOR_SIZE 、 ( void * ) s_nor_program_buffer ); if (ステータス!= kStatus_Success ) { PRINTF ( "ページ プログラム エラー! \r\n " ); - 1を返します。 } DCACHE_InvalidateByRange ( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE 、 FLASH_PAGE_SIZE ); memcpy ( s_nor_read_buffer , ( void * )( EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE ), sizeof ( s_nor_read_buffer )); memcmp ( s_nor_read_buffer 、 s_nor_program_buffer 、 sizeof ( s_nor_program_buffer ) ) != 0の場合 { PRINTF ( "プログラムデータ - 読み取ったデータ値が正しくありません! \r\n " ); - 1を返します。 } それ以外 { PRINTF ( "プログラムデータ - 正常に実行されました。 \r\n " ); } ステータス= flexspi_nor_get_vendor_id ( EXAMPLE_FLEXSPI 、 & vendorID ); if (ステータス!= kStatus_Success ) { ステータスを返します。 } PRINTF ( "ベンダーID: 0x %x \r\n " , vendorID ); PRINTF ( "ステータス: %d \r\n " , status ); 一方( 1 ) { } } Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、 テストしていただきありがとうございます。READ ID の実行時に LUT シーケンスが正しくない可能性が最も高いため、LUT で次の変更を試してください。 /* ID を読み取る */ [4 * NOR_CMD_LUT_SEQ_IDX_READID] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR、kFLEXSPI_1PAD、 0x9E 、kFLEXSPI_Command_READ_SDR、kFLEXSPI_1PAD、0x04)、 ぜひお試しいただき、結果を教えてください。 よろしくお願いいたします。 アルド。 Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB はい、ご提案どおりに次のコードを追加しました: 残念ながら、CANのとおり何も変わっていません。 @AldoG他にアイデアはありますか? ありがとうございます ボブ Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、 ハードウェアはすべて正常に見えますが、データがプログラムされた後にベンダー ID を読み取る機能を追加していただけますか? よろしくお願いいたします。 アルド。 Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、アルドさん。 ご返信ありがとうございます。これらは接続です Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB こんにちは、 これは、SPI メモリ上でリセット信号が正しく処理されていないことが原因で発生する可能性があります。メモリをどのように接続しているか教えていただけますか? 小さな回路図を共有していただければ、本当に助かります。 よろしくお願いいたします。 アルド。
查看全文