Введение
Вам когда-нибудь нужно было хранить конфигурационные данные или небольшие объемы энергонезависимой информации в проектах на Arduino? I2C EEPROM — идеальное решение: они дешевы, просты в использовании и требуют всего двух проводов для связи. В этом руководстве мы используем браузерный симулятор Velxio для создания полного теста чтения/записи I2C EEPROM. Вы узнаете, как записывать данные в виртуальную EEPROM по адресу 0x50 и считывать их обратно, проверяя корректность работы.
Velxio предоставляет среду аналогового моделирования с точностью SPICE, поэтому вы можете тестировать код без физического оборудования. Давайте начнем!
Обзор схемы

Схема удивительно проста, так как I2C EEPROM интегрирована в виртуальную среду. Единственный необходимый компонент — Arduino Uno. EEPROM моделируется внутренне и подключается к выводам I2C Arduino (A4 для SDA и A5 для SCL). Внешняя проводка не требуется — симулятор автоматически управляет шиной I2C.
Для сборки схемы:
- Откройте редактор Velxio и добавьте Arduino Uno из палитры компонентов.
- I2C EEPROM уже является частью симуляции; добавлять ее вручную не нужно.
- Код будет взаимодействовать с EEPROM по адресу 0x50.

Arduino Uno можно найти в категории “Микроконтроллеры” в палитре компонентов. После размещения на холсте появится плата, готовая к программированию.
Обзор кода
Давайте рассмотрим скетч Arduino, выполняющий операции чтения/записи. Код написан на C++ с использованием стандартной библиотеки Wire для связи I2C.
// I2C EEPROM Read/Write Test
// Virtual EEPROM at address 0x50
// Writes values to registers, then reads them back.
#include <Wire.h>
#define EEPROM_ADDR 0x50
void writeEEPROM(byte reg, byte value) {
Wire.beginTransmission(EEPROM_ADDR);
Wire.write(reg); // register address
Wire.write(value); // data
Wire.endTransmission();
delay(5); // EEPROM write cycle time
}
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 Test (0x50)");
Serial.println("============================");
Serial.println();
// Write test pattern
Serial.println("Writing test data...");
for (byte i = 0; i < 8; i++) {
byte value = (i + 1) * 10; // 10, 20, 30, ...
writeEEPROM(i, value);
Serial.print(" Write reg[");
Serial.print(i);
Serial.print("] = ");
Serial.println(value);
}
Serial.println();
Serial.println("Reading back...");
// Read back and verify
byte errors = 0;
for (byte i = 0; i < 8; i++) {
byte expected = (i + 1) * 10;
byte actual = readEEPROM(i);
Serial.print(" Read reg[");
Serial.print(i);
Serial.print("] = ");
Serial.print(actual);
if (actual == expected) {
Serial.println(" [OK]");
} else {
Serial.print(" [FAIL] expected ");
Serial.println(expected);
errors++;
}
}
Serial.println();
if (errors == 0) {
Serial.println("All tests PASSED!");
} else {
Serial.print(errors);
Serial.println(" test(s) FAILED.");
}
}
void loop() {
// Nothing to do
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 требуется несколько миллисекунд для внутренней записи данных.
delay(5)вwriteEEPROM()гарантирует завершение записи перед следующей операцией. - Фиктивная запись для чтения: Чтобы прочитать из определенного регистра, сначала отправляется адрес регистра (операция записи), затем выполняется повторный старт или стоп/старт для чтения данных. В коде используется подход стоп/старт.
- Проверка ошибок: Скетч проверяет каждое чтение на соответствие ожидаемому значению — это хорошая практика для тестирования связи.
Частые ошибки и советы по отладке
- Неправильный адрес: Убедитесь, что адрес EEPROM соответствует вашему устройству. Виртуальная EEPROM использует 0x50. Если вы получаете 0xFF, возможно, адрес неверен.
- Отсутствие подтягивающих резисторов: В реальном оборудовании линии I2C требуют подтягивающих резисторов. В Velxio они моделируются внутренне, поэтому добавлять их не нужно.
- Монитор последовательного порта: Используйте монитор последовательного порта в Velxio для просмотра вывода. Нажмите на иконку монитора последовательного порта на панели инструментов.
- Тайминги: Если чтение иногда не удается, увеличьте задержку после записи. Виртуальная EEPROM быстрая, но реальным устройствам может потребоваться больше времени.

Используйте панель инструментов для компиляции и запуска кода. Монитор последовательного порта отобразит результаты теста.
Предлагаемые расширения
- Запись больших данных: Измените код для записи и чтения строки или массива байтов.
- Страничная запись: Многие EEPROM поддерживают страничную запись (запись нескольких байтов за одну транзакцию). Попробуйте реализовать это.
- Внешняя EEPROM: Добавьте физический компонент EEPROM (если доступен в Velxio) и подключите его к Arduino.
- Логирование данных: Используйте EEPROM для хранения показаний датчиков и их последующего извлечения.
Заключение
Вы успешно создали тест чтения/записи I2C EEPROM в Velxio! Этот проект демонстрирует основы связи I2C и энергонезависимой памяти. Виртуальная среда позволяет легко экспериментировать без оборудования. Теперь попробуйте расширить код или интегрировать его в более крупный проект.
Готовы создать свой собственный? Откройте живой пример в Velxio и начинайте кодировать: Пример чтения/записи I2C EEPROM. Удачного моделирования!