AT24C256与AT24C04的区别在于通讯过程中地址段数据的长度一样,还有就是页数据范围的大小不一样。通讯形式造本质上没有太大区别。按照我的习惯,像这种简单EEPROM模块的读写操作,我会首选Arduino环境来实现。
当然不是从0开始,既然有了DeepSeek这种好东西,必须用上。以下代码就是在DeepSeek给出的结果上,做了简单修改后得到的,并且经过了上传、运行验证。
/**
ESP8266与AT24C256连接:
ESP8266 AT24C256
-------------------
3.3V VCC
GND GND
D1 (GPIO5) SCL
D2 (GPIO4) SDA
-------------------
AT24C256的A0, A1, A2引脚接地。
功能说明
1、基本读写功能:
writeEEPROM() - 向指定地址写入一个字节
readEEPROM() - 从指定地址读取一个字节
字符串操作:
writeStringToEEPROM() - 写入字符串(包括结束符)
readStringFromEEPROM() - 读取字符串
2、地址处理:
AT24C256使用16位地址(0-32767),所以需要发送高字节和低字节
3、注意事项
写入延迟:AT24C256写入操作需要时间,每次写入后建议延迟5ms
分页写入:AT24C256支持64字节页写入,可以优化写入速度
I2C频率:ESP8266默认I2C频率是100kHz,可以提高到400kHz
地址范围:确保访问的地址不超过32767(0x7FFF)
*/
#include <Wire.h> // Arduino I2C库
// AT24C256的I2C地址
#define EEPROM_ADDR 0x50 // 默认地址是0x50 (A0=A1=A2=GND)
// AT24C256的容量设置
#define EEPROM_SIZE 32768 // 256Kbit = 32K字节
void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C总线
Serial.println("\nAT24C256 EEPROM测试程序");
Serial.println("----------------------");
// 测试EEPROM是否连接正常
Wire.beginTransmission(EEPROM_ADDR);
if (Wire.endTransmission() == 0) {
Serial.println("AT24C256检测成功!");
} else {
Serial.println("AT24C256未检测到,请检查连接!");
while(1); // 停止程序
}
// 测试写入和读取
testEEPROM();
}
void loop() {
// 主循环不需要做任何事情
delay(1000);
}
// 测试EEPROM功能
void testEEPROM() {
int address = 0; // 测试地址
byte dataToWrite = 0x01; // 测试数据
// 读取一个字节
byte dataRead = readEEPROM(EEPROM_ADDR, address);
Serial.print("读取地址为0x00单元的数据: 0x");
Serial.println(dataRead, HEX);
// 数据加1后再写回去
dataToWrite=dataRead+1;
writeEEPROM(EEPROM_ADDR, address, dataToWrite);
Serial.print("写入地址为0x00单元的数据: 0x");
Serial.println(dataToWrite, HEX);
// 验证,读取
dataRead = readEEPROM(EEPROM_ADDR, address);
Serial.print("读取地址为0x00单元的数据: 0x");
Serial.println(dataRead, HEX);
// 测试字符串写入和读取
String testStr = "Hello, AT24C256!";
address = 100; // 新的地址
Serial.print("\n写入字符串(从0x01开始写入): ");
Serial.println(testStr);
writeStringToEEPROM(EEPROM_ADDR, address+1, testStr);
String readStr = readStringFromEEPROM(EEPROM_ADDR, address+1, testStr.length());
Serial.print("读取字符串: ");
Serial.println(readStr);
}
// 向EEPROM写入一个字节
void writeEEPROM(int deviceAddr, unsigned int eeAddr, byte data) {
Wire.beginTransmission(deviceAddr);
Wire.write((int)(eeAddr >> 8)); // 高地址字节
Wire.write((int)(eeAddr & 0xFF)); // 低地址字节
Wire.write(data);
Wire.endTransmission();
delay(5); // 写入需要时间
}
// 从EEPROM读取一个字节
byte readEEPROM(int deviceAddr, unsigned int eeAddr) {
byte data = 0xFF;
Wire.beginTransmission(deviceAddr);
Wire.write((int)(eeAddr >> 8)); // 高地址字节
Wire.write((int)(eeAddr & 0xFF)); // 低地址字节
Wire.endTransmission();
Wire.requestFrom(deviceAddr, 1);
if (Wire.available()) {
data = Wire.read();
}
return data;
}
// 向EEPROM写入字符串
void writeStringToEEPROM(int deviceAddr, int eeAddr, String data) {
for (int i = 0; i < data.length(); i++) {
writeEEPROM(deviceAddr, eeAddr + i, data[i]);
}
// 写入字符串结束符
writeEEPROM(deviceAddr, eeAddr + data.length(), '\0');
}
// 从EEPROM读取字符串
String readStringFromEEPROM(int deviceAddr, int eeAddr, int length) {
String data = "";
for (int i = 0; i < length; i++) {
char c = readEEPROM(deviceAddr, eeAddr + i);
if (c == '\0') break;
data += c;
}
return data;
}可以看到,在读写单元数据的时候,地址段要处理为两个字节的。

我要赚赏金
