Оглавление:

Чтение и запись данных во внешнюю EEPROM с помощью Arduino: 5 шагов
Чтение и запись данных во внешнюю EEPROM с помощью Arduino: 5 шагов

Видео: Чтение и запись данных во внешнюю EEPROM с помощью Arduino: 5 шагов

Видео: Чтение и запись данных во внешнюю EEPROM с помощью Arduino: 5 шагов
Видео: Уроки Arduino. Работа с EEPROM памятью 2024, Июль
Anonim
Чтение и запись данных во внешнюю EEPROM с помощью Arduino
Чтение и запись данных во внешнюю EEPROM с помощью Arduino

EEPROM - это электрически стираемая программируемая постоянная память.

EEPROM очень важна и полезна, потому что это энергонезависимая форма памяти. Это означает, что даже когда плата выключена, микросхема EEPROM все еще сохраняет программу, которая была записана на нее. Таким образом, когда вы выключите плату, а затем снова включите ее, программа, записанная в EEPROM, может быть запущена. По сути, EEPROM хранит и запускает программу, несмотря ни на что. Это означает, что вы можете выключить устройство, оставить его выключенным в течение 3 дней, а затем вернуться и включить его, и оно все еще может запускать программу, которая была запрограммирована на нем. Так работает большинство бытовых электронных устройств.

Этот проект спонсируется LCSC. Я использовал электронные компоненты от LCSC.com. LCSC стремится предлагать широкий выбор подлинных высококачественных электронных компонентов по лучшей цене с глобальной сетью доставки в более чем 200 стран. Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ.

EEPROM также очень эффективен в том смысле, что отдельные байты в традиционном EEPROM можно независимо читать, стирать и перезаписывать. В большинстве других видов энергонезависимой памяти это невозможно. Устройства с последовательным EEPROM, такие как Microchip 24-series EEPROM, позволяют добавить больше памяти к любому устройству, которое может говорить на I²C.

Запасы

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. Кристалл 16 МГц
  4. Макетная плата
  5. Резистор 4,7 кОм x 2
  6. Конденсатор 22 пФ x 2

Шаг 1: Основы EEPROM

Основы EEPROM
Основы EEPROM

Микросхему Microchip 24LC2512 можно приобрести в 8-контактном DIP-корпусе. Контакты на 24LC512 довольно просты и состоят из питания (8), GND (4), защиты от записи (7), SCL / SDA (6, 5) и трех адресных контактов (1, 2, 3).

Краткая история ROM

Ранние компьютеры типа «хранимой программы», такие как настольные калькуляторы и клавишные интерпретаторы, начали использовать ПЗУ в форме ПЗУ диодной матрицы. Это была память, состоящая из дискретных полупроводниковых диодов, размещенных на специально организованной печатной плате. Это уступило место Mask ROM с появлением интегральных схем. ПЗУ маски было очень похоже на ПЗУ диодной матрицы, только оно было реализовано в гораздо меньшем масштабе. Однако это означало, что вы не могли просто переместить пару диодов с помощью паяльника и перепрограммировать их. ПЗУ маски должно было быть запрограммировано производителем и после этого не подлежало изменению.

К сожалению, Mask ROM стоил дорого и требовал много времени для производства, потому что каждая новая программа требовала производства нового устройства на литейном заводе. Однако в 1956 году эта проблема была решена с изобретением PROM (Программируемое ПЗУ), которое позволило разработчикам самостоятельно программировать микросхемы. Это означало, что производители могли производить миллионы таких же незапрограммированных устройств, что делало их более дешевыми и практичными. Однако PROM можно было записать только один раз с помощью высоковольтного программатора. После того, как устройство PROM было запрограммировано, не было возможности вернуть его в незапрограммированное состояние.

Это изменилось в 1971 году с изобретением EPROM (Erasable Programmable ROM), которое, помимо добавления еще одной буквы к аббревиатуре, принесло с собой возможность стереть данные с устройства и вернуть его в «пустое» состояние с использованием сильного источника ультрафиолетового света. Правильно, нужно было посветить ярким светом на ИС, чтобы перепрограммировать ее, как это круто? Что ж, это довольно круто, если вы не разработчик, работающий над прошивкой, и в этом случае вы действительно хотели бы иметь возможность перепрограммировать устройство с помощью электрических сигналов. Это, наконец, стало реальностью в 1983 году с разработкой EEPROM (электрически стираемое программируемое ПЗУ), и с этим мы пришли к громоздкой аббревиатуре сегодняшнего дня.

Шаг 2: Причуды EEPROM

У EEPROM как метода хранения данных есть два основных недостатка. В большинстве приложений плюсы перевешивают минусы, но вы должны знать о них, прежде чем включать EEPROM в вашу следующую конструкцию.

Прежде всего, технология, которая заставляет EEPROM работать, также ограничивает количество раз, когда она может быть перезаписана. Это связано с тем, что электроны захватываются транзисторами, составляющими ПЗУ, и накапливаются до тех пор, пока разница зарядов между «1» и «0» не станет неузнаваемой. Но не волнуйтесь, большинство EEPROM имеют максимальное количество перезаписей 1 миллион или больше. Пока вы не записываете постоянно в EEPROM, маловероятно, что вы достигнете этого максимума. Во-вторых, EEPROM не будет удален, если вы отключите от него питание, но он не будет хранить ваши данные бесконечно. Электроны могут выходить из транзисторов через изолятор, эффективно стирая EEPROM с течением времени. Тем не менее, это обычно происходит в течение многих лет (хотя это может ускориться из-за тепла). Большинство производителей говорят, что ваши данные хранятся в EEPROM в течение 10 или более лет при комнатной температуре. И есть еще одна вещь, которую вы должны иметь в виду при выборе устройства EEPROM для вашего проекта. Емкость EEPROM измеряется в битах, а не в байтах. EEPROM 512 КБ будет содержать 512 КБ данных, другими словами, всего 64 КБ.

Шаг 3: Подключение оборудования Arduino

Подключение оборудования Arduino
Подключение оборудования Arduino
Подключение оборудования Arduino
Подключение оборудования Arduino

Хорошо, теперь, когда мы знаем, что такое EEPROM, давайте подключим один и посмотрим, на что он способен! Чтобы наше устройство разговаривало, нам нужно подключить питание, а также последовательные линии I²C. Это устройство, в частности, работает от 5 В постоянного тока, поэтому мы подключим его к выходу 5 В нашей Arduino UNO. Кроме того, для правильной связи линий I²C потребуются подтягивающие резисторы. Номинал этих резисторов зависит от емкости линий и частоты, которую вы хотите передать, но хорошее практическое правило для некритичных приложений - просто держать ее в диапазоне кОм. В этом примере мы будем использовать подтягивающие резисторы 4,7 кОм.

На этом устройстве есть три контакта для выбора адреса I²C, таким образом, вы можете иметь более одного EEPROM на шине и адресовать их по-разному. Вы можете просто заземлить их все, но мы подключим их, чтобы позже в этом руководстве мы могли подключить устройство большей емкости.

Мы будем использовать макетную плату, чтобы соединить все вместе. На приведенной ниже схеме показано правильное подключение для большинства устройств I²C EEPROM, включая EEPROM Microchip 24-й серии, которые мы продаем.

Шаг 4: чтение и письмо

В большинстве случаев, когда вы используете EEPROM вместе с микроконтроллером, вам не нужно сразу видеть все содержимое памяти. Вы просто будете читать и писать байты здесь и там по мере необходимости. В этом примере, однако, мы собираемся записать весь файл в EEPROM, а затем прочитать его обратно, чтобы мы могли просмотреть его на нашем компьютере. Это должно нас освоить с идеей использования EEPROM, а также дать нам представление о том, сколько данных действительно может поместиться на маленьком устройстве.

Напиши что-нибудь

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

Запись байта памяти в EEPROM обычно происходит в три этапа:

  1. Отправьте старший байт адреса памяти, в который вы хотите записать.
  2. Отправьте младший байт адреса памяти, в который вы хотите записать.
  3. Отправьте байт данных, который вы хотите сохранить в этом месте.

Вероятно, здесь есть несколько ключевых слов, которые просто объясняют:

Адреса памяти

Если вы представите себе, что все байты в EEPROM 512 Кбит стоят в строке от 0 до 64000 - потому что в байте 8 бит, и, следовательно, вы можете уместить 64000 байтов в EEPROM 512 Кбит - тогда адрес памяти - это место в строка, в которой вы найдете конкретный байт. Нам нужно отправить этот адрес в EEPROM, чтобы он знал, куда поместить байт, который мы отправляем.

Старшие и младшие байты

Поскольку существует 32000 возможных мест в EEPROM емкостью 256 Кбит - и поскольку 255 - это наибольшее число, которое вы можете закодировать в одном байте, - нам нужно отправить этот адрес в двух байтах. Сначала мы отправляем старший байт (MSB) - в данном случае первые 8 бит. Затем мы отправляем младший байт (LSB) - вторые 8 бит. Почему? Потому что именно так устройство их ожидает, вот и все.

Написание страницы

Запись по одному байту - это нормально, но большинство устройств EEPROM имеют так называемый «буфер записи страницы», который позволяет записывать несколько байтов за раз так же, как и один байт. Мы воспользуемся этим в нашем примере скетча. EEPROM использует внутренний счетчик, который автоматически увеличивает размер памяти с каждым последующим байтом данных, который он получает. После того, как адрес памяти был отправлен, мы можем отслеживать до 64 байтов данных. EEPROM предполагает (справедливо), что адрес 312, за которым следуют 10 байтов, будет записывать байт 0 по адресу 312, байт 1 по адресу 313, байт 2 по адресу 314 и так далее.

Прочтите что-нибудь

Чтение из EEPROM в основном следует тому же трехэтапному процессу, что и запись в EEPROM:

  1. Отправьте старший байт адреса памяти, в который вы хотите записать.
  2. Отправьте младший байт адреса памяти, в который вы хотите записать.
  3. Запросите байт данных в этом месте.

Шаг 5: Схема и код

Схема и код
Схема и код

Код:

#включают

#define eeprom 0x50 // определяет базовый адрес EEPROM

void setup () {

Wire.begin (); // создает объект Wire

Serial.begin (9600);

беззнаковый адрес int = 0; // первый адрес EEPROM

Serial.println («Пишем почтовый индекс 22222, почтовый индекс»); для (адрес = 0; адрес <5; адрес ++) запись EEPROM (eeprom, адрес, '2'); // Записывает 22222 в EEPROM

for (адрес = 0; адрес <5; адрес ++) {Serial.print (чтение EEPROM (eeprom, адрес), HEX); }}

void loop () {

/ * в функции loop () ничего нет, потому что мы не хотим, чтобы arduino многократно записывал одно и то же в EEPROM снова и снова. Нам просто нужна однократная запись, поэтому функция loop () избегается с помощью EEPROM. * /}

// определяет функцию writeEEPROM

void writeEEPROM (int deviceaddress, int eeaddress без знака, байтовые данные) {Wire.beginTransmission (deviceaddress); Wire.write ((int) (eeaddress >> 8)); // записывает MSB Wire.write ((int) (eeaddress & 0xFF)); // записывает младший бит Wire.write (data); Wire.endTransmission (); }

// определяет функцию readEEPROM

байт readEEPROM (int deviceaddress, unsigned int eeaddress) {byte rdata = 0xFF; Wire.beginTransmission (адрес устройства); Wire.write ((int) (eeaddress >> 8)); // записывает MSB Wire.write ((int) (eeaddress & 0xFF)); // записывает младший бит Wire.endTransmission (); Wire.requestFrom (адрес устройства, 1); если (Wire.available ()) rdata = Wire.read (); вернуть rdata; }

Рекомендуемые: