「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
パソコンを利用したシステムでは、設定値やログの保存を容易に実現出来ます。
しかし、マイコンを利用したシステムでは、電源を落としてもデータが消えないデバイスをハード的に準備する必要があります。
デバイスは、保存するデータ量や基板のサイズ、採用するマイコンの性能や周辺機能によって検討することになります。
例えば、SDカードやCF(Compact Flash)のように、基板から脱着できる記憶デバイスを選択することも出来ますし、EEPROMやフラッシュメモリのようなICを基板に実装して利用する方法も選択可能です。
近年、私が扱うことが多いデータ保存用のデバイスとして、シリアルフラッシュメモリ(Serial Flash memory)があります。
シリアルフラッシュメモリは、最近のマイコンでサポートされているSPI(Serial Peripheral Interface)通信で接続が可能なICです。
ICのデータシートは英語で提供されていることが多く、初めてシリアルフラッシュメモリを扱う人は内容を把握するまで苦労すると思います。
今回は、シリアルフラッシュメモリのデータシートを読む前の予備知識となる情報を紹介します。
シリアルフラッシュメモリの説明をする前に、少しだけ記憶デバイスの説明をします。
ここでの記憶デバイスとは、電源を落としてもデータを保持するデバイスです。
時代とともに変化はありますが、現状は大きく分類すると、EEPROMとフラッシュメモリがあり、フラッシュメモリはNAND型とNOR型に分類されます。
概要を以下に説明します。
今から25年ほど前になりますが、私が初めて利用した記憶デバイスは、マイコンとIIC(I2C)バスで接続したEEPROMです。
EEPROMは、現在でも利用する機会があるデバイスです。
EEPROMは1バイト単位で読み書きが可能なデバイスです。
フラッシュメモリの場合は、「消去」をしなければ、データの書き込み(上書き)が出来ませんが、EEPROMの場合は、書き込み時に消去もしてくれるため、データの消去を意識せずに上書きが可能です。
ソフト開発の目線で見ると、データの上書きが出来るため、消去済みエリアの管理が不要となり、利用しやすいデバイスです。ただ、書き込み時に消去を実施していることから、データの書き込みに時間がかかります。
耳にすることが多いデバイスですが、大きくは2つの種類に分類されます。
1つは、パソコンのSSDなどで利用される大容量で安価なNAND型フラッシュメモリです。
もう1つは、マイコンで利用されることが多いNOR型フラッシュメモリです。
ソフト視点での大きな違いは、NAND型フラッシュメモリはブロック単位でデータにアクセスし、NOR型フラッシュメモリでは1バイト単位でデータにアクセスできる点です。
今回はNOR型フラッシュメモリに絞って説明をします。
フラッシュメモリの場合は、EEPROMのようにデータの上書きはできません。
書き込む前に「消去」という操作が必要になります。
「消去操作」すると、消去対象のデータはFFHになります。
消去操作はビットに電気を充電してビットを0から1にするイメージです。
書き込み操作は、必要なビットの電気を抜いて1から0にイメージです。
FFHのデータに55Hのデータを書き込むと55Hを構成する0になっているビットの電気を抜くことになるので、論理演算のANDと同じ考えをすることができます。
例えば、このケースの場合はFFH AND 55H =55Hとなります。
もし、55Hのデータを消去せずにAFHを上書きすると55H AND AFH =05Hとなります。
ログのようなデータを扱う場合は、利用しているエリア、消去済みのエリアをソフトで管理し、データの上書きが発生しないように制御する必要があります。
記録デバイスの概要を説明しましたが、これらの記憶デバイスをマイコンと接続する方法も様々あるので概要を説明します。
シリアル通信を利用した規格です。
クロック線と送受信可能なデータ線の2本で実現が可能です。
IICバスは記憶デバイス以外にも多くのデバイスのインターフェースとして利用されています。
私が初めて利用した時は、マイコン側でサポートしていなかったため、汎用ポートをON/OFFしてクロックを生成して通信をしたことがありますが、現在は多くのマイコンでサポートしています。
シリアル通信を利用した規格です。
クロック線、送信線、受信線、チップセレクト線で構成されます。
SPI通信はDSPI(Dual SPI)やQSPI(Quad SPI)のように拡張した規格も存在します。
通常のSPI通信で1バイトのデータを読む場合は、「1本のデータライン×8クロック」で読み込みます。
DSPIの場合は「2本のデータライン×4クロック」でデータを読み込みます。
QSPIの場合は「4本のデータライン×2クロック」でデータを読み込みます。
利用するデータ線が増えますが、それだけ短い時間でアクセスが可能となります。
マイコンのバス(データバス、アドレスバス、制御線)にフラッシュメモリを接続します。
最近のマイコンはペリフェラルの1つとしてフラッシュメモリが準備されており、プログラムの格納用として利用します。
CPUの外部バスにフラッシュメモリを接続して利用することも出来ます。
NOR型フラッシュメモリをCPUバス接続した制御方法については、ソフテックだより第91号「マイコンによるNOR型フラッシュメモリ」でも紹介しているので参考にしてください。
ここまで記憶デバイスとインターフェースについて説明をしてきました。
説明した「NOR型フラッシュメモリ」と「SPI通信」を組み合わせた製品にシリアルフラッシュメモリと呼ばれる製品があります。
設定値やログの保存用に利用する機会が多いデバイスのため掘り下げて紹介します。
シリアルフラッシュメモリはEEPROMより、容量が大きい製品があり、SPI通信を利用することでIICバスより高速に通信をすることが可能です。
マイコンとの接続例を以下に示します。
以下は送信線と受信線が1本ずつ(シングルSPI)の構成です。
図1. シングルSPI通信用接続
表1. シングルSPI 信号説明
信号名 | 信号内容 |
---|---|
チップセレクト | Serial Flashの動作を有効にします ノイズによる誤動作を考慮してアクセスしない場合は無効状態にしておきます。 |
クロック | SPIの同期通信用クロックです。 条件によって100MHzで動作するデバイスもあります。 |
SI | シリアルフラッシュメモリにとってのシリアル受信線です。 |
SO | シリアルフラッシュメモリにとってのシリアル送信線です。 |
以下はQSPI通信の場合の構成です。
シングルSPIと互換があります。
Serial Flashの初期化をする時はシングルSPIで通信をします。
QSPIを有効にする場合は、Serial Flashの設定レジスタで設定します。
図2. QSPI通信用接続
表2. QSPI 信号説明
信号名 | 信号内容 |
---|---|
チップセレクト | Serial Flashの動作を有効にします ノイズによる誤動作を考慮してアクセスしない場合は無効状態にしておきます。 |
クロック | SPIの同期通信用クロックです。 条件によって100MHzで動作するデバイスもあります。 |
IO0 | シングルSPI時はシリアルフラッシュメモリにとってのシリアル受信線です。 |
IO1 | シングルSPI時はシリアルフラッシュメモリにとってのシリアル送信線です。 QSPI時はデータの送信および受信で利用します。 |
IO2 | シングルSPI時は利用しません。 |
IO4 | シングルSPI時は利用しません。 QSPI時はデータの送信および受信で利用します。 |
SPI通信のコマンドは、「コマンド、アドレス、データ」で構成されています。
しかし、詳細はデバイスメーカーによって違います。
図3. SPI通信データ構成
ポイントは2つあります。
1つめはコマンドです。
基本的な読み込みや書き込みコマンドは共通していますが、シリアルフラッシュメモリの設定書き込みなどはデバイスメーカーごとに違います。
また、メーカー独自の機能を具備している場合は、新しいコマンドとなります。
2つめのポイントは、QSPIの使い方です。
コマンド、アドレス、データの全てをQSPIで通信するデバイスもあれば、コマンドとアドレスはシングルSPIを利用し、データ部分だけQSPIを利用するデバイスもあります。
複数種類のシリアルフラッシュメモリに対応する場合は、コマンドとSPIのパターンの組み合わせをデータシートで確認し開発する必要があります。
なお、デバイスIDは共通コマンドで取得できるため、デバイスを認識することは可能です。
基本制御はリード、プログラム、イレーズです。
リードはデータ読み込み、プログラムはデータ書き込み、イレーズは消去を実行します。
ここでもポイントを2つ説明します。
1つめのポイントは、フラッシュメモリは、データの上書きが出来ない点です。
よって、データを書き込む前にイレーズが必要になります。
また、このイレーズも1バイト単位では出来ません。
最小の消去単位は「ブロック」や「セクター」と呼ばれる単位です。
デバイスによってサイズは違いますが、4kByteや64kByteの製品があります。
例えば、保存している設定値を1バイトだけ変更したい場合でも1セクタ(64kByte)のデータを消去し、改めて変更していないデータも含めて書き込む必要があります。
2つめのポイントは、データ消去中またはデータ書き込み中にシリアルフラッシュメモリへ格納されているデータにアクセス出来ない点です。
例えばシリアルフラッシュメモリにログを保存するシステムの場合、ログの容量が上限に達すると古いログを消去する必要があります。
このタイミングで、シリアルフラッシュメモリのデータを参照することが出来なくなります。
そこで、シリアルフラッシュメモリは消去中断/再開、書き込み中断/再開のコマンドを準備しています。
システムを設計する際には、「消去が終わってから書き込む」か「消去を中断して書き込み、消去を再開する」という選択が必要です。
同じハードウェアを利用しても、製品の操作性やパフォーマンスに影響が出る部分でもあるので、データシートを読み、時間の設計をする必要があります。
シリアルフラッシュメモリのデバイスドライバプログラムを作った経験から、シリアルフラッシュメモリを利用する時のポイントを紹介しました。
記録デバイスを利用することで、設定値や履歴を保存することが可能となり、製品としての付加価値が向上します。
一方、本文でも触れましたが、デバイスの機能や性能を理解して設計をしなければ、製品の操作性や性能に大きく影響を与えます。
今回、紹介した情報が、より良い製品開発に、お役に立てれば幸いです。
(T.O.)
関連ページへのリンク
関連するソフテックだより