使用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
相关产品推荐
相关产品推荐

