这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 在Arduino下使用ESP8266读写AT24C256

共2条 1/1 1 跳转至

在Arduino下使用ESP8266读写AT24C256

专家
2025-08-07 16:03:13     打赏

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;
}

可以看到,在读写单元数据的时候,地址段要处理为两个字节的。

图片1.png






关键词: 懒猫的学习笔记     AT24C256    

院士
2025-08-08 11:20:14     打赏
2楼

EEPROM是常用的芯片,也是学习I2C通讯最典型的芯片。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]