I2CシリアルEEPROMを使ってみようを使ってみよう

24LC64の読み書き

24LC64というI2CシリアルEEPROMの読み書きテストをしてみます。
ここでは、A0=A1=A2=0としたアドレスを用います。
従って、アドレス部のビットパターンは0b1010000rとなります
16進数で表すと0xA0となります。一般的なアドレス表示ではこれを1ビット右シフトした値0x50となります。
WPはwrite protectなので、書き込む場合にはlowにしておく必要があります。
SCLとSDAは適当な(出鱈目という意味ではない)抵抗でプルアップしておくのを忘れないようにします。


I2CEEprom.h
#include "mbed.h"
// 24LC64 の書き込み、読み込みテスト

class I2CEEprom : public I2C
{
private:
  unsigned char addr;
public:
  I2CEEprom();
  I2CEEprom(PinName data, PinName clock, int address);
  void write(unsigned int address,  unsigned char data);
  unsigned char read(unsigned int address);
};


I2CEEprom.cpp



I2CEEprom.cpp
#include "I2CEEprom.h"
// 24LC64 の書き込み、読み込みテスト

//I2C  i2c(p9, p10); //p9: data, p10: clock

I2CEEprom::I2CEEprom():I2C(p9,p10)
{
  addr = 0xA0;
}
I2CEEprom::I2CEEprom(PinName data, PinName clock, int address):I2C(data, clock)
{
  addr = address;
}

void I2CEEprom::write(unsigned int address,  unsigned char data)
{
    start();
    ((I2C*)this)->write(addr);
    ((I2C*)this)->write((address>>8)&0xff);
    ((I2C*)this)->write(address & 0xff);
    ((I2C*)this)->write(data);
    stop();
}

unsigned char I2CEEprom::read(unsigned int address)
{
    unsigned char x;
    start();
    ((I2C*)this)->write(addr);
    ((I2C*)this)->write((address>>8)&0xff);
    ((I2C*)this)->write(address&0xff);
    start();
    ((I2C*)this)->write(addr+1);
    x = ((I2C*)this)->read(0);
    stop();
    return x;
}


main.cpp



main.cpp
#include "mbed.h"
#include "I2CEEprom.h"
Serial pc(USBTX, USBRX); // tx, rx
I2CEEprom i2c;

int main()
{
  pc.baud(115200);
  int x=0;
  // 書き込む場合
 /*
        for(int i=0; i<0x400; i++, x++)
        {
            i2c.write(i, x&0xff);
        }
 */
 // 読み込む場合
        for(int i=0; i<0x400; i++)
        {
            x = i2c.read(i);
            pc.printf("%04x:%02x ",i,x);
        }
        pc.printf("\n");
}