概要
今年大学でやってる研究開発でEEPROMが必要になったのでテスト用のコードを書いてテストしました。使用するEEPROMはコレ。githubにも共有用として上げました。コチラです。今回は備忘録的と身内での共有という意味合いが強いので簡素な記事になります。まあ、内容的にもEEPROMの読み書きテストしたってだけですからね。
回路
EEPROM側 | Arduino M0側 |
A0 | High(3.3V) |
A1 | Low(0V) |
A2 | Low(0V) |
Vss | GND |
Vcc | 3.3V |
WP | GND |
SCL | SCL |
SDA | SDA |
A0~2はEEPROMを複数使う場合に、デバイスアドレスを区別するために使います。全部Lowで0x50。
コード
#include <Wire.h> #define EPR_ADDR 0x51 // EEPROM address A2=Low,A1=Low,A0=HIGH void setup() { SerialUSB.begin(9600); // モニタ用にメッセージを出力 while(!SerialUSB){ ; } SerialUSB.println("EEPROM Test"); Wire.begin(); // I2C master delay(1000); byte b[] = {5,10,20,40,80,160}; int len = sizeof(byte); // eprWrite(0, b, len); // eprRead(0, len); } void loop() { } int eprWrite(int addr, byte b[], int l) { int ans; Wire.beginTransmission(EPR_ADDR); Wire.write(highByte(addr)); Wire.write(lowByte(addr)); Wire.write(b, l); ans = Wire.endTransmission(); delay(5); return ans; } void eprRead(int addr, int l) { byte ret; Wire.beginTransmission(EPR_ADDR); Wire.write(highByte(addr)); Wire.write(lowByte(addr)); Wire.endTransmission(); Wire.requestFrom(EPR_ADDR, l); while (Wire.available()) { ret = Wire.read(); SerialUSB.println(ret); } return; }
Arduino M0はSerialではなくSerialUSBを使います。Serialで書いてもコンパイラは注意してくれない(.org 1.7.10では)ので気を付けましょう。今回扱うデータ型はbyteなので読み書きでは特に意識する部分は無し。intとかだと読み込みの時に2回読み込んで上位バイトと下位バイトを合体させるとかの処理をちょい足ししないといけないと思います。
EEPROMに1バイトずつ書き込むような処理の仕方だと寿命が早く来てしまうのでデータは一旦配列に入れてからWireにバッファさせてまとめて書き込みます。実際に書き込まれるタイミングはWire.endTransmission();のタイミングだったような気がします。Wireライブラリでは最大32バイトまでバッファリング可能です。
EEPROMへの書き込みでは、Wire.beginTransmission();でデバイスアドレスを指定した後、Wire.write二回でEEPROM内のアドレスを指定します。その後のWire.write()で送信したいデータ本体を指定します。Wire.write()には、1バイトの引数を取るほか、配列と送信バイト数を渡すこともできます。
EEPROMからの読み込みでは、Wire.requesFrom()でデータを取ってきます。