「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
ソフテックだより第59号では、マイコンシステムの基礎知識として、マイコンによるSRAM(Static Random Access Memory)、SDRAM(Synchronous DynamicRandom Access Memory)制御について簡単に紹介しました。本号では、その続編として、マイコンによるフラッシュメモリ(Flash memory、フラッシュROMとも呼ばれる)の制御について、簡単に説明したいと思います。
昨今、パソコンなどのデータストレージとしてSSD(Solid State DriveまたはSolid State Disk)が注目を集めています。これらは、大容量で安価なNAND型フラッシュメモリを使用しています。NAND型フラッシュメモリは、CLE(Command Latch Enable)信号やALE(Address Latch Enable)信号といった特別な信号線を使用したDRAM制御に類似のアクセス方式を採用しており、ブロック単位でしか読み出しができないなどの理由から、現在のところ一部のマイコンでしかコントローラを搭載していません。
一方のNOR型フラッシュメモリは、1バイト単位の読み出しが可能で、SRAMなどと同じアクセス方式に対応していることから、マイコンを用いたシステムでは広く普及しています。本号では、このNOR型フラッシュメモリに焦点を絞って、説明を行います。
リードアクセスについては、SRAMインタフェースを搭載しているマイコンであれば、ソフト的には何も意識することなくアクセスが可能です。しかし、フラッシュへの書き込み(プログラム)に関しては、コマンド入力が必要となるため、ドライバソフトが必要となります。また、プログラム時には0→1のデータ書き込みを行うことができないため、必ず書き込み対象のセクタをイレーズ(対象領域のデータがすべて0xFFFFとなる)してからプログラムする必要があります。
16ビットバスのNOR型フラッシュメモリを例に、各端子(マイコンと接続する主要な端子のみ)の機能について下表に説明します。
端子名はメーカーにより多少の違いがあります。
端子 | 名称 | 入出力 | 機能 |
---|---|---|---|
A0 〜 An | Address | 入力 | アドレス入力。メモリサイズによりアドレス線の数nは異なります。例えば、16ビットデータバスで、n = 23のときはメモリサイズ256Mbとなります) |
DQ0 〜 DQ15 | Data | 入力/出力 | データ入出力。8ビットバスの場合はDQ7までとなります。 |
CE# | Chip enable | 入力 | デバイスのセレクト信号。本信号がアサート(assert、負論理の場合Low入力)されている期間のみ、他の信号線の入出力が有効となります。 |
WE# | Write enable | 入力 | デバイスへの書き込み許可信号。本信号がアサートされている期間は、ライトサイクルであると認識されます。その逆に、ネゲート(negate、負論理の場合High入力)期間中は、リードサイクルとなります。 |
OE# | Output enable | 入力 | デバイスからのデータ出力許可信号。本信号がアサートされている期間は、デバイス(フラッシュメモリ)からのデータ出力が許可されます。通常、本端子はマイコンのRD#端子と接続されます。 |
RY/BY# | Ready/Busy | 出力 | レディ/ビジー信号。フラッシュメモリ内部処理の進行中/完了ステータスを示します。本信号がLOW出力のとき、フラッシュメモリはプログラム動作中またはイレーズ動作中のため、次のコマンドを受け付けることができません。 |
表1. NOR型フラッシュメモリ端子機能
NOR型フラッシュメモリへのリードアクセス時におけるタイミングチャート例を下図に示します。SRAM等のアクセスと同様に、バスクロックが早すぎて、ノンウェイト(通常、2ステートアクセス)時にフラッシュメモリ推奨のアクセスタイムを守れない場合は、マイコンの設定でウェイトサイクルを挿入することができます。
図1. NOR型フラッシュメモリ リードアクセスタイミング例(3ステートアクセス)
ライトアクセス時のタイミングチャートは、基本的にはリード時(図1)と同じような内容となります(OE#の代わりにWE#がアサートされる)。しかし、フラッシュメモリの書き換え(プログラム)にはコマンドの入力が必要となりますので、SRAMのように1サイクルで書き込みを行うことはできません。
先に述べたとおり、メモリの消去(イレーズ)、書き込み(プログラム)などの操作は、コマンド入力により行います。コマンドには、フラッシュメモリメーカーごとにいくつか種類が存在しますが、代表的なものにJEDEC(Joint Electron Device Engineering Council)標準型コマンド方式とIntel系CUI(Common User Interface)コマンド方式があります。
プログラムおよびセクタイレーズ(ブロックイレーズ)時の入力コマンドについて、JEDEC標準型コマンド方式とCUIコマンド方式での具体例を下表にまとめます。コマンドアドレス/データの違いのほか、コマンド入力に必要なサイクル数にもそれぞれ違いがあります。
JEDEC標準型コマンド方式は、Hynix、Macronix、SPANSION、STマイクロエレクトロニクス、東芝などのメーカーが採用している方式です。一方、CUIコマンド方式は、Intel、シャープなどのメーカーが採用しています。
なお、JEDEC標準型コマンド方式におけるアドレスコマンド入力には若干注意が必要です。マイコンとフラッシュメモリを16ビットバス接続して使用する場合、ハード的にマイコンのアドレスバスとフラッシュメモリのアドレスバスを1bitずらして接続する場合があります(例えば、マイコン側のA22〜A1をフラッシュメモリのA21〜A0に接続するような場合)。このような場合は、下表のバスサイズ”Word”側のアドレスコマンドを入力してしまうと、正常にプログラム/イレーズができません。1bit左シフトしたアドレスコマンドを入力する必要があります。
バス サイズ |
1stサイクル | 2ndサイクル | 3rdサイクル | 4thサイクル | 5thサイクル | 6thサイクル | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Addr | Data | Addr | Data | Addr | Data | Addr | Data | Addr | Data | Addr | Data | ||
プログラム | Word | 555H | AAH | 2AAH | 55H | 555H | A0H | プログラム アドレス |
プログラム データ |
||||
Byte | AAAH | 555H | AAAH | ||||||||||
セクタ イレーズ |
Word | 555H | AAH | 2AAH | 55H | 555H | 80H | 555H | AAH | 2AAH | 55H | セクタ アドレス |
30H |
Byte | AAAH | 555H | AAAH | AAAH | 555H |
表2. プログラム/イレーズ時入力コマンド(JEDEC標準型コマンド方式)
バス サイズ |
1stサイクル | 2ndサイクル | 3rdサイクル | 4thサイクル | 5thサイクル | 6thサイクル | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Addr | Data | Addr | Data | Addr | Data | Addr | Data | Addr | Data | Addr | Data | ||
プログラム | Word | プログラム アドレス |
40H | プログラム アドレス |
プログラム データ |
||||||||
Byte | |||||||||||||
ブロック イレーズ |
Word | ブロック アドレス |
20H | ブロック アドレス |
D0H | ||||||||
Byte |
表3. プログラム/イレーズ時入力コマンド(CUIコマンド方式)
プログラムシーケンス実行時のタイミングチャートを下図に示します。
先に挙げたJEDEC標準型コマンド方式とCUIコマンド方式では、それぞれ入力コマンドなどに違いはありますが、基本的な流れは同じです。まず、各方式に従って、コマンドとプログラムデータのライトを行います。その後、フラッシュメモリ内部の書き込み処理が完了するまで一定の時間を要しますが、書き込みが正常に完了したことをチェックするためにステータス情報の読み込みを行います。内部処理の完了については、RY/BY#信号の状態でも確認することは可能ですが、正常にプログラム完了できなかった場合のエラー情報を確認するにはステータス情報を解析する必要があります。
図2. NOR型フラッシュメモリ プログラムシーケンス例
セクタイレーズシーケンス実行時のタイミングチャートを下図に示します。
基本的な流れは、プログラムシーケンス時と変わりません。イレーズ時も、フラッシュメモリ内部の消去処理が完了したことを確認するため、ステータス情報のチェックを行います。なお、イレーズシーケンスの最後に入力するセクタアドレスは消去対象セクタ内に含まれる任意のアドレスで構いません。NOR型フラッシュメモリのセクタ数やセクタ境界アドレスは、メモリサイズやメーカーによって異なりますので、必ずデータシート等で確認してください。
図3. NOR型フラッシュメモリ セクタイレーズシーケンス例
マイコンから外付けのNOR型フラッシュメモリに書き込みを行わず、データを読み出すだけであれば、基本的な注意点はSRAMを使用する際と全く同じになります。外部メモリ使用時に必要となるレジスタ設定(接続するエリアとデータバス幅の設定、プログラマブルウェイトの挿入設定)を最適化すればよいだけです。
フラッシュメモリのデータ書き換えをマイコンで行う場合は、前述のプログラムシーケンス、イレーズシーケンス等を実行するためのデバイスドライバが必要となります。また、ここでは一部のコマンドのみの説明となりましたが、この他にも、デバイスID取得、プログラム/イレーズの一時停止(サスペンド)、プログラム/イレーズの再開(レジューム)、メーカー独自の高速書き込み、などの多数のコマンドが存在します。開発するシステムに応じて、書き込み、消去以外のドライバ機能を実装する必要があります。
昨今の半導体不況に伴い、フラッシュメモリ業界再編に関するニュースがちらほらと聞こえてくるようになりました。既存システムで使用しているフラッシュメモリの供給停止に備え、代替品の選定を考えている方も多いのではないでしょうか。
極力ソフト変更は行わずにフラッシュメモリを交換したい場合は、以下のような点に注意して代替品の選定を行う必要があります。
また、これから新規に開発を行うシステムにフラッシュメモリを採用する予定であれば、万が一、供給停止となった場合に備えて汎用的なドライバを開発しておくことも大切です。コマンド方式の切り替えを可能とする、セクタアドレス情報をテーブル化して差し替え可能とする、などの対策をあらかじめ組み込むことで、フラッシュメモリの変更にも、ある程度柔軟に対応できるようになります。
今回は、ソフテックだより第59号の続編として、マイコンによるフラッシュメモリ制御について取り上げましたが、いかがだったでしょうか。NOR型フラッシュメモリについての説明が中心となってしまいましたが、先に挙げたSSDの普及などに伴い、NAND型フラッシュメモリの高集積化、低価格化が急速に進んでいるようです。個人的には、今後、組み込み用途向けでも、ますますNAND型フラッシュメモリを採用する事例が増えてくるのではないかと思っています(書き換え可能回数の減少、データ保持時間の短縮など品質面で気になる話もありますが・・・)。今後、機会があればNAND型フラッシュメモリについても詳しく紹介したいと思います。
なお、ここではNOR型フラッシュメモリ制御について、特定のメーカー品に関してではなく、あくまでも一般的な内容を取り上げました。実際のシステム開発、運用に際しては、対象フラッシュメモリのデータシートやマイコンのハードウェアマニュアルを熟読されることをお勧めします。
(T.S.)
関連ページへのリンク
関連するソフテックだより