返回

使用Arduino进行I2C EEPROM读写:完整指南

引言

你是否曾在Arduino项目中需要存储配置数据或少量非易失性信息?I2C EEPROM是一个完美的解决方案——它们价格低廉、易于使用,且仅需两根线即可通信。在本教程中,我们将使用Velxio在线仿真器构建一个完整的I2C EEPROM读写测试。你将学习如何向地址为0x50的虚拟EEPROM写入数据,并读取回来以验证一切正常。

Velxio提供了SPICE精度的模拟仿真环境,因此你无需任何物理硬件即可测试代码。让我们开始吧!

电路详解

Velxio仿真器画布上i2c-eeprom-rw的电路图

该电路非常简单,因为I2C EEPROM已集成到虚拟环境中。我们唯一需要的组件是一个Arduino Uno。EEPROM在内部模拟,并连接到Arduino的I2C引脚(A4用于SDA,A5用于SCL)。无需外部接线——仿真器会自动处理I2C总线。

搭建电路步骤如下:

  1. 打开Velxio编辑器,从组件选择器中添加一个Arduino Uno。
  2. I2C EEPROM已包含在仿真中,无需手动添加。
  3. 代码将与地址为0x50的EEPROM通信。

Velxio组件选择器模态框,按类别浏览零件

你可以在组件选择器的“微控制器”类别下找到Arduino Uno。放置后,画布上将显示已准备好编程的板子。

代码详解

让我们分析执行读写操作的Arduino草图。代码使用C++编写,并采用标准的Wire库进行I2C通信。

// I2C EEPROM 读写测试
// 虚拟EEPROM地址为0x50
// 向寄存器写入值,然后读取回来。

#include <Wire.h>

#define EEPROM_ADDR 0x50

void writeEEPROM(byte reg, byte value) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(reg);    // 寄存器地址
  Wire.write(value);  // 数据
  Wire.endTransmission();
  delay(5); // EEPROM写入周期时间
}

byte readEEPROM(byte reg) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(reg);
  Wire.endTransmission();

  Wire.requestFrom(EEPROM_ADDR, 1);
  if (Wire.available()) {
    return Wire.read();
  }
  return 0xFF;
}

void setup() {
  Wire.begin();
  Serial.begin(9600);

  Serial.println("============================");
  Serial.println(" I2C EEPROM R/W 测试 (0x50)");
  Serial.println("============================");
  Serial.println();

  // 写入测试模式
  Serial.println("正在写入测试数据...");
  for (byte i = 0; i < 8; i++) {
    byte value = (i + 1) * 10;  // 10, 20, 30, ...
    writeEEPROM(i, value);
    Serial.print("  写入 reg[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.println(value);
  }

  Serial.println();
  Serial.println("正在读取回来...");

  // 读取并验证
  byte errors = 0;
  for (byte i = 0; i < 8; i++) {
    byte expected = (i + 1) * 10;
    byte actual = readEEPROM(i);
    Serial.print("  读取 reg[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.print(actual);

    if (actual == expected) {
      Serial.println("  [OK]");
    } else {
      Serial.print("  [失败] 期望值 ");
      Serial.println(expected);
      errors++;
    }
  }

  Serial.println();
  if (errors == 0) {
    Serial.println("所有测试通过!");
  } else {
    Serial.print(errors);
    Serial.println(" 个测试失败。");
  }
}

void loop() {
  // 无需操作
  delay(1000);
}

代码工作原理

学生关键概念

  1. I2C协议:I2C使用两根线(SDA和SCL)和一个7位地址与多个设备通信。EEPROM地址0x50在许多AT24C系列芯片中很常见。
  2. EEPROM写入周期:EEPROM需要几毫秒来内部写入数据。writeEEPROM()中的delay(5)确保写入在下一次操作前完成。
  3. 读取的虚拟写入:要从特定寄存器读取,首先发送寄存器地址(一个写入操作),然后发出重复启动或停止/启动来读取数据。代码使用了停止/启动方法。
  4. 错误检查:草图将每次读取与期望值进行验证,这是测试通信的良好实践。

常见陷阱与调试技巧

Velxio编辑器工具栏,包含编译和运行控件

使用工具栏编译和运行代码。串行监视器将显示测试结果。

建议扩展

  1. 写入更大数据:修改代码以写入和读取字符串或字节数组。
  2. 页写入:许多EEPROM支持页写入(一次事务写入多个字节)。尝试实现它。
  3. 外部EEPROM:添加一个物理EEPROM组件(如果Velxio中可用)并将其连接到Arduino。
  4. 数据记录:使用EEPROM存储传感器读数并在以后检索。

结论

你已成功在Velxio中构建了一个I2C EEPROM读写测试!该项目展示了I2C通信和非易失性存储器的基础知识。虚拟环境使得无需硬件即可轻松实验。现在,尝试扩展代码或将其集成到更大的项目中。

准备好构建你自己的项目了吗?在Velxio中打开实时示例并开始编码:I2C EEPROM读写示例。祝仿真愉快!


分享到:
David Montero

作者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

相关文章


上一篇
SPI 回环测试:使用 Velxio 掌握协议
下一篇
在 Velxio 上使用 DS1307 的 I2C RTC 时钟