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

使用Arduino读写EERAM 5V Click模块异常:写入01010101读出11111111

Arduino读写EERAM 5V Click模块异常(写入0x55读出0xFF)排查与解决

核心问题分析

写入二进制01010101(0x55)后读出始终为11111111(0xFF),通常说明读取未访问到有效存储单元、写入操作未执行,或是硬件/协议配置存在错误,以下是具体排查点和解决方案:

1. 存储地址格式错误(最可能原因)

EERAM 47L04/47C04(512字节)、47L16/47C16(2048字节)的存储地址为16位,但你的代码仅发送了1个字节的地址,设备无法定位到正确存储单元,读取到的是无效地址的默认值0xFF。

解决方案:修改读写函数支持16位地址

#include <Wire.h>

const uint8_t deviceAddress = 0x50;
const uint16_t registerAddress = 0x0001; // 改为16位地址
const uint8_t dataToWrite = 0b01010101;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  writeData(registerAddress, dataToWrite);
  storeData(); // 触发非易失存储(按需调用)
  delay(50);
}

void loop() {
  readData(registerAddress);
  delay(2000);
}

void writeData(uint16_t addr, uint8_t data) {
  Wire.beginTransmission(deviceAddress);
  Wire.write((addr >> 8) & 0xFF); // 发送地址高字节
  Wire.write(addr & 0xFF);        // 发送地址低字节
  Wire.write(data);
  if (Wire.endTransmission() != 0) {
    Serial.println("Error: Write failed!");
  } else {
    Serial.print("Written Data: 0b");
    Serial.println(data, BIN);
  }
}

void readData(uint16_t addr) {
  Wire.beginTransmission(deviceAddress);
  Wire.write((addr >> 8) & 0xFF);
  Wire.write(addr & 0xFF);
  if (Wire.endTransmission(false) != 0) { // 保持总线连接
    Serial.println("Error: Address transmission failed!");
    return;
  }

  Wire.requestFrom(deviceAddress, 1);
  if (Wire.available()) {
    uint8_t receivedByte = Wire.read();
    Serial.print("Received Data: 0b");
    Serial.println(receivedByte, BIN);
  } else {
    Serial.println("No data available.");
  }
}

// 手动触发SRAM到EEPROM的存储(NV引脚接低电平时需要)
void storeData() {
  Wire.beginTransmission(deviceAddress);
  Wire.write(0x00); // 命令寄存器高字节地址
  Wire.write(0x00); // 命令寄存器低字节地址
  Wire.write(0x01); // Store命令
  Wire.endTransmission();
  delay(10); // 等待存储完成(至少5ms)
}

2. I2C设备地址验证

EERAM的I2C地址由A0/A1引脚决定,默认模块跳线可能改变地址:

  • 用I2C扫描代码确认设备是否存在,地址是否为0x50:
#include <Wire.h>
void setup() {
  Wire.begin();
  Serial.begin(9600);
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.print("I2C device found at address 0x");
      Serial.println(addr, HEX);
    }
  }
}
void loop() {}

3. 硬件连接与供电检查

  • 确认模块供电为5V(EERAM 5V Click不支持3.3V);
  • 检查SDA/SCL引脚是否接对(Arduino Uno对应A4/A4,其他板型需核对);
  • 若连接不稳定,在SDA/SCL与VCC之间添加4.7KΩ上拉电阻。

4. 非易失存储配置

EERAM的SRAM数据掉电丢失,需确保数据被保存到EEPROM:

  • 若模块NV引脚接高电平,数据自动备份;
  • 若NV引脚接低电平,需在写入后调用上述storeData()函数手动触发存储。

内容的提问来源于stack exchange,提问作者formlessform

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:15:55