求教Arduino外置EEPROM的代码

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

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(4)
Abelwong
Abelwong
目前手中僅有24LC02,實測24C02改善讀取一直都是0xFF的方式是必須修改read的地址設定方式才能正常讀取,讀取部分如下:
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;
}
Yifery
Yifery
这个问题解决了吗? 我也出现了这种情况,从0x50 到0x57都能读到数据255 但是我接线是按照0x50接的
Youyou
Youyou
你的连线图没有问题,按照此图,你的地址0X57也是对的。你参考下我的代码试试看,我经过测试,成功写入并读取的。
我的连线是: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);
}
Youyou
Youyou回复加饭
下面这段代码按照你的风格来写的,测试通过,你可以试下。
[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]
Youyou
Youyou回复加饭
我用你的代码实验了下,应该是有问题的,读出来就是FF,不管是a还是b。
共7条回复,已加载2条,点击查看更多共7条回复,已加载全部
Youyou
Youyou
你好,你是打算外扩什么样的芯片呢?如果是AT24CXX系列,比如AT24C32,操作挺简单的,直接用I2C的库进行操作就好了。具体的代码,可以自己看下收据手册来写,或者在github上找相关的代码。
这段关于I2C的EEPROM代码你可以参考下:https://github.com/Soshimo/I2C-Serial-EEPROM-Arduino-Library
加饭
加饭
作者
回复Youyou
经过部分修改,能写入24C02中,但读取出问题——不管读取[code]#include
#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]
地址为多少,读取结果为最后一个写入结果,代码及电路图如下,求赐教
Youyou
Youyou回复加饭
把你的完整代码还有完整的连线图发上来看看,不然很难知道哪个细节出了问题。
共6条回复,已加载2条,点击查看更多共6条回复,已加载全部
- 没有更多了 -