Ардуино eeprom: Работа с EEPROM памятью

Программатор для EPROM на Arduino / Хабр

Понадобилось при изучении и ремонте компьютеров, которые старше меня, прошивать ПЗУшки. Тесты оперативной памяти и периферии проводить. Нормального программатора у меня на тот момент не было.

Собрать на логике для LPT порта, конечно, можно, но данный вариант был отброшен, так как для использования пришлось бы включать ещё какого-нибудь старичка. В современных компах все ещё встречается данный интерфейс (правда не полноценный разъем, а на гребенке) да и купить плату в PCI слот тоже не проблема, но возникают уже сложности с софтом. Он был написан очень давно, когда работа с портами ввода/вывода в операционных системах велась иначе. Соответственно, в современных версиях Windows ПО не будет работать.

Сразу стоит оговориться, что про существование TL866 знаю. И даже в процессе разработки все же его купил себе, но он не в состоянии прошить микросхемы, которые требуют высокое напряжение программирования. Максимум 18 вольт (TL866+ или 21 для предыдущей версии).

Беглое гугление привело меня к данному репозиторию. Собрав программатор, я смог сдампить пару интересующих чипов. А вот с прошивкой все оказалось куда сложнее… Софт этого просто не умеет… Его, конечно, можно обмануть, выставив неправильный чип, но работает это не во всех случаях и явно не наш метод

Очень сильно огорчил пользовательский интерфейс, который, вместо классического варианта с предоставлением права выбора порта пользователю, проходился по всем доступным последовательным интерфейсам. Соответственно, все устройства перезагружаются. Особенно обидно, наверное, когда у тебя 3D принтер уже часов 10 печатает детальку с флешки, а тут такая подстава…

Мир OpenSource прекрасен тем, что ты можешь взять проект и дописать его под свою задачу. В данном случае исходных кодов к графическому интерфейсу нет. По крайней мере я их не нашел, хотя можно было написать разработчику. Стало интересно и появился небольшой повод для изучения Qt. Так что софт будет кросплатформенный.

Берем за основу схему из предыдущего проекта и дорабатываем устройство до требуемого функционала. Решил пожертвовать поддержкой EEPROM в софте. Возможно, это не совсем удачное решение, но для электрически стираемых чипов уже не нужно такое высокое напряжение. При доработке опирался на самую объемную микросхему (27C512 для DIP28) и убрал всю путаницу относительно адресных ножек. Весь адрес будет задаваться исключительно при помощи сдвиговых регистров (74HC595). Это освободит дополнительные ноги самого микроконтроллера, которые понадобятся для управления подачей напряжения программирования. А все необходимые сигналы (PRG) можно получить модификацией адреса перед загрузкой в регистры.

Принцип подачи напряжения программирования остался прежним. Изменения только в области защиты выводов микроконтроллера и сдвиговых регистров. Заменил резисторы (1 КОм) на диоды с подтяжкой к лог. 0. Это менее агрессивный вариант. Хотя, справедливости ради, и резисторы работают.

Изучив документацию на все интересующие чипы, определил, что требуется три точки подачи Vpp:

  1. 27C16 на 21 ногу микросхемы (23 ногу DIP28 сокета)
  2. 27C32 и 27C512 на сигнал #OE (Output Enable)
  3. 27C64, 27C128, 27C256 на 1 ногу микросхем

Микросхемы 27C16 и 27C32 от остальных отличаются корпусом, так что им требуется подавать напряжение питания на 26 ножку сокета. Это адресная нога A13 для более емких собратьев. Тока с выхода сдвигового регистра должно хватить для работы, но на время загрузки данных его выходы переходят в Z состояние. Подобный режим допустим, но включение на чтение или запись одной ячейки вряд ли является нормой. Поэтому под управление питания установлен дополнительный транзистор. И ещё один потребовался для 27C16, которому на время чтения необходимо подать на вход Vpp 5 вольт. Можно, конечно, на время чтения выставить напряжение программирования на значения 5 вольт, но переключаться между 25 и 5 вольтами неудобно.

Если есть свободные ноги АЦП, то почему бы не измерять напряжение программирования? Плата разведена под Arduino Nano. На нем имеются два дополнительных входа, которые кроме как для АЦП использовать нельзя. На самом деле это особенность многих микроконтроллеров AVR в корпусе для поверхностного монтажа. На китайских Arduino UNO частенько есть входы A6 и A7. С учетом того, что напряжение может быть до 30 вольт (вроде больше всего хотят отечественные РФ5, 25 вольт), рассчитываем делитель из того, что есть в наличии. Точность в 0.5 вольта для данной задачи вполне достаточна. Эта функция — защита от дурака, а не вольтметр.

Можно, конечно, было заморочиться и выступать в качестве ШИР (широтно импульсное регулирование) контроллера, но ножек свободных не осталось. Поэтому на печатной плате есть посадочное место для преобразователя DC-DC Step Up на чипе MT3608, которые за копейки доступны на али.

По схеме на этом все.


Алгоритм работы с данными микросхемами очень прост. С ним можно ознакомится в небольшом видео.

Схемы и софт доступны в репозитории на GitHub: https://github.com/walhi/arduino_eprom27_programmer. При сборке можно спокойно менять номиналы резисторов. Правда с делителем потребуется немножко исправить код скетча.

Внутрисхемный программатор 3.3V SPI EEPROM из Arduino

EEPROM 25 серии в наше время не редкость. Программаторы на основе Ch441 для них — тоже, и стоят недорого, но не всегда оказываются под руками в нужный момент.
Что делать, когда прошить микросхему надо срочно, а нечем?


Можно собрать программатор под LPT порт:

Он прост и предельно дешёв, вот только LPT в современном компьютере встречается уже примерно никогда.
Если под руками есть старый ПК с таким портом — повезло, иначе придётся искать другие варианты.
Например, можно воспользоваться Arduino.
Обычно для такого применения рекомендуют использовать довольно редкую Arduino Micro Pro на основе МК ATMega32U4, но можно обойтись и намного более дешёвой китайской Arduino Nano V3:

Так как память 25 серии рассчитана на питание напряжением 3,3В, а МК в Arduino питается напряжением 5 В, то плату придётся немного доработать, чтобы не сжечь микросхему памяти:

Перевернём плату Arduino нижней стороной вверх:

Диод Шоттки, обозначенный на принципиальной схеме D1, нужно аккуратно отпаять и заменить на стабилизатор напряжения 3,3В типа 1117 или аналогичный:

Стабилизатор напряжения можно добыть из негодной ЖК матрицы от настольного монитора, вырезав его оттуда вместе с куском платы и обвязкой из конденсаторов.
Только предварительно проверьте его выходное напряжение — иногда они в матрицах попадаются на 1,8В или 2,5В — нам такое не пойдёт. Матрица от ноутбука тоже не подойдёт — она вся питается напряжением 3,3В и дополнительного внутреннего стабилизатора этого напряжения в них нет.
Припаиваем провода к контактам D10, D11, D12, D13, 5V, GND платы Arduino, дополнительный стабилизатор изолируем и прикрепляем к ней каптоновым скотчем:
:
Интерфейс SPI довольно скоростной, поэтому провода длиннее 5-7 см делать не надо — меньше будет проблем с помехами.
На этом аппаратная часть программатора готова — пора переходить к программной.
Создаём на жёстком диске папку, в которую кидаем прошивку программатора, распаковываем программу XLoader, прошивку целевого устройства и программу FlashROM.
Запускаем XLoader, указываем в нем тип используемого в Arduino МК, порт, к которому она подключена и файл «frser-duino.hex»:

Нажимаем кнопку Upload и, если все в порядке, в нижней строке будет сообщение «1368 bytes uploaded». Загрузчик Arduino при этом затирается и если захотите вернуть плату в исходноесостояние — его надо будет восстанавливать.
Для проверки программатора сначала нужно измерить напряжение на выводах D10 и D11, оно должно равняться напряжению питания(3,3В).
Затем запускаем командную строку и вводим следующее:

c:\rcv\mingw32-w64-flashrom-r1781.exe --programmer serprog:dev=COM3:115200

Если все работает нормально, должен получиться ответ:

flashrom v0.9.7-r1781 on Windows 6.1 (x86)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "frser-duino"
Found Generic flash chip "unknown SPI chip (RDID)" (0 kB, SPI) on serprog.
===
This flash part has status NOT WORKING for operations: PROBE READ ERASE WRITE
The test status of this chip may have been updated in the latest development
version of flashrom.
If you are running the latest development version, please email a report to [email protected] if any of the above operations work correctly for you with this flash part. Please include the flashrom output with the additional -V option for all operations you tested (-V, -Vr, -VE, -Vw), and mention which mainboard or programmer you tested. Please mention your board in the subject line. Thanks for your help! No operations were specified.

Наличие строки «serprog: Programmer name is „frser-duino“ свидетельствует о том, что программатор воспринимается программой и можно отключить его от USB и подключать его к целевому устройству.
Если прошиваемая микросхема припаяна напрямую к плате, то провода от программатора можно паять напрямую к её выводам согласно рисунку:

Если она съёмная, то к проводам для программатора можно припаять панельку:

При этом надо дополнительно соединить на панельке перемычками выводы 3,7 и 8.
Подключив программатор к микросхеме и USB, набираем в командной строке:

c:\rcv\mingw32-w64-flashrom-r1781.exe --programmer serprog:dev=COM3:115200 -c MX25L1605 -w c:\rcv\firmware.hex

Наименование микросхемы памяти надо указывать точно, иначе программа откажется её прошивать.
Результат работы должен быть таким:

flashrom v0.9.7-r1781 on Windows 6.1 (x86)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "frser-duino"
Found Macronix flash chip "MX25L1605" (2048 kB, SPI) on serprog.
Reading old flash chip contents... done.
Erasing and writing flash chip...
Warning: Chip content is identical to the requested image.
Erase/write done.

После этого можно отключать питание и отпаивать провода — процедура прошивки успешно завершена.

Как использовать внутреннюю EEPROM Arduino?

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

В дополнение к этому руководству я покажу вам, как использовать внешнюю EEPROM, например AT24C32 или AT24C256, с Arduino в следующем руководстве.

Контур

Введение

Память в компьютерах — увлекательная тема. Проще говоря, память — это устройство, используемое для хранения информации. Всем компьютерам, будь то большие системы на основе микропроцессоров или небольшие встроенные устройства на основе микроконтроллеров, требуется память для постоянного или временного хранения данных.

Возьмем в качестве примера Arduino. Если вы посмотрите на спецификации платы Arduino UNO, упомянутые в этом руководстве по распиновке Arduino UNO, вы обнаружите, что UNO имеет три типа памяти:

  • 32 КБ флэш-памяти
  • 2 КБ ОЗУ
  • 1 КБ EEPROM

За исключением значений размера, Flash и EEPROM являются типами постоянной памяти, а RAM является временной памятью. Что это означает? Постоянная память — это тип памяти, который может хранить данные/информацию даже после отключения питания.

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

В зависимости от мощности память можно разделить на два типа:

  • Энергонезависимая память
  • Энергозависимая память

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

Что касается ОЗУ, это энергозависимая память, т. е. данные исчезают после отключения питания.

Что такое ЭСППЗУ?

Давайте теперь сосредоточимся на интересующей памяти. EEPROM или E 2 PROM — сокращение от электрически стираемое программируемое постоянное запоминающее устройство является преемником предшествующих поколений ROM (только для чтения), PROM (программируемое постоянное запоминающее устройство) и EPROM (стираемое программируемое постоянное запоминающее устройство).

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

Начальные ПЗУ запрограммированы на заводе, и вы не можете изменить содержимое ПЗУ. Они также известны как MROM (Masked Read Only Memory).

Затем появилось ПЗУ или программируемое постоянное запоминающее устройство. Они могут быть запрограммированы конечным пользователем (с помощью специального устройства, называемого PROM Programmer), но это одноразовая работа, т. е. они могут быть запрограммированы только один раз.

Для решения проблемы «одноразового программирования» PROM была разработана EPROM. Это расшифровывается как Erasable Programmable Read Only Memory. Память можно стереть, подвергнув ее сильному ультрафиолетовому излучению, и ее можно запрограммировать аналогично PROM.

Проблема с EPROM заключается в том, что постоянное воздействие сильного света (обычно от ртутной лампы) в конечном итоге изнашивает память, ограничивая цикл стирания менее чем 1000.

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

ПРИМЕЧАНИЕ. Современная флэш-память, которая используется в картах памяти, USB-накопителях, твердотельных накопителях, микроконтроллерах и т. д., является типом EEPROM.

Современные микроконтроллеры используют флэш-память для хранения прошивки и EEPROM для хранения небольших данных (таких как параметры, идентификатор устройства, история и т. д.).

EEPROM в Arduino

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

Существует два варианта использования EEPROM с Arduino. Первый и простой способ — использовать внутреннюю EEPROM Arduino. Второй вариант — добавить внешнюю микросхему EEPROM, например, знаменитую серию AT24 от ATMEL. Давайте сосредоточимся на внутренней EEPROM Arduino для этого урока.

Поскольку внутренняя EEPROM является функцией микроконтроллера, а не платы, все платы Arduino, т. е. UNO, Mega и Nano, имеют некоторое количество внутренней EEPROM.

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

Микроконтроллер Доски Размер
ATmega328P УНО, Нано, Мини 1024 байта (1 КБ)
ATmega2560 Мега 4096 байт (4 КБ)
ATmega168 Нано 512 байт

Библиотека EEPROM Arduino

Библиотека EEPROM — это специальная библиотека, позволяющая считывать и записывать во внутреннюю EEPROM микроконтроллера на плате Arduino. Он входит в стандартную комплектацию IDE, и вам не нужно ничего загружать дополнительно.

Библиотека Arduino EEPROM предоставляет вам пять очень полезных функций:

  • EEPROM.read() – Чтение байта из EEPROM.
  • EEPROM.write() — Записать байт в EEPROM.
  • EEPROM.update() — Записать байт в EEPROM, только если текущее значение отличается от предыдущего значения.
  • EEPROM.get() — Чтение любого типа данных из EEPROM (с плавающей запятой, структуры или любого типа данных).
  • EEPROM.put() — Запись любого типа данных в EEPROM (с плавающей запятой, структуры или любого другого типа данных).

В Arduino IDE для библиотеки EEPROM есть примеры. Просмотрите их для получения дополнительной информации.

Тестовая схема: запомните состояние реле

Мы видели много теории о EEPROM в целом, а также о EEPROM в Arduino. Вся эта теория имеет смысл только тогда, когда мы видим практическое воплощение. Итак, давайте создадим небольшую схему, чтобы протестировать функцию EEPROM в Arduino. Приложение называется «Может ли Arduino запомнить состояние реле?».

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

Принципиальная схема

На следующем рисунке показана принципиальная схема для тестирования EEPROM Arduino. Схема

для схемы тестирования EEPROM Arduino

Код

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

Заключение

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

Как использовать Arduino EEPROM для сохранения данных между циклами питания

Знаете ли вы, что Arduino может сохранять данные, когда он выключен? Не скетч, хранящийся во флэш-памяти. Я говорю о переменных данных в EEPROM. Присоединяйтесь ко мне, и я покажу вам, как читать и писать в него, и что он может сделать для ваших проектов.

Если вы новичок в Arduino, обязательно ознакомьтесь с нашим руководством для начинающих.

Что такое EEPROM?

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

EEPROM встроен во множество процессоров, таких как программируемая пользователем вентильная матрица (FPGA), используемая в Matrix Creator Pi HAT. Все Arduino имеют EEPROM, но емкость зависит от модели. Обязательно ознакомьтесь с нашим руководством по покупке для получения более подробной информации о каждой доске.

Как это работает?

EEPROM электрически стирается и программируется с помощью туннелирования Фаулера-Нордхейма . Вам не нужно знать технические детали, чтобы использовать его. Основная предпосылка заключается в том, что электричество используется для изменения двоичных данных (что является двоичным). Его можно читать, стирать и перезаписывать в электронном виде.

К счастью, язык Arduino позволяет легко изменять данные, и все это без необходимости иметь степень в области компьютерных наук.

Ожидаемая продолжительность жизни

Несмотря на то, что EEPROM легко использовать в Arduino, срок его службы ограничен. EEPROM рассчитан на 100 000 циклов чтения/стирания. Это означает, что вы можете записывать, а затем стирать/перезаписывать данные 100 000 раз, прежде чем EEPROM станет нестабильной. На самом деле полупроводники Atmel (производители «чипа» Arduino) могут обрабатывать большее или меньшее количество циклов, в зависимости от допусков каждого процессора.

Если местоположение было записано и стерто слишком много раз, оно может стать ненадежным. Он может возвращать неправильные данные или возвращать значение из соседнего бита.

Может показаться, что это много операций записи, но этот предел может быть легко достигнут при программном чтении и записи (например, в цикле ). Чтение данных не портит кремний, только запись делает . Вы можете читать данные из EEPROM сколько угодно без опасений!

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

Для чего это полезно?

EEPROM невероятно полезен для ваших проектов Arduino. Поскольку он запоминает данные даже при отключении питания, вы можете сохранить состояние Arduino. Может быть, вы могли бы построить лазерную турель, которая запоминает свое положение или количество оставшихся «боеприпасов». Вы можете использовать его для управления своими устройствами и регистрации того, сколько раз ваше устройство было активировано.

EEPROM лучше всего подходит для таких вещей, как настройки или рекорды. Если вы хотите регулярно записывать сложные данные, рассмотрите возможность подключения Ethernet Shield (со встроенным слотом SD) или Raspberry Pi.

Чтение и запись

Теперь, когда с теорией покончено, давайте посмотрим, как читать и записывать некоторые данные! Во-первых, подключите библиотеку (поставляется с Arduino IDE):

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Теперь запишите некоторые данные:

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Это записывает число 12 в ячейку EEPROM 0 . Каждая запись занимает 3,3 миллисекунды ( мс , 1000 мс = 1 секунда). Обратите внимание, что вы не можете писать буквы ( char ), разрешены только цифры от нуля до 255. Вот почему EEPROM идеально подходит для настроек или рекордов, но не так хороша для имен или слов игроков. С помощью этого метода можно хранить текст (вы можете сопоставить каждую букву алфавита с числом), однако вам потребуется несколько ячеек памяти — по одной ячейке для каждой буквы.

Вот как вы читаете эти данные:

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Zero — это адрес, на который вы писали ранее. Если вы раньше не писали по адресу, он вернет максимальное значение ( 255 ).

Есть несколько более полезных методов. Допустим, вы хотели сохранить десятичный разряд или строку:

. Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Это записывает данные в несколько мест — что-то, что было бы легко написать самостоятельно, но, тем не менее, удобно. Вам по-прежнему нужно будет отслеживать, сколько местоположений было записано, чтобы случайно не перезаписать свои данные! Вы должны использовать метод get , чтобы снова получить эти данные:

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Значение из get сохраняется в float f переменная. Обратите внимание, как это инициализируется значением 0.00f . f сообщает компилятору, что вы, возможно, захотите сохранить большое число в этой переменной, поэтому он устанавливает некоторые дополнительные конфигурации во время компиляции.

В документации EEPROM на веб-сайте Arduino есть еще много примеров.

Выравнивание износа

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

Самое простое, что вы можете сделать, чтобы продлить срок службы EEPROM, — это ограничить запись в определенное место. Вы можете сделать это, сначала прочитав адрес, и если значение, которое вы хотите записать, уже присутствует, нет необходимости записывать его снова (помните, чтение данных не вредит). Вот как это сделать:

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Это довольно простой код, однако он работает только для целых чисел! Вместо того, чтобы изобретать велосипед, используйте встроенную в библиотеку Arduino EEPROM функцию:

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Этот метод имеет точно такую ​​же сигнатуру, как метод write , хотя он может значительно сократить количество необходимых операций записи!

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

Указанный язык: clike не существует'
 Генерация кода не удалась!! 

Вам потребуется сохранить адрес и количество операций записи в EEPROM (и количество операций записи необходимо будет разделить по адресам).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *