LPC5536とHyperram こんにちは、 LPC5536JBD100 上の FLEXSPI ペリフェラルの構成に苦労しています。HyperRAM チップは S27KS0642GABHV020 です。このシステムはカスタム ボード上にインストールされており、すでに他の機能も統合されています。 私は、別のプロセッサ用ですが、私が使用しているものと非常によく似たチップを例に挙げている AN12239 からインスピレーションを得ました。主な違いは、S27KS0642 の新しいテクノロジにあるように思われます。このテクノロジによって、アプリケーション ノードで使用されている S27KS0641 よりも高速になりますが、タイミング図 (SO ダミー サイクル) とコマンドは同じです。 もう一つのインスピレーションの源はこの記事です https://community.nxp.com/t5/MCX-マイクロコントローラ-ナレッジ/MCX-N947-FlexSPI-HyperRAMへの接続-分析-and/ta-p/1988799 これは私が使用しているプロセッサと同じではありませんが、構成データ構造内のいくつかのフィールドの意味を説明しています。 また、FlexSPI 構成を比較するために、lpcxpresso55s36_flexspi_octal_polling_transfer の例も調べました (フラッシュ デバイスをターゲットにしているため、何かを変更する必要があることはわかっています)。 私の症状は、ベンダー ID を読み取ろうとすると、関数が kStatus_Success を返さない (値 7001 を返す) ことです。 時計がコネクテッドされていることを確認しました。 CLOCK_SetClkDiv(kCLOCK_DivFlexSpiClk, 0U, true); /*!< Reset FLEXSPICLKDIV divider counter and halt it */ CLOCK_SetClkDiv(kCLOCK_DivFlexSpiClk, 2U, false); /*!< Set FLEXSPICLKDIV divider to value 2 */ CLOCK_AttachClk(kPLL0_to_FLEXSPI); /*!< Switch FLEXSPI to PLL0 */ ピンはGUIで設定されている 周辺機器の構成は次のように行われます int config_hr(void) { flexspi_config_t config; uint32_t tempCustomLUT[ARRAY_SIZE(customLUT)] = {0U}; /* Copy LUT information from flash region into RAM region, because flash will be reset and back to single mode; In lately time, LUT table assignment maybe failed after flash reset due to LUT read entry is application's required mode(such as octal DDR mode) and flash is being in single SDR mode, they don't matched. */ memcpy(tempCustomLUT, customLUT, sizeof(tempCustomLUT)); /* Get FLEXSPI default settings and configure the flexspi. */ FLEXSPI_GetDefaultConfig(&config); /* Init FLEXSPI. */ config.rxSampleClock = kFLEXSPI_ReadSampleClkExternalInputFromDqsPad;//kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;//kFLEXSPI_ReadSampleClkExternalInputFromDqsPad; //config.enableSckBDiffOpt = true; //config.enableCombination = true; config.ahbConfig.enableAHBPrefetch = true; config.ahbConfig.enableAHBBufferable = true; config.ahbConfig.enableAHBCachable = true; // config.enableDoze = false; FLEXSPI_Init(EXAMPLE_FLEXSPI, &config); /* Configure RAM settings according to serial RAM feature. */ FLEXSPI_SetFlashConfig(EXAMPLE_FLEXSPI, &deviceconfig, kFLEXSPI_PortA1); /* Update LUT table. */ FLEXSPI_UpdateLUT(EXAMPLE_FLEXSPI, 0, tempCustomLUT, ARRAY_SIZE(customLUT)); /* Do software reset. */ FLEXSPI_SoftwareReset(EXAMPLE_FLEXSPI); return 0; } ベンダーIDを読み取る関数でもポートA1を使用していることを確認しました status_t flexspi_hyper_ram_get_id(FLEXSPI_Type *base, uint32_t *vendorId) { flexspi_transfer_t flashXfer; status_t status; uint32_t id; /* Write data */ flashXfer.deviceAddress = 0x0U; flashXfer.port = kFLEXSPI_PortA1; flashXfer.cmdType = kFLEXSPI_Read; flashXfer.SeqNumber = 1; flashXfer.seqIndex = HYPERRAM_CMD_LUT_SEQ_IDX_READREG; flashXfer.data = &id; flashXfer.dataSize = 4; status = FLEXSPI_TransferBlocking(base, &flashXfer); *vendorId = id & 0xffffU; return status; } flexspi_device_config_t構造体は次のように初期化されます。 flexspi_device_config_t deviceconfig = { .flexspiRootClk = 75000000, /* 75MHZ SPI serial clock */ .isSck2Enabled = false, .flashSize = FLASH_SIZE, .CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle, .CSInterval = 2, .CSHoldTime = 1, .CSSetupTime = 1, .dataValidTime = 1, .columnspace = 3, .enableWordAddress = true, .AWRSeqIndex = HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA, .AWRSeqNumber = 1, .ARDSeqIndex =HYPERRAM_CMD_LUT_SEQ_IDX_READDATA, .ARDSeqNumber = 0, .AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle, .AHBWriteWaitInterval = 0, .enableWriteMask = true, }; そしてLUTの値は #define LATENCY (0x04) uint32_t customLUT[20] = { /* Read Data */ [4 * HYPERRAM_CMD_LUT_SEQ_IDX_READDATA] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0,kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, LATENCY), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_READDATA + 2] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00), /* Write Data */ [4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20,kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, LATENCY), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA + 2] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00), /* Read Register */ [4 * HYPERRAM_CMD_LUT_SEQ_IDX_READREG] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xE0,kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_READREG + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, LATENCY), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_READREG + 2] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00), /* Write Register */ [4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEREG] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x60,kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEREG + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, LATENCY), [4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEREG + 2] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00), }; これは、合計 48 個のアドレス ビット、8 個のパッドの DDR モードを使用しており、コマンドが正しいため、私にとっては理にかなっています。 何か見逃しているものがあるでしょうか? Re: LPC5536 and Hyperram こんにちは、 ありがとうございます。 いいえ、より多くのピンを構成しましたが、スクリーンショットは非常に悪く撮られました。データの8つのピン、RWDS 1つ、CS_n 1つ、差動クロックのペアがあると思います。 Re: LPC5536 and Hyperram こんにちは@img_gabrigob
ピン設定について。
5 つのデータ ピンを設定しましたか?
S27KS0642GABHV020 には 8 つのデータピンが必要です。
BR
ハリー
Re: LPC5536 and Hyperram こんにちは、 ありがとう。私はあなたに返信しましたが、何か間違ったことをしたようで(このコミュニティを初めて使用しました)、返信は私の元の投稿に直接送信されました。 Re: LPC5536 and Hyperram こんにちは@img_gabrigob
まず、ハードウェアをチェックしてみるといいとCANいます。
物理信号をプローブする(スコープ):
CKが期待どおりのレートでトグルし、トランザクションのCS#パルスが発生し、読み取りIDシーケンスをトリガーしたときにDQ[7:0] / RWDSがアクティビティを示すことを確認します。
FlexSPIシリアルクロックを低い安全な周波数に下げる(例:デバッグ中は、CPU の速度を 20~25 MHz に保ちます。
それならこのLUTを参考にすればCANと思います。
/* Read Register */
[4 * HYPERRAM_CMD_LUT_SEQ_IDX_READREG] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xE0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
[4 * HYPERRAM_CMD_LUT_SEQ_IDX_READREG + 1] = FLEXSPI_LUT_SEQ(
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x06),
[4 * HYPERRAM_CMD_LUT_SEQ_IDX_READREG + 2] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
/* Write Register */
[4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEREG] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x60, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
[4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEREG + 1] = FLEXSPI_LUT_SEQ(
kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x06),
[4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEREG + 2] = FLEXSPI_LUT_SEQ(
kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
RT1064 HyperRAM が S27KS0641 および S27KS0642 をサポート - NXP コミュニティ
BR
ハリー Re: LPC5536 and Hyperram こんにちは@Harry_Zhang 、 ありがとうございます! 私の LUT と、リンクされている他の投稿でユーザーが使用した LUT との間に違いがあるかどうかを確認しようとしましたが、レイテンシ待機状態のダミーの数を調整した後でも同じ問題が発生します。 IDEs インストールで何かを誤って構成したかどうかはわかりませんが、LPC5536 では flexspi_config_t データ構造から差動クロックを設定できないようです (フィールド enableSckBDiffOpt は無効な ifdef 内にあります)。 私たちはボード上でいくつかの対策を講じました。CSN および CLK 信号がアクティブです。 2つのスルーレートオプション(標準と高)でクロックをキャプチャしました。 クロック周波数は予想よりも遅いです (75MHz に設定したと思いますが、ここでは 150/2 ではなく 75/2 になっています)。 データおよびRWDS信号は0Vで安定します。データ信号にわずかなグリッチ(5ns)が見られるだけです グラフィカルユーザーインターフェースから出力される pin_mux ファイルと clock_config ファイルも添付します。 他に何かご提案はございますでしょうか? よろしくお願いいたします Re: LPC5536 and Hyperram こんにちは! 返信ありがとうございます 回路図を再度確認したところ…RESN は FLEXspi では制御されていないことに気づいたので、ソフトウェアを変更して上昇させました。 これでコントローラが動作するようになりました。MCU のピンも高速スルー レート オプションに設定されました。 これは、たとえば RWDS と CLK の比較です。 つまり、問題は LUT のレイテンシの値 (リンクで修正済み) とリセットでした。 これはこのプロジェクトの基本ではありませんが、FUTURE アプリケーションに役立つかもしれませんが、まだ理解していないことがあります。クロックツリーの設定から、CLKは75MHzになるはずですが、37.5MHzを計測しました。 他に見逃したクロック分周器はありますか? ありがとうございます よろしくお願いいたします。 ガブリエレ Re: LPC5536 and Hyperram こんにちは@img_gabrigob
HyperRAM への回路図接続を共有していただけますか?
BR
ハリー Re: LPC5536 and Hyperram こんにちは@img_gabrigob
LPC55S36 のデータシートによると。
クロックの最大周波数は50M(DDRモード)です。
/* Flexspi frequency 150MHz / 3 = 50MHz */
CLOCK_SetClkDiv(kCLOCK_DivFlexSpiClk, 0U, true); /*!< Reset FLEXSPICLKDIV divider counter and halt it */
CLOCK_SetClkDiv(kCLOCK_DivFlexSpiClk, 3U, false); /*!< Set FLEXSPICLKDIV divider to value 3 */
CLOCK_AttachClk(kPLL0_to_FLEXSPI); /*!< Switch FLEXSPI to PLL0 */
BR
ハリー
查看全文