引言
你是否曾在Arduino项目中需要存储配置数据或少量非易失性信息?I2C EEPROM是一个完美的解决方案——它们价格低廉、易于使用,且仅需两根线即可通信。在本教程中,我们将使用Velxio在线仿真器构建一个完整的I2C EEPROM读写测试。你将学习如何向地址为0x50的虚拟EEPROM写入数据,并读取回来以验证一切正常。
Velxio提供了SPICE精度的模拟仿真环境,因此你无需任何物理硬件即可测试代码。让我们开始吧!
电路详解

该电路非常简单,因为I2C EEPROM已集成到虚拟环境中。我们唯一需要的组件是一个Arduino Uno。EEPROM在内部模拟,并连接到Arduino的I2C引脚(A4用于SDA,A5用于SCL)。无需外部接线——仿真器会自动处理I2C总线。
搭建电路步骤如下:
- 打开Velxio编辑器,从组件选择器中添加一个Arduino Uno。
- I2C EEPROM已包含在仿真中,无需手动添加。
- 代码将与地址为0x50的EEPROM通信。

你可以在组件选择器的“微控制器”类别下找到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);
}
代码工作原理
writeEEPROM(reg, value):此函数将寄存器地址和数据字节发送到EEPROM。它使用Wire.beginTransmission()、Wire.write()和Wire.endTransmission()。5毫秒的延迟模拟了EEPROM的写入周期时间。readEEPROM(reg):首先,它向EEPROM发送寄存器地址(一个“虚拟写入”),然后使用Wire.requestFrom()请求一个字节。如果数据可用,则读取并返回;否则返回0xFF。setup():初始化Wire库和串行通信。它将测试模式(10, 20, 30, …)写入寄存器0到7,然后读取回来并与期望值比较。任何不匹配都会增加错误计数器。loop():为空,带有一个小延迟以保持板子活跃。
学生关键概念
- I2C协议:I2C使用两根线(SDA和SCL)和一个7位地址与多个设备通信。EEPROM地址0x50在许多AT24C系列芯片中很常见。
- EEPROM写入周期:EEPROM需要几毫秒来内部写入数据。
writeEEPROM()中的delay(5)确保写入在下一次操作前完成。 - 读取的虚拟写入:要从特定寄存器读取,首先发送寄存器地址(一个写入操作),然后发出重复启动或停止/启动来读取数据。代码使用了停止/启动方法。
- 错误检查:草图将每次读取与期望值进行验证,这是测试通信的良好实践。
常见陷阱与调试技巧
- 地址错误:确保EEPROM地址与你的设备匹配。虚拟EEPROM使用0x50。如果读取到0xFF,地址可能错误。
- 缺少上拉电阻:在实际硬件中,I2C线需要上拉电阻。在Velxio中,它们已在内部模拟,因此无需添加。
- 串行监视器:使用Velxio中的串行监视器查看输出。点击工具栏中的串行监视器图标。
- 时序问题:如果读取间歇性失败,增加写入后的延迟。虚拟EEPROM速度很快,但实际设备可能需要更多时间。

使用工具栏编译和运行代码。串行监视器将显示测试结果。
建议扩展
- 写入更大数据:修改代码以写入和读取字符串或字节数组。
- 页写入:许多EEPROM支持页写入(一次事务写入多个字节)。尝试实现它。
- 外部EEPROM:添加一个物理EEPROM组件(如果Velxio中可用)并将其连接到Arduino。
- 数据记录:使用EEPROM存储传感器读数并在以后检索。
结论
你已成功在Velxio中构建了一个I2C EEPROM读写测试!该项目展示了I2C通信和非易失性存储器的基础知识。虚拟环境使得无需硬件即可轻松实验。现在,尝试扩展代码或将其集成到更大的项目中。
准备好构建你自己的项目了吗?在Velxio中打开实时示例并开始编码:I2C EEPROM读写示例。祝仿真愉快!