EEPROM用I2C関数の使い方


【EEPROMの概要】

EEPROMとしてI2C通信でRead/Writeできるメモリが製品化されています。特に
PICで有名なMicrochip社が、I2C通信とSPI通信のEEPROMを開発し供給しています。
主要な製品にはメモリサイズにより下表のようないくつかの種類があります。
メモリとしてはフラッシュメモリなので、書き込み速度が5〜10msecと遅いので
使い方の注意が必要です。
また書き込み回数の保証回数に制限があり、10万回から100万回となっています。
従って書き込み方にも工夫が必要で1バイト毎に毎回書き込むのではなく、まとめて
ページ単位に書き込む様にします。
通常ページは64バイトが単位になっています。

品 名  サイズと構成  書込み速度 最高クロック  動作電圧  通信方式
24LC00 129bits(x8) 4ms 400kHz 2.5−6.0V I2C
24LC01B
24LC02B
24LC04B
24LC08B
24LC16B
1kbits(x8)
2kbits(x8)
4kbits(x8)
8kbits(x8)
16kbits(x8)
10ms 400kHz 2.5−5.5V
24LC64
24LC128
24LC256
64kbits(x8)
128kbits(x8)
256kbits(x8)
5ms 400kHz 2.5-5.5V
25LC040
25LC080
25LC160
25LC320
25LC640
4kbits(x8)
8kbits(x8)
16kbits(x8)
32kbits(x8)
64kbits(x8)
5ms 2MHz 2.5−5.5V SPI

【EEPROMの通信手順】

代表的なEEPROMとして、I2Cインターフェースの最大容量を持つ、24LC256を例に、
その使い方を説明します。 まず、EEPROMのデータシートによると、I2C通信タイプの
メモリの通信手順は下記のようになっています。

まずこのメモリのピン配置は下図のようになっていて、I2C通信用のSCL、SDAの2本の
ライン以外に、A0、A1、A2というチップのデバイスアドレス指定用に3ビットが用意されて
います。従って、このメモリは8個までI2Cバスに接続しても区別がつくようになっています。
また、メモリはスレーブ側になるようになっていて、制御は全てマスタとなるマイコン側が
行うようにします。



WPはWrite Protect端子でVccにすると
書き込みが禁止されます。



(1) 1バイト単位の書き込み手順
  手順は下図のようになっていて、マスタ側から送信することになります。まずSTART
  Conditionをマスタ側が発行して通信が開始されます。最初にマスタ側からデバイス
  アドレスと書き込み指定をするコントロールバイトを送信し、次に2バイトのメモリアド
  レスを送信します。
  それらが全て正常にACK信号がメモリ側から返ってくれば、次に書き込むデータを送信
  します。
  そのデータにも正常にACKが返ってくればSTOP Conditionを出して通信を終了します。








(2) ページ書き込み手順
  ページ単位の書き込みは64バイトを1ページとして行います。1バイト送るのと同じ手順
  でデータを連続的に64バイト分送信してから、STOP Conditionを発行します。
  メモリ側は、このページを受信完了してから実際の書き込み動作を実行するので、
  バイト書き込みより書き込み回数を大幅に減らすことが出来ます。
  また、バイト書き込み、ページ書き込みのいずれの場合にも書き込みには数msecを要し
  ますので、送信後、次の送信をするまでにインターバルを挿入する必要があります。






(3) ランダム読み出し手順(1バイト単位読み出し)
  任意のアドレスの1バイトを読み出すには下図の手順で行います。書き込みより、やや複雑
  な手順となります。
  まず最初にSTART Conditionを発行後、書き込みモードでデバイスアドレスを含むコントロール
  バイトを送信しm続いて2バイトのアドレスを送信します。いずれの送信にも、ACKの正常返信
  を確認します。正常にACKが返信されて来たら、RESTART Conditionを発行し、続いて
  受信モードのコントロールバイトを送信します。正常にACKが返って来たら、続く1バイトを受信
  するのを待ち、正常に受信できたら、ACKを返信しないでNO ACKとすることで終了であること
  を通知します。  そして続いてSTOP Conditionを発行します。






(4) シーケンシャル読み出し手順(一括読み出し)
  手順は、大部分ランダム読み出しと一緒ですが、最後のNO ACKを返信するのを、必要な任意
  のバイト数だけ受信してからとし、それまではACKを返信します。
  従って、マスタ側が任意の数のバイト数だけ連続して受信することを決めることが出来ます。






【EEPROMアクセス関数】

このEEPROMを使うための関数が、MPLAB-C18にもあらかじめライブラリとして用意されて
いるのですが、実は、このライブラリの関数はアドレスが1バイトのみのメモリ用と
なっていて、最近の大容量メモリには対応していません。そこで新たにEEPROM用の関数を
用意しました。

これらの関数の使い方は下表となっています。

関数名 機能と基本形 使用例
EByteWrite 指定したドレスに1バイトのデータを書き込む
エラーが発生したときはマイナス値が返り
正常の時には0が返される。
temp=EByteWrite(0xA0,memadrs,'A');
unsigned char EByteWrite(unsigned char control,
  unsigned int address,unsigned char data)
EPageWrite ページ単位(64バイト)に書き込む。送るデータが
64バイト未満でも64バイトを書き込む。
エラーが発生したときはマイナス値が返り、
正常なときには0が返される
char Memodata[17]="EEPROM Memory!!!";
temp=EPageWrite(0xA0,memadrs,Memodata);
unsigned char EPageWrite(unsigned char control,
  unsigned int address,unsigned char *wtptr)
EByteRead 指定したアドレスの1バイトを読み込む
エラーが発生するとマイナス数値が返り
正常の時には読み込んだデータが返される
data = EByteRead(0xA0,memadrs);
unsigned int EByteRead(unsigned char control,
  unsigned int address)
ESequentialRead 指定したアドレスから、指定したバイト数を読み出す
エラーが発生した時にはマイナス数値が返り、
正常なときには0が返される
char Buffer[17]="        ";
temp=ESequentialRead(0xA0,memadrs,Buffer,16);
unsigned char ESequentialRead(unsigned char control,
  unsigned int address,unsigned char *rdptr,unsigned char length)





  トップページへ