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; }
可以看到,在读写单元数据的时候,地址段要处理为两个字节的。