You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino驱动24LC256 EEPROM读取值始终为255的问题求助

问题分析与解决建议

核心问题

你的代码完全不符合24LC256 EEPROM的I2C通信协议,导致读写操作失效:

  1. 写入操作错误:24LC256是16位地址的EEPROM,写入时必须先发送16位内存地址(高8位+低8位),再发送数据。你现在只发送了数据9,没有指定写入的内存位置,相当于操作无效。
  2. 读取操作错误:读取时未指定起始内存地址,此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:40:25