Arduino驱动24LC256 EEPROM读取值始终为255的问题求助
问题分析与解决建议
核心问题
你的代码完全不符合24LC256 EEPROM的I2C通信协议,导致读写操作失效:
- 写入操作错误:24LC256是16位地址的EEPROM,写入时必须先发送16位内存地址(高8位+低8位),再发送数据。你现在只发送了数据
9,没有指定写入的内存位置,相当于操作无效。 - 读取操作错误:读取时未指定起始内存地址,此时EEPROM的地址指针是随机状态(或之前错误操作遗留的无效值),读取到的是未初始化的EEPROM区域(默认值0xFF,也就是十进制255)。
关于你提到的“遗留地址指针”:24LC256确实有地址指针自动递增的特性,但前提是之前的读写操作正确执行了地址设置。你的错误操作根本没正确设置过地址,所以指针状态无效。
修正后的代码
#include <Wire.h> const int i2cAdd = 0x50; const int memAdd = 100; // 要操作的内存地址 const byte valueWrite = 9; // 要写入的数据 const int valueLength = 1; int valueRead = 0; void setup() { Serial.begin(9600); Serial.println("Start bus"); Wire.begin(); delay(100); // 正确的写入操作:先发送16位内存地址,再发送数据 Serial.println("Start Write"); Wire.beginTransmission(i2cAdd); Wire.write((memAdd >> 8) & 0xFF); // 发送内存地址高8位 Wire.write(memAdd & 0xFF); // 发送内存地址低8位 Wire.write(valueWrite); // 发送要写入的数据 Wire.endTransmission(); Serial.println("End Write"); delay(5); // EEPROM写入需要时间,至少等待几ms(根据 datasheet 调整) // 正确的读取操作:先写入要读取的内存地址,再发起读请求 Serial.println("Start read"); Wire.beginTransmission(i2cAdd); Wire.write((memAdd >> 8) & 0xFF); // 发送读取起始地址高8位 Wire.write(memAdd & 0xFF); // 发送读取起始地址低8位 Wire.endTransmission(false); // 这里用false,不释放总线,为后续读操作做准备 Wire.requestFrom(i2cAdd, valueLength); if (Wire.available()) { // 检查是否有数据可读 valueRead = Wire.read(); Serial.println(valueRead); } else { Serial.println("No data received"); } Serial.println("End read"); } void loop() {}
关键细节说明
- 16位地址处理:24LC256的内存地址是16位,必须拆分成高8位和低8位分别通过
Wire.write()发送。 - 写入后等待:EEPROM是慢设备,写入完成需要几毫秒的时间,必须等待后再读取,否则会读到旧数据或无效值。
- 读取前的地址设置:读取前必须先通过写操作指定要读取的起始地址,再发起读请求,这样EEPROM才会从正确的位置返回数据。
内容的提问来源于stack exchange,提问作者Playing with GAS
相关产品推荐
相关产品推荐

