Назад

Чтение/запись I2C EEPROM с Arduino: Полное руководство

Введение

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

Velxio предоставляет среду аналогового моделирования с точностью SPICE, поэтому вы можете тестировать код без физического оборудования. Давайте начнем!

Обзор схемы

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

Схема удивительно проста, так как I2C EEPROM интегрирована в виртуальную среду. Единственный необходимый компонент — Arduino Uno. EEPROM моделируется внутренне и подключается к выводам I2C Arduino (A4 для SDA и A5 для SCL). Внешняя проводка не требуется — симулятор автоматически управляет шиной I2C.

Для сборки схемы:

  1. Откройте редактор Velxio и добавьте Arduino Uno из палитры компонентов.
  2. I2C EEPROM уже является частью симуляции; добавлять ее вручную не нужно.
  3. Код будет взаимодействовать с EEPROM по адресу 0x50.

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

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);
}

Как работает код

Ключевые концепции для студентов

  1. Протокол I2C: I2C использует два провода (SDA и SCL) и 7-битный адрес для связи с несколькими устройствами. Адрес EEPROM 0x50 распространен для многих микросхем серии AT24C.
  2. Цикл записи EEPROM: EEPROM требуется несколько миллисекунд для внутренней записи данных. delay(5) в writeEEPROM() гарантирует завершение записи перед следующей операцией.
  3. Фиктивная запись для чтения: Чтобы прочитать из определенного регистра, сначала отправляется адрес регистра (операция записи), затем выполняется повторный старт или стоп/старт для чтения данных. В коде используется подход стоп/старт.
  4. Проверка ошибок: Скетч проверяет каждое чтение на соответствие ожидаемому значению — это хорошая практика для тестирования связи.

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

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

Используйте панель инструментов для компиляции и запуска кода. Монитор последовательного порта отобразит результаты теста.

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

  1. Запись больших данных: Измените код для записи и чтения строки или массива байтов.
  2. Страничная запись: Многие EEPROM поддерживают страничную запись (запись нескольких байтов за одну транзакцию). Попробуйте реализовать это.
  3. Внешняя EEPROM: Добавьте физический компонент EEPROM (если доступен в Velxio) и подключите его к Arduino.
  4. Логирование данных: Используйте EEPROM для хранения показаний датчиков и их последующего извлечения.

Заключение

Вы успешно создали тест чтения/записи I2C EEPROM в Velxio! Этот проект демонстрирует основы связи I2C и энергонезависимой памяти. Виртуальная среда позволяет легко экспериментировать без оборудования. Теперь попробуйте расширить код или интегрировать его в более крупный проект.

Готовы создать свой собственный? Откройте живой пример в Velxio и начинайте кодировать: Пример чтения/записи I2C EEPROM. Удачного моделирования!


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

Автор

David Montero

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

GitHub velxio.dev

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


Предыдущая статья
SPI-тест с обратной связью: Освойте протокол с Velxio
Следующая статья
Часы реального времени I2C с DS1307 на Velxio