/* * I2C EEPROMの読み書きテスト * 対応素子:24LC32, 24LC64, 24LC128, 24LC256, 24LC512 * 2015/07/01 ラジオペンチ http://radiopench.blog96.fc2.com/ * データー配列を使った書き込み */ #include //I2C ライブラリ unsigned int startADR = 0x0000; unsigned int endADR = 0x1FFF; // アドレス上限指定 (24LC64なら0x1FFF) unsigned int ADR; byte data; char ascii[16]; // ASCIIキャラクタ表示用バッファ byte masterD[] = { // 配列にEEPROMに書きたいデータを定義する 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F }; void setup() { Wire.begin(); Serial.begin(9600); Serial.print("Writing"); for (ADR = startADR; ADR < 512; ADR++) { // データが定義されている512バイトの範囲で、 data = masterD[ADR]; // 配列からデーターを読み出して i2cEEPROM_write(0x50, ADR, data); // データーを書き込む if ((ADR & 0xFF) == 0) { Serial.print('.'); // 書き込み進行中表示 } } Serial.println(); // 書き込み完了で改行 Serial.println(); // Serial.println("EEPROM dump"); // EEPROMのダンプ開始 Serial.println("ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII CHARACTER"); for (ADR = startADR; ADR <= endADR; ADR++) { // 全アドレス範囲をダンプ if ((ADR % 16) == 0) { // 行の先頭なら printADR(ADR); // アドレス表示 for (int n = 0; n <= 15; n++) { ascii[n] = ' '; // ASCII文字表示バッファを初期化 } } data = i2cEEPROM_read(0x50, ADR); // 外付けEEPROMから読み出し Serial.print(data >> 4, HEX); // 上位4ビットを16進表示 Serial.print(data & 0x0F, HEX); // 下位4ビット Serial.print(" "); // データ間にスペース入れ if ((data > 0x20) & (data < 0x7F)) { // 表示可能文字なら ascii[ADR & 0x0F] = data; // 表示バッファに記録 } if ((ADR % 16) == 15) { // 行末なら for (int n = 0; n <= 15; n++) { // ASCIIキャラクタで表示 Serial.print(ascii[n]); } Serial.println(); // 改行 } if ((ADR & 0x00FF) == 0xFF) { // 256バイト毎に Serial.println(); // 一行開ける } } } void loop() { // 無限ループで停止 } void i2cEEPROM_write(int i2cADR, unsigned int eeADR, byte data ) { Wire.beginTransmission(i2cADR); // i2cアドレス指定 Wire.write((int)(eeADR >> 8)); // EEPROM内アドレス指定 MSB Wire.write((int)(eeADR & 0xFF)); // LSB Wire.write(data); Wire.endTransmission(); delay(5); // 書き込み完了待ち } byte i2cEEPROM_read( int i2cADR, unsigned int eeADR ) { Wire.beginTransmission(i2cADR); // i2cアドレス指定 Wire.write((int)(eeADR >> 8)); // EEPROM内アドレス指定 MSB Wire.write((int)(eeADR & 0xFF)); // LSB Wire.endTransmission(); Wire.requestFrom(i2cADR, 1); // 1バイトデータリクエスト while (Wire.available()) { // data = Wire.read(); // データ受信 } return data; } void printADR(unsigned int a) { // アドレスを4桁表示 String b = ""; if (a < 0x1000) { b = "0"; } if (a < 0x100) { b = "00"; } if ( a < 0x10) { b = "000"; } Serial.print(b); Serial.print(a, HEX); Serial.print(" "); }