i.MX RT1061 シリアル非QuadSPI NORフラッシュブート こんにちは、 W25Q128JVSIQ外部フラッシュを搭載した i.MX RT1061 を使用するプロジェクトがあります。W25Q128JVSIMもサポートする予定です (入手可能な場合)。ただし、 W25Q128JVSIMには、QE ビット (Quad Enable) が有効にロックされていません。そこから起動しようとすると、最初に QE ビットを有効にせずに、ブート ROM がFast Read Quad I/Oを実行しようとしていると思われます (送信された最初の 2 つのコマンドのスクリーンショットを参照してください)。 最初に FlexSPI 構成ブロックを読み取るようですが (これは予想どおりです)、その後、クワッド読み取りが失敗し、何も起こりません (ブートローダが起動しません)。 これを機能させるには、製造中に QE ビットが有効になっていることを確認する必要があると思いますが、 i.MX RT1061 が非 QuadSPI NOR フラッシュからのブートをサポートしているかどうかが気になります。Quad および Octal フラッシュのみがサポートされているようです (BOOT_CFG1 ヒューズのスクリーンショットを参照)。 ありがとう、 ダニエル i.MXRT 106x Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot こんにちは@Habib_MS 、 ご返信ありがとうございます! うーん...私の理解では、 quad_mode_settingはflexspi_nor_get_config を呼び出すときにのみ適用されるのですが、何か誤解しているのでしょうか? FlexSPI 構成ブロックを介して QuadSPI としてフラッシュにアクセスするように BootROM を構成する方法はありますか? ありがとう、 ダニエル Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot こんにちは@MulattoKidさん、
非 (シリアル)-QuadSPI NOR フラッシュからの起動がサポートされています。サポートされているフラッシュデバイスの詳細については、RM の 9.6 章「ブートデバイス」を参照してください。また、イメージ内のBOOT_CFG1[3:2]ビットを強調表示していることも理解しています。これらのフィールドは、定義で説明されているように、自動プローブ メカニズムによって使用されます。したがって、これらのビットはフラッシュ デバイスの構成を制御するのではなく、フラッシュ デバイスに関する追加情報のみを提供します。
QSPI NOR フラッシュの QE ビット構成に関しては、通常は正しいブート オプション構成を選択するだけで十分です。
BR ハビブ Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot BootROM が FCB を読み取った直後にクワッド読み取りコマンドを送信する理由が分かりました。これは、ブートローダに FCB で指定されたカスタム LUT があったためです。読み取り用の LUT エントリを変更すると、SPI トラフィックも変更されます。 前述したように、私がこれを検討している理由は、W25Q128JVSIQ と W25Q128JVSIM の両方をサポートできるようにしたいからです。W25Q128JVSIM では、工場出荷時に QE ビットがデフォルトで設定されていません。自社生産時にQEビットを設定したい。私が調査してきた方法は、JLink スクリプトを使用して FLexSPI ペリフェラルを直接制御することです。しかし、ちょっと困っています。 W25Q128JVSIM のステータス レジスタ 2 を読み取るためのコマンド シーケンスがありますが、これは MCU が最初にアプリケーションを起動した場合にのみ機能します (QE ビットがすでに設定されていない限り、起動は失敗します)。フラッシュが空で、BootROM にブートするものが何もない場合は JLink スクリプトは機能しないので、FlexSPI ペリフェラルを構成するために何か追加の設定が必要なのでしょうか? 参考までにスクリプトを以下に示します。 ExitOnError 1
Device MIMXRT1061xxx5B
SelectInterface SWD
Speed 4000
Connect
halt
// Enable clock
w4 0x400FC078, 0xFFFFFFFF
// Reset module
w4 0x402A8000, 0x00000002
sleep 20
w4 0x402A8000, 0x00000000
sleep 20
// Clear errors
w4 0x402A8014, 0xFFFFFFFF
w4 0x402A80B4, 0xFFFFFFFF
sleep 20
// 2) Update LUT to include Read Status Register 2 and Write Status Register 2 commands
w4 0x402A8018, 0x5AF05AF0 // Write magic value (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
w4 0x402A801C, 0x2 // Unlock LUT (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
// LUT entry structure (i.MX RT1060 reference manual rev3, p.1709):
// [31:26] = opcode1
// [25:24] = num_pads1
// [23:16] = operand1
// [15:10] = opcode0
// [ 9: 8] = num_pads0
// [ 7: 0] = operand0
// #include
//
// #define OPERAND_0(x) (x << 0)
// #define NUMPADS_0(x) (x << 8)
// #define OPCODE_0(x) (x << 10)
// #define OPERAND_1(x) (x << 16)
// #define NUMPADS_1(x) (x << 24)
// #define OPCODE_1(x) (x << 26)
//
// #define kFLEXSPI_Command_STOP 0x0
// #define kFLEXSPI_Command_SDR 0x1
// #define kFLEXSPI_Command_RADDR_SDR 0x2
// #define kFLEXSPI_Command_WRITE_SDR 0x8
// #define kFLEXSPI_Command_READ_SDR 0x9
// #define kFLEXSPI_1PAD 0x0
//
// #define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1) (OPERAND_0(op0) | NUMPADS_0(pad0) | OPCODE_0(cmd0) | OPERAND_1(op1) | NUMPADS_1(pad1) | OPCODE_1(cmd1))
//
// int main()
// {
// printf("WriteEnable: 0x%08X\n", FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0));
// printf("ReadStatusRegister2: 0x%08X\n", FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04));
// printf("WriteStatusRegister2: 0x%08X\n", FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x31, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04));
//
// return 0;
// }
// Each command sequence in the LUT is 4 entires with each entry being 4 bytes (one word)
w4 0x402A82E0, 0x24040435 // LUT[14 * 4] = Read Status Register-2 command sequence
sleep 20
w4 0x402A8018, 0x5AF05AF0 // Write magic value (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
w4 0x402A801C, 0x1 // Lock LUT (i.MX RT1060 reference manual rev3, p.1612)
sleep 20
// Read Status Register-2
w4 0x402A8080, 0x80000000 // Clear sequence pointer for port A
w4 0x402A8014, 0x1F // Clear pending status
w4 0x402A80A0, 0x0 // Set base address
w4 0x402A80B8, 0x1 // Reset RX FIFO
w4 0x402A80A4, 0xE0001 // SEQID=14, SEQNUM=1, 1 byte
w4 0x402A80B0, 0x00000001 // Trigger IP command
sleep 50 Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot こんにちは@dafela 、 前回のメッセージで説明した構成を使用して、FlexSPI NOR API を使用して QE ビットを有効にすることができます。QE ビットを有効にするために使用できるさまざまな方法の詳細については、この投稿の項目 19 を参照してください。 FlexSPI ROM API の詳細については、RM のセクション 9.13.2 を参照してください。 一方、J-Link の使用に関するガイダンスが必要な場合は、この投稿で一般的な概要と、役立つ可能性のあるいくつかの考慮事項が提供されます。
BR ハビブ Re: i.MX RT1061 Serial non-QuadSPI NOR flash boot ありがとう。見てみるよ
查看全文