新規Quad SPI フラッシュメモリチップ使用時にフラッシュメモリからブートができなくなる問題について
NXP i.MX RTシリーズのMCUはシリアル通信フラッシュメモリチップをFlexSPIポートに接続して使用します。(型番数字の末尾が4のものはフラッシュメモリを内蔵しています)
メーカーの開発ボード(MIMXRT1060-EVK等)に搭載されている同じ型番のフラッシュメモリチップで新規に回路を作成した場合や開発ボード上のフラッシュメモリチップを新しいチップに載せ替えた場合、これまで開発ボードで動作が確認できていたプログラムをフラッシュメモリチップにプログラミングしてもフラッシュメモリからのブートが出来なくなる場合があります。
これはフラッシュメモリチップ内部のQE(Quad Enable)ビットがセットされていないため、MCUがQuad SPI モードでフラッシュメモリの読み出しが行えないためです。
例えば下記のようにNXP社の開発ボードに搭載されているフラッシュメモリチップは初期状態でQEビットがセットされていない型番が使われています。
NXP社 MIMXRT1060-EVK: ISSI社 IS25WP064AJBLE (1.8V QSPI 64Mb QE=0)
NXP社 MIMXRT1020-EVK: ISSI社 IS25LP064AJBLE (3.3V QSPI 64Mb QE=0)
初期状態でQEビットがセットされているフラッシュメモリチップは下記のように型番のオプション表記部が”Q”と記載されています。
ISSI社 IS25WP064Qxxxx (1.8V QSPI 64Mb QE=1)、IS25LP064Qxxxx (3.3V QSPI 64Mb QE=1)
Winbond社 W25Q64FxxxxQ (3.3V QSPI 64Mb QE=1)

Quad SPI モードとは
Quad SPI は、通信機能の1つでQuad SPI フラッシュメモリなどのシリアルメモリにアクセスする機能です。
ユーザーは外部のシリアルメモリとマイコンのインタフェースの設計が容易になり、ピン数を節約することができます。
通常のメモリはアドレス線、データ線、信号線等をパラレル通信でアクセスするため多くのピンが必要になりますが、シリアルメモリを使用するとシリアル通信でメモリにアクセスできるため少ないピン数で接続できます。
通常のSPI(Serial Peripheral Interface)はクロックと入力データ、出力データ、チップセレクト信号を使って、1クロックごとに1ビットを送ってデータ通信を行います。
Quad SPIはデータ線を4本使い1クロックで4ビットを通信するため、データ通信において4倍速い通信が可能となります。Quad SPIモジュールがサポートする通信プロトコルモードは、「Single SPIモード」「Dual SPIモード」「Quad SPIモード」です。
Single SPIモードは、全二重4線式の通常のSPI通信です。1クロックにつき1ビットを送り、1バイト(8ビット)通信には8クロックで行います。

Dual SPIモードは、データ線を2本使い半二重通信で1クロックにつき2ビットを送り、1バイト通信を4クロックで行います。
Quad SPIモードは、データ線を4本使い半二重通信で1クロックにつき4ビットを送り、1バイト通信を2クロックで行います。

QSPIフラッシュメモリ内のQEビットをセットすることで、Quad SPIモードで通信が行えるようになります。
MCUXpressoで新規フラッシュメモリを初期化する方法
NXP社のMCUXpresso で新規QSPIフラッシュメモリチップのQEビットをセットする方法を説明します。
MCUXpressoのSDK内のExample projectにQSPIフラッシュメモリのQEビットをセットしフラッシュメモリのデータ消去を行うProjectが用意されているので、手軽さを優先してこのプログラムを使ってQSPIフラッシュメモリのQEビットをセットする方法を行います。
- NXP社のサイトからMCUXpresso IDEをダウンロード&インストール
- NXP社のサイトから使用するMCUのSDK(ソフトウェア開発キット)をダウンロードしMCUXpressoにインストール
- MCUXpressoのSDK Import Wizard で Examples projectsから “evkmimxrt10xx_flexspi_nor_polling_transfer” を選択しインポート

4. MCUXpresso のproject Explorer タブ内の “evkmimxrt10xx_flexspi_nor_polling_transfer”を選択し、プロジェクトのpropertiesを開く。

5. C/C++ Build内のSettingを選択し、MCU Linker内のManaged Linker ScriptでLink application to RAMのチェックボックスにチェックを入れる。(プログラムをRAMで実行するモードの設定)

6. MCUXpressoトップのDebugボタンを押します。 (プログラムがRAMで実行され、新規フラッシュメモリ内部のQEビットがセットされます)
7. 以上が新規フラッシュメモリ内部のQEビットをセットする方法になります。