【I2C、SPI通信も解説】シリアルEEPROMの使い方 | アナデジ太郎の回路設計

【I2C、SPI通信も解説】シリアルEEPROMの使い方

EEPROM一覧 回路設計

この記事で分かること

・シリアルEEPROMの種類と各メーカーのラインナップ
・各I/F方式(Microwire、I2C、SPI)におけるシリアルEEPROMの使い方
・マイコンとシリアルEEPROMとの接続

EEPROMは電源をオフしてもデータが消えない比較的低容量のメモリとして、
マイコン等に内蔵され、設定情報の保存などに利用されています。

しかし、内蔵EEPROMは容量が小さい(※)ことから、メモリを増設したい際は、
接続する信号線の数が少ないシリアルEEPROMが用いられます。
 ※PICマイコンの内蔵EEPROMの多くはメモリ容量が256バイト程度

本記事ではシリアルEEPROMの種類とラインナップを紹介し、
各I/F方式(Microwire、I2C、SPI)における使い方について解説します。

本記事はシリアルEEPROMの使用方法を参考程度に紹介するものであり、
解説するICの機能や回路の動作を保証するものではありません。

ここで紹介する方法が適切で無い場合がある為、
使用の際は、デバイスのデータシートを必ず確認の上、
記事にある回路の利用については自己責任でお願いします。

EEPROMとは

EEPROMはElectrically Erasable Programmable Read Only Memoryの略で、
電気的に消去可能なリード・オンリー・メモリです。
E2PROM(イースケア・ピーロム)と呼ばれることもあります。

リード ・オンリーとは言っても書込み可能です。
昔のROMは一度書込むと消去や再書込みができませんでしたが、
紫外線で消去できるタイプ(EPROMやUV-EPROMと呼ぶ)や、
EEPROMのように高電圧(※)で消去できるようになりました。
 ※内部のチャージポンプ回路により電源電圧Vcc(1.8~5.5V)を15~20Vに昇圧する

このため、現在のROMは電源オフでもデータが消えない不揮発性メモリを指し、
データが消える揮発性メモリのRAM(※)と区別されています。

 ※Random Access Memory(ランダム・アクセス・メモリ)
  データの書換えを任意の部分(アドレス)だけ行うことができるメモリ
  ROMの場合は書き換え前に一定領域を消去する必要がある。

ROMの初期状態は全データが1となっており、0に書き込むことはできますが、
0を1に書き直すことはできないので、1に戻すには消去処理が必要となります。

従って、保存したデータを変更するには、一度消去してから書込みしなくてはなりません。

EEPROMとフラッシュメモリの違い

ROMにはEEPROM以外にフラッシュメモリ(フラッシュROM)があります。
フラッシュメモリは複数バイトから構成されるブロック単位で消去されるため、
1バイトだけデータを変更したい場合でも、ブロック単位で消去してから書き換えます。

このブロック単位ですが、フラッシュメモリの殆どは512バイト(4kbit)以上と、
一般的に市販されている低容量EEPROMの全メモリ容量よりも大きいです。

これに対し、EEPROMは1バイトごとに消去できます。
また、消去と書込み回数の上限についても、フラシュメモリが多くても10万回程度に対し、
EEPROMは100万回と多いです。

このように使い勝手はEEPROMの方が良いのですが、大量のデータを書き換える際は
一度にまとめて消去できるフラッシュメモリの方が書換え時間は早く、
メモリの構造上、1bitあたりの価格もフラッシュメモリの方が安い
です。

以上の特徴から、プログラム等のようにデータ量が多く、
消去や変更をまとまった単位で行う場合はフラッシュメモリを使用し、
ICの設定情報などの小さなデータを扱う場合にはEEPROMが適しています。

シリアルEEPROMとパラレルEEPROM

シリアルEEPROMは外部インターフェース(I/F)にシリアル通信を使用したメモリで、
データ信号を1本(送信と受信を分けた場合は2本)で行い、
ホスト(マイコン等)側から出力されるクロック信号に同期して、データを順次転送します。

クロック信号を使用せず、データ信号8本を使い1バイト(8bit)データを同時に転送することで、
高速処理が可能なパラレルEEPROMもありますが、
シリアルEEPROMの伝送速度は数Mbpsと高速化しており、
EEPROMと言えば、信号線の数が少なくて済むシリアルEEPROMが大半を占めています。

シリアルEEPROM一覧表

主要メーカーの一覧表を示します。
EEPROMで使用されるシリアルI/Fの主な規格は、Microwire、I2C、SPIの3つですが、
これ以外にもアナログ・デバイゼスの1-Wire(ワン・ワイヤ)等もあります。

各メーカーともピン数は8ピンが多く、同じシリアルI/Fならピン配置も基本的には同じですが、
電源電圧が違ったり、メーカー固有の機能を持つことがあるため、置換えの際は注意が必要です。

EEPROM一覧表



シリアルI/Fの種類

シリアルI/Fのデータ転送速度は基本的にクロック周波数が高い程、早くなりますが、
書込み処理はデータ転送後に行うので、転送速度に関係無く、書込みには数ms程度かかります。

また、どのI/Fでも複数個のEEPROMを接続できますが、
シリアルEEPROMはメモリ容量が大きくなっても部品サイズ(ピン数)は同じなので、
マイコンに接続するEEPROMは1個で済ませる場合が多いです。

Microwire

シリアルEEPROMのI/Fとして最初に登場した方式で、信号線の数から3-Wireとも呼ばれます。

Microwire対応EEPROMとマイコンとの接続回路

信号線は、クロック信号CLK(別名SK)と、
データ入力及び出力信号が、それぞれ、DI(データ入力)DO(データ出力)
複数のEEPROMを接続時の選択信号CS(チップ・セレクト)も加えた4本ですが、
図の様にDIとDO間に抵抗(数kΩ程度)を接続することで、信号線を3本に減らせます。

抵抗を設けることで、マイコンからの出力とEEPROMからの出力が衝突した場合、
マイコンからの出力が優先的にEEPROMのDIピンに入力されます。

Microwire対応EEPROMの複数接続

電源投入時やリセット時にマイコンの出力が初期状態である入力モードになることで、
EEPROMへの信号が不安定になり誤動作するのを防止するため、
チップセレクト信号(CS)をプルダウンすることでL(EEPROM未選択状態)にします。

転送データサイズはEEPROMの種類によって8bit又は16bitとなっており、
両方に対応できるタイプもあります。
(詳細は後述)

クロック速度は2MHzか3MHzが多く、メモリ容量は16kbitまでと低容量です。
同じ4線式のSPIの方が5~20MHzと早く、メモリ容量も1Mbit以上の製品もあることから、
Microwire対応のEEPROMは減っています。

しかし、USBシリアル変換IC(FTDI製FT232HやFT2232Hなど)では
ICの設定情報の保存にMicrowire対応EEPROMを3線接続で行う必要があります。

FTDI製USBシリアル変換ICについては下記記事で解説しています。 

Microwire対応のEEPROMの型名ですが、
オリジナルはナショナルセミコンダクタ(※)のNM93Cシリーズであったことから、
マイクロチップの93AAや93LCなど、型名に93が入っているものが多いです。
 ※以下、ナショセミと記す。テキサスインスツルメンツに吸収され、NM93Cは廃止品となっています。

I2C

2番目に登場したI2C(Inter Integrated Circuit)は、
アイ・アイ・シー、アイ・スクエアド・シー、アイ・ツー・シー等と呼ばれており、
信号線の数から2-Wireとも呼ばれます。

信号線は、クロック信号のSCL(シリアル・クロック)
データ信号は入出力共用となるSDA(シリアル・データ)の2本です。

I2C対応EEPROMとマイコンとの接続回路(I2C専用信号使用時)

MicrowireやSPIと異なり、チップセレクト信号がありません。
このため、複数個を接続する場合は、
EEPROMにあるアドレスピン(A0~A2)で自分のアドレス(デバイスアドレス)を設定し、
マイコンからの送信命令内にあるアドレスビットで、どのEEPROMかを指定します。

I2C対応EEPROMの複数接続

アドレスピンはメモリ容量によって数が少なかったり、アドレスピンが無いタイプもあります。
アドレスピンが3つあるタイプは8個まで接続できますが、
I2C信号ラインの静電容量を400pF以内にするという制約があります。

I2Cの各信号はオープンドレイン(※)出力なので、プルアップ抵抗(10kΩ程度)が必要です。
これにより、複数接続した場合、どれか1つでもオン(Lレベル)を出力すれば、
他がオフ(Hレベル)でも、信号はLレベルとなります。(これをワイヤードANDと呼ぶ)

 ※内部回路のCMOS FETのドレイン端子がそのまま出力ピンに接続されており、
  原理としてはTTL ICのオープンコレクタ出力と同じで、自らは電圧を出力せず、
  出力ピンをプルアップすることで、出力がオンすると内部でGNDに接続されてLレベルになり、
  オフで出力ピンが何も繋がっていない状態(ハイ・インピーダンス)となることで、
  プルアップされた電圧に上昇しHレベルになります。プルアップについては下記記事で解説しています。

多くのマイコンはI2C専用信号が用意されていますが、
汎用入出力信号(GPIO)を使用する場合は、図の様に直列抵抗(470~1k)を接続します。

I2C対応EEPROMとマイコンとの接続回路(GPIO使用時)

抵抗を設ける理由は、オープンドレイン出力でないと、
マイコン側とEEPROM側で異なる出力(HとLレベル)をした場合、
出力同士で短絡状態になるからです。

データ転送は1バイト(8bit)単位で行われ、読み書きするデータサイズも1バイトです。
アドレスについては高メモリ容量タイプでは、8bitから16bitに拡張されますが、
上位バイト、下位バイトにわけて1バイトづつ転送されます。
(詳細は後述)

クロック速度は400kHzか1MHzが多く、SPIに比べ低速ですが、
信号線が2本と少なく扱いやすいことから、各メーカーでの種類も豊富です。

I2C対応のEEPROMの型名ですが、オリジナルはナショセミのNM24Cシリーズであったことから、
マイクロチップの24AAや24LCなど、型名に24が入っているものが多いです。

SPI

最後に登場したSPI(Serial Peripheral Interface)はMicrowireと同じ4線式ですが、
クロック速度は5~20MHzとシリアルI/F方式の中で最も高速です。

信号線はクロック信号のSCK(シリアル・クロック)
データ入力及び出力信号が、SI(シリアル・データ入力)SO(シリアル・データ出力)
複数のEEPROMから指定するための選択信号CS(チップセレクト)も加えた4本ですが、
CS信号はMircowireは正論理(Hで選択)に対し、SPIは負論理(Lで選択)となっています。

転送データサイズは8 bitですが、アドレスについては、
メモリ容量増加に従って、8bitから16bitや24bitに拡張されます。

SPI対応のEEPROMの型名については、ナショセミがNM25Cであったことから、
マイクロチップの25AAや25LCなど、25が入っているものが多いですが、STマイクロはM95です。

1-Wire(ワン・ワイヤ)

アナログデバイセズ(※)(以下、アナデバと記す)が登録商標している1線式のシリアルI/F方式です。
 ※本方式を開発したのはダラスセミコンダクタでしたが、マキシムに買収され、
  その後、マキシムがアナデバに買収されています。

1-Wire対応EEPROMの複数接続

似たような1線式にマイクロチップ社のSingle Wire Interface(SWI)がありますが、
伝送形式が異なります。 

以下、ここで登場する1-Wire関連デバイス(DS24xx)は全てアナデバ製です。

各デバイスは工場出荷時に書き込まれた64bitのID(識別番号)を持ち、
このIDを送信データ内で指定することで、複数台接続された中で特定の相手を選択できます。
 
また、この方式は信号線から電源を供給するため、EEPROMに電源ピンがありません。
 (一部機種には別途電源供給端子がある)

通信速度はスタンダードモードで16kbps、オーバードライブモードでも142kbpsと低速ですが、
通信距離が長い(スタンダードモードで最長500m)ことから温度センサ等にも利用されています。

I2Cと同じオープンドレイン出力となっているので、プルアップ抵抗が必要で、
抵抗値についてはデータシートに記載された電気的仕様(※)を満足するように選定します。
 
 ※H/L入力レベル電圧(VIH,VIL)や、LレベルからHレベルになるまでの立上り時間Tpup等の条件を満たす必要があり、
  DS2431の場合、300Ω~2.2kΩの範囲で選定する。

1-Wire方式のEEPROMですが、通信速度が低速であることから低容量メモリが多く、
ここで紹介するDS2431も1kbitですが、小型トランジスタと同じリード3本のTO-92と小さいです。
(SOPタイプもあり)

1-Wire対応EEPROM DS2431外観

1-Wire方式はI2CやSPIに比べ、対応しているマイコンが少なく、
汎用入出力(GPIO)を使用できますが、高速処理(usレベル)が必要になる場合もあることから、
他のI/Fへの変換ICを経由させる方法があります。

DS2480によるUART~1-Wire通信変換

DS2480BはUARTから1-Wireに変換するICで、
一般的なマイコンにあるUARTポートを用いて、1-Wire方式のEEPROMと接続できます。
また、I2Cからの変換を行うDS2482-100もあります。

DS2482-100によるI2C~1-Wire通信変換



Microwire対応EEPROMの使い方

読み出し&書込みデータのサイズは、I2CやSPIは8bitですが、
Microwireは8bit(1バイト)、又は16bit(1ワード)となっており、
どちらに対応しているかはEEPROMの種類によって異なります。

マイクロチップの1k(=1024) bitメモリ93AA46の場合、以下のラインナップとなっています。
 93AA46A:8bitデータ(128アドレス×8bit=1024bit)アドレスを7bitで表現(0~127)
 93AA46B:16bitデータ(64アドレス×16bit=1024bit)アドレスを6bitで表現(0~63)
 93AA46C :8bit/16bitデータを選択可能(ORGピンで設定)

<パッケージ>
基本的には8ピンですが、ピン配置が回転したタイプもあるので注意して下さい。

Microwire対応EEPROMピン配置

<各ピンの説明> (電源ピンVccと、GNDピンVssは省略)
CS(チップセレクト入力)
 EEPROMを選択状態に設定します。
  Lレベル:EEPROMは非選択状態 出力(DO)はハイ・インピーダンスとなります。
  Hレベル:EEPROMを選択状態

SK(シリアルクロック入力)※メーカーによっては信号名CLK
 シリアルデータ(DI,DO)の入出力タイミングを設定します。
 データの入出力はクロックの立上り時に行われます。

DI(データ入力)
 SKの立上りタイミングで、データが入力されます。

DO(データ出力)
 SKの立上りタイミングで、データが出力されます。

ORG(オーガナイゼーション(構成)入力)
 メモリ構成(8bit/16bit)が選択可能なEEPROMのみにあるピンで、それ以外はNCピンです。
 入力レベルに応じてデータのメモリ構成が選択されます。
  Hレベル:16bitを選択
  Lレベル:8bitを選択

<命令の形式と種類>
EEPROMのデータ読み書きはDIに入力される命令によって行われます。
命令をDIに入力する際は、CSをH(選択状態)にしてから行い、
命令の入力が終わったら、CSをL(未選択状態)に戻します。

Microwire対応EEPROM命令一覧

各命令の最初はスタートビット(1)から始め、
次に命令の種類を示す2bitのオペコードが続き、その後にアドレスとなります。
アドレスのbit数はメモリ容量によって変わります。

WRITE等の書込み命令の場合、書込むデータ(8bit又は16bit)がその後に加わります。

命令は7種類ありますが、基本的には以下の4つが使用されます。

・EWDS(イレース/ライト・ディセーブル:消去と書込み禁止)
 消去や書込みを禁止し、READ命令だけ可能となります。
 これによって、データが誤って消去や変更されることを防止できるため、
 WRITE命令後や電源オフ前に本命令を実行することが望ましいです。

 また、電源オン時は消去や書込みが禁止状態で立ち上がるため、
 書込み命令の前に本命令で許可する必要があります。

Microwire対応EEPROMのEWDS及びEWEN命令

・EWEN(イレース/ライト・イネーブル:消去と書込み許可)
 EWDS命令で禁止された消去や書込みを許可します。
 一度許可すると、EWDS命令か、電源オフまで許可状態となります。

・WRITE(書込み)
 指定したアドレスへのデータ書込みを行います。
 書き込み前に消去も行うので、WRITE命令の前にERASE命令を行う必要はありません。

Microwire対応EEPROMのWRITE命令

 メモリへの書込み処理はWRITE命令を入力後、CSを一度Lにすることで開始されます。
 必要なL期間(tcs)はデータシートに記載されています。

 CSをHに戻した後、DOがLなら書込み中のBUSY(ビジー)状態で、
 Hになったら書込み完了のREADY(レディ)状態であることが分かります。

 書込みが完了するまでは、DIをLに固定しておきます。
 メーカーによっては、SKもLに停止させておく必要があるEEPROMもあります。
 
・READ(読出し)
 指定したアドレスに保存されているデータの読出しを行います。
 DIにREAD命令を入力すると、DOからダミービット(0)の後に
 MSB(最上位bit)から順に出力されます。

Microwire対応EEPROMのREAD命令

 出力後もCSをHのままにすると、指定アドレスが+1され、
 そのアドレスにあるデータが続けて出力されます。
 (出力データ間にダミービットは入らない)

 CSがHレベルの間、カントアップしたアドレスにあるデータが継続して出力されます。
 (アドレスが最大値に達したら、0に戻る)
 CSをLにすることで読出し処理は終了します。

 読出し処理中にCSをLにすると処理が中止され、
 次にCSをHにした時は、リセット状態となっており、新たな命令を入力できます。



I2C対応EEPROMの使い方

I2Cは送信と受信を1本の信号線(SDA)で行うため、同時に送受信できません。

I2C通信におけるSDA信号回線

このため、IC2対応デバイスは図に示すようにSDAピンが内部で、
送信回路の出力と受信回路の入力が共通となっていますが、
出力はオープンドレインなので、送信時以外は出力オフとなり、
SDA信号とは接続されていないハイ・インピーダンス(Hi-z)状態になります。

つまり、送信時以外は出力がSDA信号から切り離され、入力のみが有効になります。
SDA信号線は外部でプルアップされているので、
他に接続されているデバイスの出力がオンしていなければHレベルになります。

I2C対応EEPROMのピン配置

<各ピンの説明>(電源ピンVccと、GNDピンVssは省略)
SCL(シリアル・クロック入力)
 マスタ(マイコン等)からのクロック信号を入力します。 
 SCL=H時にマスタでSDAを立下り/立上りさせることで、
 EEPROMは通信の開始/終了を認識します。
 (スタート及びストップ・コンディションの詳細は後述)

SDA(シリアル・データ入出力)
 データの入力や出力を行います。
 データを変化させる際はSCL=L時に行う必要があります。

A0、A1、A2(デバイスアドレス入力)
 複数のEEPROMを接続した場合、マスタが通信先を指定するための
 デバイスアドレスを設定します。

 各EEPROMが異なるデバイスアドレスになるように各ピンをVcc又はGNDに接続します。
 詳細は後述する「送信先の設定」を参照。

WP(ライトプロテクト入力)
 このピンはメーカーによって名称が異なり、本ピンが無いEEPROMもあります。
 本ピンがある場合は、Vccに接続すると書込み禁止状態になり、
 GNDに接続すると書込みが許可されます。

 本ピンはオープンでも、EEPROM内部でGNDにプルダウンされているため、書込み許可ですが、
 誤動作防止のため、GND接続を推奨するメーカーもあります。

<I2C通信の開始と終了>
マスタからEEPROMに対し、書込みや読出し処理を行うための命令は、
スタート・コンディション(以下、スタートC)から始まり、
ストップ・コンディション(以下、ストップC)で終了します。

スタートCとストップCは、クロック信号SCL=H時に
データ信号SDAの立上り又は立下りで識別します。
    SCL=H時 SDA立下り スタートC
           SDA立上り ストップC

I2C対応EEPRPMのスタートコンディションとストップコンディション

スタートCとストップC間でのデータ通信は8bit単位で行い、
送信側はデータを送信したら、受信側からの肯定応答(ACK )を待ちます。
 ※ACKnowledgement(アクノリッジメント):受信成功通知。アクノリッジやアックとも呼ぶ。

I2C通信でのACKは、図の様に8bitデータを受信したら、
9bit目のクロックに同期して出力をオン(Lレベル)にすることで行います。

<送信先の設定>
スタートCの後に続く、8bitのコントロールバイトは、
命令の種類や相手先を指定するもので、以下の構成となっています。

I2C対応EEPRPMのコントロールバイトとACK

 コントロールバイトの内訳(各ビットの名称はメーカーによって異なる)
  4bit:デバイスコード・・・デバイスの種類によって異なり、EEPROMは1010となる。
  3bit:デバイスアドレス(A2,A1,A0)(※)
  1bit:命令の種類(R/W)・・・1:読出し(READ)、0:書込み(WRITE)

I2C対応EEPROMコントールバイトとアドレスバイトの内部構成

※デバイスアドレスについて
 デバイスアドレスピンが無いEEPROMもあり、その場合の3bitをどうするかについては、
 0でも1でも良い(ドントケア)や、0にする必要がある等、メーカーによって異なります。
 (デバイスアドレスピンが無いタイプは複数台接続できません)

 また、デバイスアドレスピンがあるタイプでも、
 メモリ容量4kbit~16kbitのEEPROMではデバイスアドレスピンの数を減らし、
 その空いた分(bit)をメモリアドレス用のビットに割付られています。

 例えば、メモリ容量4k(=4096)bitだと、1つのアドレスに入るデータは8bitなので、
 4096bit=512×8bitから、必要なメモリアドレスの数が512個となり、
 メモリアドレス0~511を表現するのに2進数表記で511=1 1111 1111と9bit必要となります。

 しかし、メモリアドレスを指定するアドレスバイトは8bit(A7~A0)なので、
 デバイスアドレスピンのA0を無くし、コントロールバイト内のデバイスアドレスのA0ビットを
 メモリアドレスのA8ビットとして使用します。

 同様に、8kbitメモリはA1も無くしてA9に、16kbitメモリは更にA2も無くしてA10に使います。
 このため、16kbitメモリはデバイスアドレスピンが無いです。

 しかし、メモリ容量が32kbit以上では、アドレスバイトが1個追加され、
 上位と下位バイトの計16bitで指定するので、デバイスアドレスピンが復活しますが、
 1Mbit以上のメモリ容量になると、メモリアドレスの指定に17bit以上必要になるため、
 再びデバイスアドレスピンが減っていきます。

 アドレスの扱いについては、各メーカや、パッケージ形状で異なり、
 必ずしも上記の通りでは無いため、データシートで必ず確認するようにして下さい。

<命令の種類と形式>
以下の説明では、マスタ(マイコン等)側を基準にして記述します。
また、メーカーによっては動作が説明と異なる場合があるので、
使用の際はデータシートを確認して下さい。

<書込み命令>
書込み命令には、1バイト(8bit)データのみを書き込むバイトライトと、
連続したアドレスのデータをまとめて書き込むページライトの2種類があります。

・バイト・ライト
 コントロールバイト後にEEPROMからのACKが来たら、
 書込み先のアドレス値(アドレスバイト)を送信し、
 ACKが来たら書込むデータを送信し、ACKが来たらストップCを送信します。

I2C対応EEPORMのバイトライト命令

・ページライト
 1ページ分をまとめて書込むことができます。

I2C対応EEPORMのページライト命令

 1ページが何バイトなのかは、メモリ容量によって異なり、
 メモリ容量16kbitまでは16バイト、32kと64kbitは32バイト、
 128kと256kbitは64バイト、512kbitは128バイトになります。
  ※メーカーやデバイスの種類によって異なる場合があります。

 例えば、1ページが16バイトのEEPROMでは、
 8bitデータを最大16個まで書き込むことができます。

 命令の構成は、バイト・ライトと同様に書込むデータを送信してACKが来たら、
 ストップCを送信せずに次のデータを送信して再びACKが来たら、また次のデータを送信します。

 これをストップCを送信するまで、繰り返し行います。
 各データは最初に指定したアドレスから+1づつ増加したアドレスに書込まれます。

 書込みできるデータ数Xの上限はメモリ容量(1ページあたりのバイト数)で決まり、
 ストップCを送信せず、上限を超える数のデータを送信すると、アドレスが最初の値に戻り、
 前に書込んだデータに上書きされてしまうので注意が必要です。

 両ライト命令とも、EEPROMにデータを書込む処理はストップCを送信後に行われます。
 書込み処理は数ms程度かかり、その間は次の命令を受け付けません。

 従って、書込み処理中にマスタからスタートCとコントロールバイトを送信しても、
 EEPROMからACKが返ってきません。

<読出し命令>
I2Cの読出し命令では、読出し先のアドレスを直接指定できず、
前回の書込み命令で指定したアドレスを利用して読出しを行います。

・カレント・アドレス・リード
 カレントとは現在を意味し、EEPROMが現在保存しているアドレスのデータを読み出します。

I2C対応EEPORMのカレント・アドレス・リード

現在のアドレスとは、前回の書込み命令で指定したアドレスに+1したものになります。
+1 している理由はページ・ライト命令で説明したように、データを1個書込みすると
次のデータを書込みするためにEEPROM内のアドレスカウンタが+1されるためです。

コントロールバイトを送信するとEEPROMからACKが来て、続いて読出しデータが続きます。
この時、マスタはACKを返さずに、ストップCを送信することで命令が終了します。

・ランダム・リード
 指定したアドレスのデータを読出します。

I2C対応EEPORMのランダム・リード

EEPROMに現在保存しているアドレスカウンタ値を指定したアドレスに書き換えるため、
事前に読出したいアドレスで書込み命令を行いますが、
書込み命令が実行されてしまうとアドレスが+1されてしまうため、
途中で命令を中断させることで、+1せず指定したアドレスをアドレスカウンタに保存させます。

具体的には、スタートC後に書込み命令(命令の種類を0)のコントロールバイトを送信し、
ACKが来たら、読出ししたいアドレスを指定したアドレスバイトを送信します。

そしてACKが来た後に、書込みデータを送信せずに、スタートCを送信すると、
書込み命令はキャンセルされるので、読出し命令のコントロールバイトを送信します。

これによって、指定したアドレスのデータが送られてきます。
この時、マスタはACKを返さずに、ストップCを送信することで命令が終了します。

・シーケンシャル・リード
 連続したアドレスの複数データを読出します。

I2C対応EEPORMのシーケンシャル・リード

上記2つのリード命令において、読出しデータが送られて来たら、ストップCを送信せずに、
ACKを送信すると、アドレスを+1したアドレスにあるデータが送られてきます。

その後もACKを送信することで、カウントアップしたアドレスにあるデータが順次送られ、
ストップCを送信するまで続きます。
カウントアップで、アドレスが最大値まで来たらアドレス0に戻り、読出し処理が継続されます。



SPI対応EEPROMの使い方

信号線はMicrowireと同じ4本ですが、
チップセレクト信号(CS)が有効となる論理がMicrowireとは逆の負論理(Lで選択)であったり、
データの入出力タイミングがMicrowireはクロック信号の立上りで行うのに対し、
SPIは入力を立上り、出力を立下りで行うタイプが多い(※)です。

※SPIの入出力タイミング(SPI動作モード)について
 クロックの定常状態と、データの入出力タイミングの組み合わせにより、下図に示す4種類のモードがあります。

SPI動作モード

殆どのEEPROMがモード0と3の両方に対応しており、
SCK信号の立上りでデータ入力、立下りでデータ出力を行います。

以下、本記事に掲載するタイミング図はモード0の場合です。

SPI対応EEPROMのピン配置

<各ピンの説明> (電源ピンVccと、GNDピンVssは省略)
CS(チップセレクト入力)

 EEPROMを選択状態に設定します。
  Hレベル:EEPROMは非選択状態 出力(SO)はハイ・インピーダンスとなります。
  Lレベル:EEPROMを選択状態

SCK(シリアルクロック入力)
 シリアルデータ(SI,SO)の入出力タイミングを設定します。
 クロックの立上り/立下り どちらでデータを入出力するかはSPIモードの種類で異なりますが、
 殆どのEEPROMはモード0と3に対応しており、立上りで入力、立下りで出力します。

SI(シリアルデータ入力)
 SCKの立上りタイミングで、データが入力されます。(SPIモード0、3対応タイプの場合)

SO(シリアルデータ出力)
 SCKの立下がりタイミングで、データが出力されます。(SPIモード0、3対応タイプの場合)

WP(ライトプロテクト入力)
 Lレベル入力で書込み禁止状態となり、Hレベルで書込み許可状態にします。

HOLD(ホールド入力)
 CS=Lレベル時に本ピンをLレベルにするとホールド状態になります。

 ホールドはEEPROMを非選択状態(CS=H)にせずに通信を休止させる際に使用します。
 ホールド状態では出力(SO)はハイ・インピーダンス状態となり、
 入力(SI)及びクロック(SCK)はドントケア(無効)となります。
 
 HOLDをHレベルにするとホールド状態が解除され、通信が再開します。
 ホールド状態中にCSをHレベルにすると、デバイスをリセットできます。

<命令の形式と種類>
EEPROMのデータ読み書きはSIに入力される命令によって行われ、
基本的には以下の6種類ですが、メーカーやメモリ容量によっては他の命令もあります。

SPI対応EEPROM命令一覧

どの命令も最初にCS入力をLにして、最初のクロックSCK信号の立上りタイミングで
SIの値が入力され、オペコードに応じた命令を実行します。

・WREN(ライト・イネーブル:書込み許可)
 電源ON時、EEPROMは書込み禁止状態で立ち上がるため、
 書込み命令(WRITE又はWRSR)の前に本命令を実行します。

 本命令の実行中はWPピンをHにしておく必要があります。
 書込み命令が終了すると自動的に書込み禁止状態に戻ります。

SPI対応EEPROMのWRDI命令とWREN命令

・WRDI(ライト・ディセーブル:書込み禁止)
 EEPROMを書込み禁止状態にします。
 本命令はWPピンの状態に関係なく実行できます。

・RDSR(リード・ステータス・レジスタ:ステータスレジスタ読出し)
 EEPROMの状態を示すステータス・レジスタの値を読出します。

SPI対応EEPROMのRDSR命令
SPI対応EEPROMのステータスレジスタ

<ステータスレジスタの構成>
 BP1、BP0(ブロック・プロテクト:書込み防止ブロック)
    書込み防止されるメモリアドレスを指定します。
    ステータスレジスタ内で、この2bitのみ不揮発性(電源オフでも保存される)です。
     00:レベル0(なし)
     01:レベル1(上位1/4)
     10:レベル2(上位1/2)
     11:レベル3(全て)

    上記の上位1/4と1/2についてはメモリ容量によってアドレス範囲が異なります。

    メモリ容量が1k(=1024)bitの場合、1024bit=128×8bitなので、
    最大アドレスが127(7Fh)となり、レベル1で96(60h)~127(7Fh)、
    レベル2は64(40h)~127(7Fn)のアドレス範囲の書込みを防止します。

 WEL(ライト・イネーブル・ラッチ:書込み許可状態)
   メーカーによってはWEN(ライト・イネーブル)という名称の場合もあります。
   書込み許可状態であるかを示します。
   (0:書込み禁止状態、1:書込み許可状態)

 WIP(ライト・イン・プログレス:書込み中)
   メーカーによってはRDY(レディ)という名称の場合もあります。
   書込み処理が終了し、次の命令を受け入れ準備できているか示します。
   (0:書込み処理終了、1:書込み処理中) 

 SRWD(ステータス・レジスタ・ライト・ディセーブル:ステータスレジスタ書込み禁止)
   本ビットは一部のメーカのみあります。(名称もメーカーによって異なる)
   1:WPピンがL(書込み禁止)の時、ステータスレジスタも書込み禁止
   0:WPピンの状態に関係なく、ステータスレジスタは書込み可能

・WRSR(ライト・ステータス・レジスタ:ステータスレジスタ書込み)
 ステータスレジスタのBP1,BP0の書込みに使用します。
 それ以外のbitは書き換えできません。

SPI対応EEPROMのWRSR命令

 本命令の実行前にWREN命令で書込み禁止を解除しておく必要があります。

 レジスタへの書込み処理は本命令を送信し、CSをHにした後に行われます。
 書込み処理が終了したかどうかはRDSR命令により
 ステータスレジスタのWIPが0であるかどうかで確認できます。

 書込み処理が終了すると自動的に書込み禁止状態になり、
 ステータスレジスタのWELが0になります。

・READ(リード:データ読出し)
 SIからオペコードとアドレスを入力すると、SOから指定したアドレスのデータが出力されます。

SPI対応EEPROMのREAD命令

1バイト(8bit)のみリードする場合は、この時点でCSをHにします。
CSをLのままにすると、アドレス値が+1されたアドレスにあるデータが続けて出力されます。

CSをHにするまで、カウントアップしたアドレスのデータが出力され続け、
アドレス値が最大に達したら0になり、そのままリードが継続されます。

SPI対応EEPROMのREAD命令の連続データ読出し

・WRITE(ライト:データ書込み)
 書込み命令には、1バイト(8bit)データのみを書き込むバイトライトと、
 連続したアドレスのデータをまとめて書き込むページライトの2種類があります。

 両ライト命令とも、実行前にWREN命令で書込み禁止を解除しておく必要があります。

・バイト・ライト
 SIからオペコードとアドレス、1バイトの書込みデータを入力したら、
 次のSCKが立上る前にCSをHにすることで書込み処理を開始します。

SPI対応EEPROMのWRITE命令(バイト・ライト時)

書込み処理には数ms程度かかるため、書込み終了を確認するには
RDSR命令によってステータスレジスタのWIPが1なら書込み中、0なら完了になります。
(書込み処理中はRDSR命令だけが実行可能)

書込み処理が終了すると自動的に書込み禁止状態になり、
ステータスレジスタのWELが0になります。

・ページライト
 バイト・ライトにおいて、1バイトのデータ入力後もCSをHにせず、
 2個目以降のデータを入力すると、アドレス値を+1づつ加算したアドレスに書込まれます。

SPI対応EEPROMのWRITE命令(ページ・ライト時)

連続で書き込めるデータは1ページ分です。
基本的にはメモリ容量が大きい程、1ページのバイト数が増えるのですが、
同じメモリ容量でも、バイト数はメーカーによって異なります。

エイブリック製EEPROMの場合、メモリ容量4kbitまでは1ページ16バイト、
8k~64kbitは32バイト、128kと256kは64バイトとなっているので、
4kbitメモリなら最大で16個のデータを連続で書き込むことができます。

1ページ以上のデータを送信すると、カウントアップしたアドレス値が最初の値に戻り、
以前書き込まれたアドレスに上書きされてしまいます。