5.EEPROM (Electrically Erasable Programmable read only memory)

การใช้งาน EEPROM นั้นเหมือนกับ Arduino UNO มีสองการทำงาน: อ่านและเขียน

Read:

  • I2C address of EEPROM

  • The internal address of EEPROM (the address for storing data)

  • Read data

Write:

  • I2C address of EEPROM

  • The internal address of EEPROM (the address for storing data)

  • Write data

ในการสาธิต BiBoard ที่อยู่ของ EEPROM บนบัส I2C คือ 0x54 และความจุคือ 8192Bytes (64Kbit) เราเขียนค่าทั้งหมด 16 ค่าตามลำดับตั้งแต่ 0 ถึง 15 ใน EEPROM จากแอดเดรสแรก จากนั้นจึงอ่านเพื่อเปรียบเทียบ ในทางทฤษฎี ข้อมูลที่เขียนใน EEPROM และข้อมูลที่อ่านจากที่อยู่ที่เกี่ยวข้องควรเหมือนกัน

ในการทดสอบโรงงานของ NyBoard เราใช้วิธีนี้เช่นกัน แต่จะซับซ้อนกว่า เราจะใช้รายการคงที่เพื่อเติม EEPROM และอ่านเพื่อเปรียบเทียบ

#include <Wire.h>

#define EEPROM_ADDRESS 0x54
#define EEPROM_CAPACITY 8192       // 64Kbit
#define EEPROM_TESTBYTES 16

// write 1 byte EEPROM by address
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) 
{
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.write(data);
  Wire.endTransmission();
 
  delay(5);
}

// read 1 byte EEPROM by address
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) 
{
  byte rdata = 0xFF;
 
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
 
  Wire.requestFrom(deviceaddress,1);
 
  if (Wire.available()) 
    rdata = Wire.read();
  return rdata;
}

void testI2CEEPROM(){

    byte tmpData = 0;

    Serial.println("EEPROM Testing...");
    
    // write EEPROM from 0 to EEPROM_TESTBYTES
    for(int i = 0; i < EEPROM_TESTBYTES; i++){
        writeEEPROM(EEPROM_ADDRESS, i, i % 256);
        delay(1);
    }

    Serial.println();
    
    // read from 0 to EEPROM_TESTBYTES
    for(int i = 0; i < EEPROM_TESTBYTES; i++){
        tmpData =  (int)readEEPROM(EEPROM_ADDRESS, i);
        Serial.print(tmpData);
        Serial.print("\t");
    }
}


void setup(){

    Serial.begin(115200);
    Wire.begin();
    
    testI2CEEPROM();
}

void loop(){
  
}

หมายเหตุ: การดำเนินการ EEPROM โดยเฉพาะการดำเนินการเขียน โดยทั่วไปจะไม่ใส่ลงในลูป () แม้ว่า EEPROM จะทนทานต่อการลบ (100,000 ครั้ง) หากมีการเขียนบล็อคบางบล็อกในลูปบ่อยๆ จะทำให้ EEPROM ทำงานผิดปกติ

Last updated