2049962_ja-JP

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

2049962_ja-JP

2049962_ja-JP

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 が返され、最後の操作は正常に完了します。

 
 
 
 

Immagine1.png

例と同じ 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 コマンドをいくつか配置してみました。

Bob_NXP_user_0-1741957491653.png

出力は次のようになります。

Bob_NXP_user_2-1741957546022.png

また、flashXfer.seqIndex を 4 * NOR_CMD_LUT_SEQ_IDX_READID に変更してみましたが、出力は次のように変わりました。

Bob_NXP_user_3-1741958011862.png


関数内を何度も確認することが役に立つかどうかはわかりません。おそらく問題は 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

はい、ご提案どおりに次のコードを追加しました:

Immagine5.jpg

残念ながら、CANのとおり何も変わっていません。

Immagine4.jpg

@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

こんにちは、アルドさん。

ご返信ありがとうございます。これらは接続です

Immagine2.png

Re: Vendor ID issue in Flexspi_nor_polling_transfer SDK example for IMX93QSB

こんにちは、

これは、SPI メモリ上でリセット信号が正しく処理されていないことが原因で発生する可能性があります。メモリをどのように接続しているか教えていただけますか?

小さな回路図を共有していただければ、本当に助かります。

よろしくお願いいたします。
アルド。

Tags (1)
No ratings
Version history
Last update:
‎11-21-2025 06:33 PM
Updated by: