シリアルメモリ(24LCxx)の使い方
はじめに
PICの工作でメモリ不足に困る事が時々あります。よく使う16F84ではデータメモリが68byte、Flashデータメモリは64byteでちょっと少ない気がします。SRAMを外付けにするのも大袈裟だし、電源を切ってもデータを保持したい場合があるので何かいい物はないかと思っていたら、丁度PICを作っているMicrochip社から8ピンのシリアルEEPROMがでてました。
読み書きに若干時間がかかりますが、I2Cインタフェースで信号線が2本で済み、PICとの相性もなかなか良さそうです。書き込みサイクルは100万回以上が保証されています。このメモリのデータシート(英語版)がちょっと分かりにくかった事と、使うために苦労した点がいくつかあったので、このホームページをご覧頂いている方に何か参考になればとPICで利用する方法を残しておこうと思います。
パッケージ 24LC64(64kbit)、24LC256(256kbit)など
Vcc:定格電源電圧は2.5〜5.5Vです。
A0〜A2:チップアドレス(VccかVssに接続することでチップアドレスを設定するため、同一バス上に8個まで(3bit Addr)接続できます。アクセスするチップはR/Wコマンドで指定)
WP:ライトプロテクト(書き込み可=未接続またはVssに接続、プロテクト=Vcc)
SCL:シリアルクロック(データ転送クロック 最大400kHz)
SDA:シリアルデータ(オープンドレインなので、数kΩでVccにプルアップを推奨)
I2C通信
データ通信シーケンス
SCLがHiの間にSDAをLoにするとstart condition(通信開始)
SCLがHiの間にSDAをHiにするとstop condition(通信終了)
転送するデータは、start conditionに続きSCLがLoの時のみSDAをHi/Loに設定し、SCLがHiの時に処理される
転送は1バイト単位で行われ、1バイト毎にレシーバ(受信側)がACK/NACを発行する
24LCxx Read/Writeオペレーション
- コントロールバイト
「1010」:24LCxxアクセスコントロールコード(固定)
A2〜A0:チップアドレス(ここで指定したチップに対してR/W)
R/W: 0 = Write, 1 = Read
- アドレス
- Byte Write
StartConditionに続きControlByte(R/W=0)を送信。ACKを受け取り、これに続き同様に書き込みアドレス、データを送信、最後にStopConditionを発行することで1バイトのデータが書き込まれる。
- Page Write
ByteWriteと同じようにして、DATA0以降もデータを連続して送信(最大32bytes)するとページ書き込みとなる。24LCxx内部のページバッファは32バイトであり、StopConditionの前に32バイト以上送った場合、バッファの先頭から順に上書きされる。StopCondition発行後、バッファからメモリへの内部書き込みサイクルが開始される。
- Random Read
Writeと同様にアドレスを指定した後、再度StartConditionを発行し、ControlByte(R/W=1)を送信した後1バイトのデータをSCLに同期して読み出すことができる。最後のNACはDATAを受信した側(レシーバ)が発行する。
- Sequential Read
RandomReadと同様のアドレス指定とコントロールバイトに続き、データを連続して受信することができる。最大アドレスを越えると自動的に0000hにロールオーバーする。
PICからのRead/Write
実際にメモリアクセスするためには上記プロトコル以外にデータ転送のバスタイミングやACK/NACの処理など面倒なお約束があるので、これらを考慮したPIC用インタフェースプログラムを作りました。
PICとシリアルメモリをI2Cバスで接続し、RandomRead, SequentialRead,RandomWriteを行うためのライブラリになっています。