سلام دوستان
من برای راه اندازی یک حافظه خارجی EEPROM به شماره AT24C16 با برد ARDUINO UNO به مشکل عجیب بر خورده ام.
دو تابع برای Write و Read این حافظه نوشتم.
مشکل اینجاست که اگر 10 بایت را به صورت پشت سر هم بر روی حافظه Write کنم و سپس همین 10 بایت را دوباره از حافظه Read کنم، در تمام مراحل خواندن حافظه آخرین بایتی که بر روی حافظه نوشته شده بود را باز می گرداند.
در این بین اگر خانه ای از حافظه به جز این 10 خانه را هم بخوانیم باز همان بایت آخری که بر روی حافظه رایت شده بود را برمیگرداند.
[code=c]#include <Wire.h>
/*
* Write a byet in EEPROM Memory
*/
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(200);
}
/************************************************** ********************
* Read a byte from EEPROM memory *
************************************************** *******************/
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((byte)(eeaddress >> 8)); // MSB
Wire.write((byte)(eeaddress & 0xFF)); // LSB
Wire.endTransmission(false);
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
//Wire.endTransmission();
delay(100);
return rdata;
}
void setup()
{
Wire.begin(); // join I2C bus (address optional for master)
Serial.begin(9600);
Serial.println("I2C Test"
// Wire.beginTransmission(0x50);
// Wire.write(0x00); // MSB
// Wire.write(0x01); // LSB
// Wire.write(0xBB);
// Wire.endTransmission();
// Wire.endTransmission();
}
void loop()
{
byte data;
writeEEPROM(0x50,1,10);
writeEEPROM(0x50,2,20);
writeEEPROM(0x50,3,30);
writeEEPROM(0x50,4,40);
writeEEPROM(0x50,5,50);
writeEEPROM(0x50,6,60);
writeEEPROM(0x50,7,70);
writeEEPROM(0x50,8,80);
writeEEPROM(0x50,9,90);
writeEEPROM(0x50,10,100);
data = readEEPROM(0x50,1);
Serial.print("ADD: 1 "
Serial.println(data , DEC);
data = readEEPROM(0x50,2);
Serial.print("ADD: 2 "
Serial.println(data , DEC);
// data = readEEPROM(0x50,3);
// Serial.print("ADD: 3 "
// Serial.println(data , DEC);
// Wire.beginTransmission(0x50);
// Wire.write(0x00); // MSB
// Wire.write(0x01); // LSB
// Wire.endTransmission(false);
// Wire.requestFrom(0x50,1);
// if (Wire.available()) data = Wire.read();
//delay(2000);
}
[/code]
من برای راه اندازی یک حافظه خارجی EEPROM به شماره AT24C16 با برد ARDUINO UNO به مشکل عجیب بر خورده ام.
دو تابع برای Write و Read این حافظه نوشتم.
مشکل اینجاست که اگر 10 بایت را به صورت پشت سر هم بر روی حافظه Write کنم و سپس همین 10 بایت را دوباره از حافظه Read کنم، در تمام مراحل خواندن حافظه آخرین بایتی که بر روی حافظه نوشته شده بود را باز می گرداند.
در این بین اگر خانه ای از حافظه به جز این 10 خانه را هم بخوانیم باز همان بایت آخری که بر روی حافظه رایت شده بود را برمیگرداند.
[code=c]#include <Wire.h>
/*
* Write a byet in EEPROM Memory
*/
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(200);
}
/************************************************** ********************
* Read a byte from EEPROM memory *
************************************************** *******************/
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((byte)(eeaddress >> 8)); // MSB
Wire.write((byte)(eeaddress & 0xFF)); // LSB
Wire.endTransmission(false);
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
//Wire.endTransmission();
delay(100);
return rdata;
}
void setup()
{
Wire.begin(); // join I2C bus (address optional for master)
Serial.begin(9600);
Serial.println("I2C Test"
// Wire.beginTransmission(0x50);
// Wire.write(0x00); // MSB
// Wire.write(0x01); // LSB
// Wire.write(0xBB);
// Wire.endTransmission();
// Wire.endTransmission();
}
void loop()
{
byte data;
writeEEPROM(0x50,1,10);
writeEEPROM(0x50,2,20);
writeEEPROM(0x50,3,30);
writeEEPROM(0x50,4,40);
writeEEPROM(0x50,5,50);
writeEEPROM(0x50,6,60);
writeEEPROM(0x50,7,70);
writeEEPROM(0x50,8,80);
writeEEPROM(0x50,9,90);
writeEEPROM(0x50,10,100);
data = readEEPROM(0x50,1);
Serial.print("ADD: 1 "
Serial.println(data , DEC);
data = readEEPROM(0x50,2);
Serial.print("ADD: 2 "
Serial.println(data , DEC);
// data = readEEPROM(0x50,3);
// Serial.print("ADD: 3 "
// Serial.println(data , DEC);
// Wire.beginTransmission(0x50);
// Wire.write(0x00); // MSB
// Wire.write(0x01); // LSB
// Wire.endTransmission(false);
// Wire.requestFrom(0x50,1);
// if (Wire.available()) data = Wire.read();
//delay(2000);
}
[/code]