![]() |
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 |
---|
#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 |
---|
#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"); } |