求教Arduino外置EEPROM的代码
2014-08-284.1万
AI 快速预览详细
本文介绍了如何通过I2C接口将Arduino UNO的数据写入外部EEPROM,以扩展存储空间。文章详细说明了使用24LC256外部EEPROM的具体步骤和代码示例,帮助用户解决UNO内部EEPROM容量不足的问题。通过I2C通信,可以轻松实现数据的读写操作,适用于需要记录编码器数据和运行时间的应用场景。
|
手上有一块UNO,记录编码器数据和运行时间,UNO内部EEPROM有点小,想拓展至外部EEPROM,用<EEPROM.h>库是不是只能写在UNO内部?怎样才能写到外部EEPROM中? |




byte readData(unsigned int address) {
byte result;
Wire.beginTransmission(0x50);
Wire.write(address);
Wire.endTransmission(); //此行務必要在Wire.write(address)之後
Wire.requestFrom(0x50, 1);
result = Wire.read();
return result;
}
我的连线是:A0到A2全部接地,WP管脚也接地。串口看读取的值,每一次按下复位键,打印的值就会增长一次。
#include "Wire.h"
#include "i2cEEPROM.h"
void setup()
{
i2cEEPROM.begin(0x50);
byte num = i2cEEPROM.readByte(0)+1;
i2cEEPROM.writeByte(0,num);
Serial.begin(9600);
}
void loop()
{
Serial.println(i2cEEPROM.readByte(0));
delay(1000);
}
[p=30, 2, left]注:该连线图只适用于Arduino UNO![/p]
顺便说一下,我发现如果先初始化串口再初始化I2C,在这中间需要加入一些延时,否则读出的数据也不对,一直是255。
也就是说,需要改成这样:
void setup()
{
Serial.begin(9600);
delay(10);
i2cEEPROM.begin(0x50);
byte num = i2cEEPROM.readByte(0)+1;
i2cEEPROM.writeByte(0,num);
}
[code]#include
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
byte a0,b0;
writeData(0x50,0x00,0xbb);
writeData(0x57,0x00,0x11);
a0 = readData(0x50,0x00);
b0 = readData(0x57,0x00);
Serial.println(a0);
Serial.println(b0);
delay(3000);
}
void writeData(int m_deviceid,int add,byte data)
{
Wire.beginTransmission(m_deviceid);
Wire.write(add>>8);
Wire.write(add & 0xFF);
Wire.write(data);
Wire.endTransmission();
delay(10);
}
byte readData(int m_deviceid,int add)
{
byte result;
Wire.beginTransmission(m_deviceid);
Wire.write(add>>8);
Wire.write(add & 0xFF);
Wire.endTransmission();
Wire.requestFrom(m_deviceid, 1);
result = Wire.read();
return result;
}[/code]
这段关于I2C的EEPROM代码你可以参考下:https://github.com/Soshimo/I2C-Serial-EEPROM-Arduino-Library
#include
i2cEEPROMClass(rom);
int R_W=2; // LOW is write data ; HIGH is read data
void setup()
{
Serial.begin(9600);
pinMode(R_W,OUTPUT);
rom.begin(0x57);
digitalWrite(R_W,LOW);
rom.writeByte(1,0xaa); delay(10);
rom.writeByte(10,0xbb); delay(10);
rom.writeByte(2,0xcc); delay(10);
/* writeString(2,"star");
delay(10);
writeString(3,"end");
delay(10);*/
}
void loop()
{
rom.begin(0x57);
digitalWrite(R_W,HIGH);
byte a = rom.readByte(10); delay(10);
Serial.println(Wire.endTransmission());delay(10);
Serial.println(a,HEX); delay(10);
delay(1000);
}[/code]
地址为多少,读取结果为最后一个写入结果,代码及电路图如下,求赐教