(2018.7.21 作成)
I2C制御のEEPROM(M24M02)を紹介します。1年ほど前に同じくI2Cを用いるEEPROMとしてAT24C256を紹介したのですが、M24M02のメモリサイズはATR24C256の256kbit(= 32kByte)に対して2Mbit(=256kByte)と8倍の容量があります。もっとも値段もほぼ8倍になりますが、、、
このEEPROMはLCSCで調べると妥当な在庫量、金額のEEPROMの中で一番大きな容量となっているため自作基板で何か作ろうとする際にはよい選択肢になるのではないでしょうか?
さて、このEEPROMの使い方ですが以下の点を除きAT24C256とほぼ同様の使い方をすることができます。
一般的にI2CでEEPROMへ書き込む際にはI2Cのスレーブアドレスに続いて2バイトのメモリアドレスを指定し、その後データを送受信します。
しかし2バイトのメモリアドレスでは64kByteの容量までしか表現できません。このためM24M02ではI2Cスレーブアドレスの下位2ビットがメモリアドレスを指定するために使用されています。
具体的には
固定 | メモリアドレス | ||||||
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
1 | 0 | 1 | 0 | E2 | A17 | A16 | R/W |
となっており、上位4ビットは1010に固定、b3ビットはE2端子によるHW設定でb2, b1がメモリアドレスの上位2ビットを指しています。
M24M02-DRで始まる型番の物は通常通り読み書きできる256kByteのメモリ容量に加え、一度書き込んでロックしたら変更不能になるIDページという256Byteの領域があります。
利用する際はスレーブアドレスの上位4ビット(b7~b4)が1011となり、他の通常領域とは区別されています。また、この領域がロックされているかどうかは書き込みコマンドに対してACKを返さないことで判別することができます。ただしこのような判定方法は一般的ではないのかArduinoの標準ライブラリでは判別することはできません。Arduinoの場合は一度書いてから読んでみて一致するかどうかで判定することになのではないでしょうか?
ちなみに管理人の購入したICはDRタイプのはずなのですが、何を間違えたのか、それとも初めからなのかロックされていたので、以下でダウンロードしていただけるソースコードの動作検証はできていません。
M24M02を読み書きできるライブラリを作成しました。以下からダウンロードしていただけます。
M24M02だけでなくAT24C256と共通するEEPROMクラスを継承した実装となっているため、ほぼどちらも共通したコードで動いています。
上記ダウンロード先のライブラリ内にはAruduino/STM32F1で使用できるサンプルコードが入っていますので、実際の使用方法についてはそちらを参照してください。またI2CやGPIOなどを操作する基本的なクラス群についてはこちらで公開していますので、併せてご確認ください。