HOME会社概況業務内容開発分野開発事例CANモジュールソフテックだよりお問い合わせ
HOME > ソフテックだより > 第195号(2013年10月2日発行) 技術レポート「EEPROMドライバソフト開発のノウハウ」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより(技術分野別)のページへ
ソフテックだより(シーン別)のページへ


ソフテックだより 第195号(2013年10月2日発行)

技術レポート

「EEPROMドライバソフト開発のノウハウ」

1. はじめに

私は20年近く、組み込み系システムのソフト開発に携わっています。
入社3年目の頃に、私は初めてEEPROM(IICバス接続)のドライバソフトを開発しました。
その開発をした時は、EEPROMに書き込んだデータを正しく読み込めず、書き込みの問題か読み込みの問題か切り分けができず、正しく動作させるまでに何日もかかってしまい、とても苦労しました。

最近も「EEPROMを利用するか検討している」という話を聞き、長年利用されているデバイスであるEEPROMのドライバ開発について私の経験を、今後の開発に役立てて欲しいと思い紹介します。

ローム社のホームページを見ると、EEPROMとCPUの接続には、「IICバス」、「MicroWireバス」、「SPIバス」が記載されていますが、今回は私が一番多く経験しているIICバス接続に絞って説明します。

2. EEPROMとは
2-1. EEPROMの概要

EEPROM(Electrically Erasable Programmable Read-Only Memory)は不揮発性メモリの一種で電源をOFFしても書き込んだデータが保持されます。
EEPROMは、プログラムからデータの書き込みと読み込みができるため、プログラム実行中にデータを変更し、電源をOFFしてもデータ内容を保持したい「設定」データのような保存に適しています。

名前が似ているEPROM(Erasable Programmable Read-Only Memory)もEEPROMと同じ不揮発性メモリですが、消去する時にデバイスへ強い紫外線を照射する必要があるため、プログラムからデータの書き換えはできません。

同じ不揮発性メモリであるフラッシュメモリは、セクタ単位で消去をしてから書き込みをする必要がありますが、EEPROMは1バイト単位で上書き(消去+書き込み)ができます。
このため、フラッシュメモリは「使用中セクタ」、「使用済みセクタ」、「消去中セクタ」などのメモリ状態を管理する必要がありますが、EEPROMはバイト単位で上書きができるため、「消去中」など状態の管理が不要となり状態管理が容易になります。

2-2. ハードウェア

IIC(Inter-Integrated Circuit)バスで接続されるタイプのEEPROMは8ピンしかありません。
具体的には以下の信号です。

Pin name I/O Function
Vcc - 電源を接続してください
GND - 全入出力の基準電圧、0[V]
A0,A1,A2 I スレーブアドレスの設定端子
SCL I シリアルクロック入力
SDA I/O スレーブ及びワードアドレス
シリアルデータ入力・シリアルデータ出力
WP I ライトプロテクト端子

表1. EEPROMの端子説明(ローム社BR24C32データシートより)

EEPROMは物理的に小さく、通信を利用することにより、ピン数が少ない小さなCPUと接続をすることができるため、基板面積が小さなシステムにでもデータの記憶デバイスとして利用することができます。

2-3. システムでEEPROMを利用する場合に考慮すべきこと

EEPROMをシステムで利用する場合に考慮しなければならないことは以下の2点です。

2-3-1. 書き込み回数に制限がある

私が初めてEEPROMを利用したシステム開発をした時は、同じアドレスに書き込みができる回数の上限が1万回程度でした。
しかし、最近のEEPROMは100万回の書き換えが可能です。

100万回と聞くと多いようにも思えますが、例えば1秒周期でデータを書き換えた場合は100万秒(約11.6日)で上限に達してしまいます。
EEPROMへ書き込む頻度を減らし、データを書き込むアドレスを分散させるなどの工夫をして、100万回の書き換えでもシステムに問題が無いように設計しなければなりません。

2-3-2. 書き込みが遅い

EEPROMへデータを1バイト書き込むためにはデータシートの最大値で5msかかります。
もし、ドライバソフトがデータの書き込み完了を待つ作りにすると、CPUの性能を十分に発揮できなくなります。
しかし、EEPROMの書き込み中に他の処理をするようにドライバソフトを工夫して開発すると、CPUの性能は発揮できますがドライバソフトの処理が複雑になり,
書き込み異常の判定などで問題が発生する可能性があります。

必要なシステムのパフォーマンスを検討して、適切なドライバソフト設計をして利用する必要があります。

3. EEPROMドライバの開発

IIC接続タイプのEEPROMドライバソフトについて以降で説明します。

3-1. ソフトウェア構成

ドライバは、EEPROMの状態と通信コマンドを管理する部分とIIC通信部分の2つで構成します。

EEPROMドライバソフト構成
図1. EEPROMドライバソフト構成

3-1-1. EEPROMドライバ

アプリケーションプログラムからデータの読み書きをするために、Read関数とWrite関数を準備する必要があります。

アプリケーションプログラムでデータを保存する場合は、EEPROMドライバのWrite関数にEEPROMへ書き込むアドレスとデータを渡す(図1の①)と、Write関数がIIC通信ドライバを使ってEEPROMと通信(図1の③)をしてデータを書き込みます。
アプリケーションプログラムでデータを読み出す場合は、EEPROMドライバのRead関数に読み込むアドレスを渡すと、Read関数がIIC通信ドライバを使ってEEPROMと通信(図1の⑥)をしてデータを読み込みます。
読み込んだデータはアプリケーションに渡されます(図1の④)。

EEPROMドライバ内では、アプリケーションからのRead/Writeの要求に応じて、IIC通信のためのコマンドを作成しIIC通信ドライバで送受信します。
通信コマンドはEEPROMの容量によってアドレス設定など若干違う部分があるため、ドライバを流用する場合でも、データシートを必ず確認してください。

EEPROMへ書き込むデータはIIC通信を利用しますが、IIC通信ではサムチェックやCRCチェックのような通信データを補償する仕組みがありません。
このため、EEPROMへ送ったデータがノイズにより壊れてしまう可能性があります。

EEPROMへ格納されるデータの信頼性を上げるため、EEPROMへ書き込んだデータを読み込んで一致しているかチェックする仕組みをドライバに持たせる必要があります。
また、アプリケーション側でデータにサム値を持たせて、書き込んだデータと一緒に保存することにより、更にデータの信頼性を上げることができます。

EEPROMドライバでは、以上のようなデータの信頼性向上の対策を考慮する必要があります。

3-1-2. IIC通信ドライバ

EEPROMドライバは、このIIC通信ドライバを経由して、EEPROMと通信をします。
IIC通信ドライバは通信をすることが役割ですがEEPROMと組み合わせて利用する場合は、ACK応答の確認をできる必要があります。

EEPROMが書き込み中は、IIC通信でコマンドを送信してもEEPROMからACK応答がありません。
これを利用して、EEPROMの書き込み中状態の判断ができます。

実際にACK応答を利用して書き込み時間を計測するとデータシートに記載されている最大時間の5ms以下になります。
しかし、経験的には長期運用していると書き込み時間が長くなり、その考慮がされていない場合は、出荷から数年が経過してから問題が表面化する可能性があります。
開発時には、書き込み時間を最大にできる機能をドライバソフトに入れて、動作確認することにより問題を回避することができます。

IIC通信についてはソフテックだより第79号「I/Oポートを使用したIICバス通信の実現方法について」およびソフテックだより第113号「IICバス通信ドライバのデバッグ」にも記載していますので参考にしてください。

3-2. デバック方法

EEPROMドライバをデバックするときは、アプリケーションプログラムからWrite関数でデータを書き込み、Read関数で書き込んだデータが読み込めることを確認します。

ドライバが完成し、一発で動作すれば良いのですが、正しく動作しない場合はデバックが必要です。
EEPROMドライバのデバックで難しいのは、書き込みに失敗しているのか、読み込みに失敗しているのか分からないため、試行錯誤でデバックを進めても時間の無駄となります。
この状況になった時は、オシロスコープを利用して図2のようなIIC通信の波形を確認し、データシートに記載されている特性の範囲内であることを、1つ1つ確認する地道な確認の積み重ね必要です。

IIC通信の波形
図2. IIC通信の波形

もし、一発で動作した場合でも、デバイスの個体差で動作している場合もあります。
図3のSCL_D(クロックのデジタル波形)とSCL_A(クロックのアナログ波形)は同じ信号ですが、アナログで波形を確認すると鈍りがあることが分かります。
この信号の鈍りが影響する場合もあるため、オシロスコープを利用して特性の範囲内であることを確認する必要があります。

IIC通信の拡大波形
図3. IIC通信の拡大波形

3-3. アプリケーションソフト

EEPROMを利用するシステムでは、アプリケーションプログラム側でデータ内容について考慮する必要があります。
例えば、EEPROMを基板に実装して初めて電源を入れた場合はEEPROMの内容は不定値ですが、そのような場合もアプリケーションプログラムが正しく動作するように考慮しなければなりません。

対策としてEEPROMへ保存するデータにサム値を付加し、サム異常が発生した場合はデフォルト値にデータを書き換える仕組みを入れることで、不定値を読み込んでアプリケーションが想定外の動作をすることが無くなります。

また、特定の文字列をEEPROMに格納することにより、起動時に文字列を認識できない場合はEEPROMを初期化するという方法でも対応できます。

ドライバを利用するアプリケーションソフトでも上記のような対策を考慮することでシステムの信頼性を向上させることができます。

4. 終わりに

ドライバソフトは制御対象デバイスのデータシートを読み、ロジックアナライザなどの測定器を利用して動作確認をする技術があれば開発することができます。

しかし、経験によって得るノウハウがあり、そのノウハウにより「データの信頼性向上」や「性能向上」をして、より良いソフトを作ることができます。

今回はEEPROMドライバソフト開発のノウハウを中心に説明させていただきましたが、良いソフト開発をする参考にしていただければと思います。

(T.0.)

[参考資料]
BR24C32データシート
(ROHM社)
BR24L64データシート
(ROHM社)

関連ページへのリンク

関連するソフテックだより