Назад

Pico I2C EEPROM Чтение/Запись: Симуляция энергонезависимой памяти в вашем браузере

Введение

Хотели ли вы когда-нибудь сохранять данные, которые переживут отключение питания? Во встраиваемых системах EEPROM (электрически стираемая программируемая постоянная память) является стандартным решением для энергонезависимого хранения. Сегодня мы смоделируем операцию чтения/записи I2C EEPROM с помощью Raspberry Pi Pico — и всё это в вашем браузере с Velxio. Никакого оборудования не требуется!

Мы запишем несколько байт в EEPROM, прочитаем их обратно и убедимся, что они совпадают. Попутно вы узнаете о протоколе I2C, библиотеке Wire и о том, как отлаживать вывод через последовательный порт. Давайте начнём!

Схема подключения

Откройте пример в Velxio, и вы увидите схему на холсте. Основные компоненты:

Схема pico-i2c-eeprom-rw на холсте симулятора Velxio

Детали подключения

От (пин Pico)К (компоненту)Цвет провода
D12 (GPIO12)Анод красного светодиодаКрасный (#ff4444)
D10 (GPIO10)Анод зелёного светодиодаЗелёный (#00cc00)
Катод красного светодиодаGND.1Чёрный (#000000)
Катод зелёного светодиодаGND.1Чёрный (#000000)

Примечание: В этой симуляции I2C EEPROM является виртуальной — она встроена в среду Velxio. Светодиоды используются как визуальные индикаторы: красный светодиод мигает во время записи, зелёный — во время чтения. В реальной схеме вы бы подключили линии SDA и SCL EEPROM к пинам I2C Pico (по умолчанию GPIO4 и GPIO5, но здесь мы используем D12 и D10 для светодиодов).

Разбор кода

Давайте разберём скетч Arduino. Код использует библиотеку Wire для связи по I2C.

Подключения и определения

#include <Wire.h>

#define EEPROM_ADDR 0x50

Мы подключаем библиотеку Wire и определяем I2C-адрес EEPROM как 0x50. Это распространённый адрес для EEPROM серии 24LC.

Вспомогательные функции

void eepromWrite(byte memAddr, byte data) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(memAddr);
  Wire.write(data);
  Wire.endTransmission();
  delay(5); // Цикл записи EEPROM
}

byte eepromRead(byte memAddr) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(memAddr);
  Wire.endTransmission();
  Wire.requestFrom(EEPROM_ADDR, 1);
  return Wire.available() ? Wire.read() : 0xFF;
}

Setup

void setup() {
  Serial.begin(115200);
  delay(500);
  Wire.begin();
  Serial.println("=== Pico I2C EEPROM Test ===");
  Serial.println();

  // Запись 8 байт
  Serial.println("Writing 8 bytes...");
  byte testData[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE};
  for (int i = 0; i < 8; i++) {
    eepromWrite(i, testData[i]);
    Serial.print("  ["); Serial.print(i);
    Serial.print("] = 0x");
    if (testData[i] < 16) Serial.print('0');
    Serial.println(testData[i], HEX);
  }
  Serial.println();

  // Чтение обратно
  Serial.println("Reading back...");
  int pass = 0;
  for (int i = 0; i < 8; i++) {
    byte val = eepromRead(i);
    Serial.print("  ["); Serial.print(i);
    Serial.print("] = 0x");
    if (val < 16) Serial.print('0');
    Serial.print(val, HEX);
    if (val == testData[i]) {
      Serial.println(" OK");
      pass++;
    } else {
      Serial.print(" FAIL (expected 0x");
      Serial.print(testData[i], HEX);
      Serial.println(")");
    }
  }

  Serial.println();
  Serial.print("Result: ");
  Serial.print(pass);
  Serial.println("/8 passed");
}

Loop

void loop() {
  delay(10000);
}

Ничего повторять не нужно — тест выполняется один раз в setup(). Цикл просто делает задержку, чтобы вывод в последовательный порт оставался видимым.

Ключевые концепции

Частые ошибки и советы по отладке

  1. Неправильный I2C-адрес: Перепроверьте адрес EEPROM. Распространённые адреса: от 0x50 до 0x57 (в зависимости от выводов A0/A1/A2).
  2. Отсутствие подтягивающих резисторов: В реальном оборудовании на линиях SDA и SCL нужны подтягивающие резисторы (4,7 кОм). Виртуальная EEPROM в Velxio обрабатывает это внутренне.
  3. Скорость передачи в мониторе порта: Убедитесь, что монитор последовательного порта настроен на 115200 бод. Несоответствие приводит к нечитаемому выводу.
  4. Время цикла записи: Если пропустить delay(5), EEPROM может не сохранить данные корректно. При необходимости увеличьте задержку.
  5. Светодиоды не мигают: Проверьте подключение. Красный светодиод подключён к D12, зелёный — к D10. Оба катода идут на GND.

Предлагаемые расширения

Попробуйте сами!

Готовы экспериментировать? Откройте живой пример в Velxio:

Запустить Pico I2C EEPROM R/W

Нажмите кнопку Run на панели инструментов редактора, чтобы скомпилировать и запустить симуляцию. Наблюдайте за выводом в консоли — вы должны увидеть, что все 8 байт успешно считаны.

Панель инструментов редактора Velxio с кнопками компиляции и запуска

Используйте панель инструментов холста для масштабирования, панорамирования и осмотра схемы.

Панель инструментов холста Velxio над окном симуляции

Нужно добавить больше компонентов? Откройте палитру компонентов для просмотра деталей.

Модальное окно выбора компонентов Velxio с просмотром деталей по категориям

Удачной симуляции!


Поделиться:
David Montero

Автор

David Montero

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

GitHub velxio.dev

Похожие статьи


Предыдущая статья
Pico SPI Loopback: проверка последовательной связи вашего RP2040
Следующая статья
Чтение виртуальных часов DS1307 RTC через I2C на Raspberry Pi Pico