マイクロコントローラのプログラムメモリの拡張にSPI XiPフラッシュを使う理由とその方法
DigiKeyの北米担当編集者の提供
2019-05-08
マイクロコントローラのアプリケーションが複雑さを増すにつれ、フラッシュプログラムメモリがアプリケーションファームウェアに使われる機会が多くなっています。これは、特に比較的複雑なエッジコンピューティングを行うようになってきたモノのインターネット(IoT)向けエンドポイントに当てはまります。ところが、ときにはアプリケーションが外部プログラムメモリを必要とするほど膨れ上がることもあり、その時点でパラレルフラッシュかシリアルフラッシュかの選択に迫られます。
外付けパラレルフラッシュメモリチップを追加すると、I/Oラインをふさぎ、複雑さが増し、基板スペースを余分に使用します。本稿では、Adesto TechnologiesのSPI eXecute in Place(XiP)インターフェース対応外付けシリアルフラッシュメモリチップを追加することにより、マイクロコントローラのフラッシュプログラムメモリを拡張する方法を説明します。また、ファームウェアにとってコードの実行がほぼ透過的になるようにMicrochip TechnologyのマイクロコントローラがXiPフラッシュをメモリ空間にマッピングする方法についても説明します。
外部メモリを拡張する理由
アプリケーション開発の最初の段階では、できれば内蔵メモリ容量のより大きなピン互換デバイスのロードマップがあるマイクロコントローラを選択することをお勧めします。開発途上にアプリケーションファームウェアが膨れ上がり、ターゲットデバイスのフラッシュメモリ容量を超えた場合、より大容量のフラッシュを内蔵したピン互換デバイスなら、開発期間中に簡単に置き換えることができます。この方法ならば、プリント基板を他のマイクロコントローラ用に再設計する必要がなく、アプリケーションメモリを拡張できます。
しかし、ピン互換のマイクロコントローラファミリが内蔵しているよりも大容量のプログラムメモリをアプリケーションが要求し、外部フラッシュメモリを使うことが必要になる場合もあります。このような状況は一般的になりつつありますが、その理由は次の例のように多岐にわたります。
- 開発段階でシステムの範囲が当初のコンセプトを超えて拡大する場合。これは、アプリケーションの最終段階での変更、度重なる機能などの追加、所要メモリ容量の不正確な予測が原因になります。ここでの選択肢は、より大容量のフラッシュプログラムメモリを内蔵したピン互換マイクロコントローラにアップグレードするか、外部フラッシュプログラムメモリを追加するかですが、後者は開発がすでに進んでいればプロジェクトに遅れが出る恐れがあります。
- 現場における将来のファームウェアアップグレードで、システムボードに搭載しているマイクロコントローラの内蔵メモリよりも大容量のフラッシュプログラムメモリが必要になる場合。この状況での選択肢は限られています。現場でシステムをより多くのフラッシュプログラムメモリを備えたものと交換するか、アップグレードをやめるかです。
- システム製品ファミリの開発で、ピン互換のマイクロコントローラファミリがすでに内蔵しているよりも大容量のフラッシュプログラムメモリを必要とする新製品が求められる場合。新しいマイクロコントローラファミリを採用してシステムを再設計するか、外部フラッシュプログラムメモリを追加するかという選択肢があります。
現在および将来のシステムについて、このメモリ拡張の必要性を予測し、計画することの重要性は明白です。外部フラッシュプログラムメモリが必要になる可能性がある場合、プリント基板の将来の拡張用の場所を確保すべきです。フラッシュメモリチップは必ずしもその基板上に搭載する必要がないものの、念のためにスペースを確保しておくことに越したことはありません。
フラッシュプログラムメモリを拡張する従来の方法は、アドレスラインとデータラインを備えたパラレルフラッシュインターフェースを使うものでした。しかし、速度を犠牲にしないパラレルフラッシュメモリを最も効率良く使用しても、アドレスに16ビット、データに16ビット、および4つ以上の制御信号を扱うことになります。これにはマイクロコントローラのピンが36本以上必要です。
この方法は、マイクロコントローラのリソース利用効率が悪いことに加え、選択できるマイクロコントローラが外部バスを備えたものに限られてピン数が多くなります。外部パラレルバスはプリント基板のスペースもかなり必要である上、高速のアドレスバスおよびデータバスにより電磁干渉(EMI)の恐れが増します。
SPI XiPによるコード実行
より効果的な方法は、SPI XiPインターフェースをサポートしている外部フラッシュプログラムメモリを使うことです。SPI XiPインターフェースは、6本のピンを使うだけでホストマイクロコントローラと接続できます。従来のSPIインターフェースと異なり、外部フラッシュメモリデバイス上のメモリはSPIファームウェアドライバで直接アクセスされるのではなく、マイクロコントローラのプログラムメモリ中にマッピングされます。
SPI XiPインターフェースを使って接続するように設計されたシリアルフラッシュメモリデバイスの良い例としては、Adesto TechnologiesのAT25SL321-UUE-Tがあります(図1)。これは、シングルSPI、デュアルSPI、クワッドSPIの各モードをサポートしている32メガビット(Mbit)フラッシュメモリです。104メガヘルツ(MHz)のSPIクロックをサポートしており、デュアルSPIモードで266MHz、クワッドSPIで532MHzの等価クロックレートで動作できます。

図1:AdestoのAT25SL321は、シングルSPI、デュアルSPI、クワッドSPIの各モードをサポートした32Mbitフラッシュメモリです。8ピンSOIC、DFN8、TSSOP8の各パッケージで32Mbitフラッシュメモリを提供します。(画像提供:Adesto Technologies)
このデバイスは、32Mbitのフラッシュとともにデバイス設定用のステータスレジスタを備えています。ステータスレジスタを読み取ることで、ファームウェアはデバイスが書き込み動作中または消去動作中であるかどうか判別できます。ステータスレジスタに書き込むことにより、フラッシュメモリのブロックを書き込み保護することができます。
Adesto AT25SL321は、一意のシリアル番号などのセキュリティ情報格納用に使える4キロビット(Kbit)のワンタイムプログラム可能(OTP)メモリも備えています。8ピンSOIC、DFN8、TSSOP8のパッケージがあります。
SPI XiPをサポートするすべてのシリアルメモリデバイスと同様、Adesto AT25SL321はAdestoのデバイス固有の命令セットを使用して設定します。この命令セットは、ホストマイクロコントローラがシリアルフラッシュ制御に使う38種類のコマンドで構成されています。ホストマイクロコントローラのSPI XiP周辺モジュールにはマイクロコントローラの電源投入時にターゲットシリアルフラッシュの命令セットで初期化されるプログラム可能なステートマシンが含まれます。初期化が完了すると、SPI周辺モジュールの動作はメモリマップドSPI XiP領域でコードを実行するファームウェアにとって透過的です。
たとえば、ホストマイクロコントローラのファームウェアがメモリマップド領域からデータを読み出す場合、Adesto命令セットで設定されるSPI XiPは、Read Data命令コードに続けて24ビットのバイトアドレスをAdestoシリアルメモリに送信します。次にAdestoシリアルメモリはメモリ内容をホストマイクロコントローラに1度に1バイトずつ送信します。ファームウェアにとって、これは通常のメモリ読み出しのように見えます。
Adesto AT25SL321には、SPIクロック、データ、チップセレクトの各ピンに加えて、拡張システム内機能用に2本のピンを持っています。WP\ はアクティブローの書き込み保護ピンであり、コードブロックの書込み保護を行うステータスレジスタへの書き込みを防止します。このマイクロコントローラは、低優先度のタスクが不正な変更を加えることをこのピンを使って防止できます。HOLD\ は、進行中のデータ転送を一時停止するのに使われます。これは、マイクロコントローラがメモリへのデータ転送中に高優先度割り込み信号を受信し、割り込みを処理するまで一時停止する必要があるときに役立つ場合があります。
Adesto AT25SL321 32Mbitフラッシュデバイスは、以下の4つの動作モードをサポートしています。
- 標準SPI動作:このフラッシュメモリには、標準SPIメモリデバイスと同様、SPIクロック(SCLK)、アクティブローチップセレクト(CS\)、シリアル入力(SI)データ、シリアル出力(SOデータを使用してアクセスします。標準SPIバスモード0および3をサポートしています。
- デュアルSPI動作:このモードでは、SIおよびSOを双方向データピンとして使用することにより(IO 0およびIO 1と表記)、標準SPI動作の2倍のデータレートで動作します。
- クワッドSPI動作:このモードでは、標準SPI動作の4倍のデータレートで動作します。IO 0およびIO 1に加えて、WP\ およびHOLD\ を双方向データピンとして使用します(IO 2およびIO 3と表記)。クワッドSPI動作の場合、WP\ およびHOLD\ の機能は利用できません。
- QPI動作:このモードはSPI XiP動作でのみ使われます。標準SPI、デュアルSPI、クワッドSPIの各モードはすべてIO 0ピンのみによるSPIメモリへのコマンド送信をサポートしているのに対し、QPI動作はIO 0~IO 3の4本のピンを使用したコマンド送信をサポートしており、SPI XiP性能を大幅に向上させています。
Adesto AT25SL321の32Mbitだけでは十分でない場合に、Adestoは64MbitのAT25QL641-UUE-Tも提供しています。これら2つのデバイスはピン互換であるため、AT25QL641はドロップイン交換品になります。メモリ容量が大きいこと以外の唯一の違いは、AT25QL641の場合、電源投入時にデフォルトでQPI動作に設定されることです。このため、高性能システムにおけるデバイスの設定時間が短くなります。どちらのデバイスもメモリ読み出しサイクル中の消費電流は、わずか5ミリアンペア(mA)です。どちらのAdesto製メモリデバイスも単一の1.7~2.0ボルト電源レールで動作し、SPI XiPインターフェースを備えた任意の電圧互換マイクロコントローラに接続できます。
ホストマイクロコントローラについては、Microchip TechnologyのATSAMD51シリーズ(120MHz Arm® Cortex®-M4FベースのATSAMD51J20A-UUTマイクロコントローラなど)がSPI XiPインターフェースを備えています。このデバイスは1Mbyteのフラッシュと256キロバイト(Kbyte)のRAMを内蔵しています。また、A/Dコンバータ(ADC)、D/Aコンバータ(DAC)、USBポート、I2Sなど豊富な周辺モジュールを内蔵しています。セキュリティ機能用に公開鍵暗号化周辺モジュールおよび真性乱数生成器(TRNG)も備えています。
図2:MicrochipのATSAMD51J20Aは、SPI XiPシリアルインターフェース、ADC、DACなど豊富な周辺モジュールを内蔵し、データの暗号化をサポートしています。(画像提供:Microchip technology)
外部フラッシュメモリの接続には、ATSAMD51J20AのSPI XiP対応QSPI周辺モジュールを使うことができます。これにより、Adesto製フラッシュメモリから直接、コードを実行できます。ATSAMD51J20AはAdesto製フラッシュをArmのAdvanced High-Performanceバス(AHB)プログラムメモリ空間にマッピングします。シリアルフラッシュのデータ保護のため、ATSAMD51J20AのSIP XiPは外部SPIメモリに書き込むデータの透過的スクランブル処理および外部SPIメモリから読み出したデータのスクランブル解除をサポートしています。これは不正なファームウェアのコピーおよびシステム侵害の防止に役立ちます。

図3:MicrochipのATSAMD51J20A 32ビットマイクロコントローラはSPI XiPシリアルポートをサポートするQSPI周辺モジュールを内蔵しています。AdestoのAT25SL321シリアルフラッシュにわずか6ピンで容易に接続できます。(画像提供:DigiKey)
MicrochipのATSAMD51J20AでAdestoのシリアルフラッシュメモリデバイスを使う
Microchip ATSAMD51J20AのSPI XiP周辺モジュールには、外部シリアルXiPフラッシュへのコマンド送信に使う3つのレジスタがあります。シリアルフラッシュXiPメモリデバイスで使用する命令コードはデバイスのサプライヤごとに異なるため、これらのレジスタは使用メモリのサプライヤに応じて、以下のように設定する必要があります。
- 命令コードレジスタは、シリアルフラッシュのアクセスに使われる命令を格納します。クワッドSPIモードで動作しているAdestoのフラッシュメモリデバイスでは、ファームウェアがメモリマップドXiP領域からコードを実行している場合、このレジスタはFast Read Quad Output命令(0x6B)を格納しています。書き込み、消去、ステータスレジスタの操作のいずれかを実行する場合には、このレジスタを該当の命令コードに変更する必要があります。
- 命令アドレスレジスタは、外部シリアルフラッシュ上のアクセス先のフラッシュメモリアドレスを格納します。Microchip ATSAMD51J20A SPI XiPがシリアルメモリモード用に設定されている場合、このアドレスはファームウェアが実行しているメモリマップドAHBメモリ空間の0x0400 0000~0x0500 0000の範囲内にあるアドレスにSPI XiP周辺モジュールによって自動的にセットされます。
- 命令フレームレジスタは、使用する外部メモリデバイス固有の命令フレームフォーマット用にSPI XiPを設定します。この設定には、アドレス長が24ビットか32ビットかの選択、ダブルデータレート(DDR)の有効化、連続読み出しモードのサポート可否、命令コード長などがあります。
Microchip SPI XiPインターフェースの設定の残りは、Microchip SPIドライバを使って容易にできます。
マイクロコントローラ上のアプリケーションファームウェアがSPI XiPメモリマップド領域からコードを実行している限り、マイクロコントローラのSPI XiP周辺モジュールを再設定する必要はありません。Adestoのフラッシュメモリは、単一のSIピンのみによる読み出しモードもサポートしています(命令コード0x03)。デュアルSPIモードのみを使う場合、命令コードは0x3Bです。これらのコードはアプリケーションファームウェアによって命令コードレジスタに書き込みます。
命令コードレジスタを変更する際、メモリマップドアドレス空間に関連付けられたキャッシュをすべてフラッシュするのが良い方法と考えられます。シリアルフラッシュメモリのステータスレジスタの読み書きの際、キャッシュはフラッシュした後、無効にする必要があります。これはメモリマップド領域のフラッシュに書き込む場合にも行う必要があります。キャッシュは、メモリ読み出し動作を再開したら再有効化する必要があります。
高速データ転送を行うため、シリアルフラッシュはプリント基板でマイクロコントローラのSPI XiPポートのできるだけ近くに配置すべきです。それができない場合は、120ミリメートル(mm)を超えるトレースがないようにする必要があります。クロック信号は、干渉防止のため、他の信号からプリント基板トレース幅の少なくとも3倍は離す必要があります。スキュー防止のため、双方向データ信号のIO 0~IO 3はすべて相互間隔10mm以内にする必要があります。
まとめ
外部シリアルフラッシュメモリデバイスを使用すると、パラレルフラッシュチップのような複雑さがなく、基板スペースを過度に占有することもなく、ファームウェアのコードを高速に実行できます。この方法により、プログラムコードを経時的に拡張することが容易になるほか、システム基板を再設計することなく現場でのアップデートも可能になります。
免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。



