Как работает стирание EEPROM?

Техническое описание ATmega328P содержит эту таблицу, которая описывает биты 4 и 5 EECR:

EEPM1 EEPM0 Время программирования Операция
0 0 3,4 мс Стереть и записать за одну операцию (атомарная операция)
0 1 1,8 мс Только стереть
1 0 1,8 мс Только запись

В настоящее время я работаю над неблокирующим кодом для обработки EEPROM, и мне интересно, когда и как мне стереть EEPROM.

  • Что делает стирание? Устанавливает ли он один байт в 0x0 или всю EEPROM?
  • Должен ли я сначала стирать его всякий раз, когда я хочу записать байт?
    • Если нет, то почему есть возможность стирать и писать отдельно?
  • Как начать удаление?

Либо в техническом описании EEPROM недостаточно информации, либо я просто не нашел то, что искал. Я попытался использовать поисковую систему, но все результаты относятся либо к библиотеке Arduino EEPROM, либо к файлу <avr/eeprom.h>, оба из которых используют опрос вместо прерываний (и поэтому блокируют).

, 👍0

Обсуждение

* «в таблице данных довольно мало информации» * Хм, может быть, ссылка на таблицу данных, которую вы используете, потому что я помню, что на эти вещи * даны * ответы в ней, если только вы, возможно, не получили «резюме», а не "полный" техпаспорт. Также есть примечания об использовании AVR EEPROM., @timemage

«Я пытался использовать поисковую систему, но все результаты либо касаются EEPROM Arduino»... не ищите «arduino eeprom»... не ищите ни одно из этих слов., @jsotola


2 ответа


Лучший ответ:

3

Ответы на ваши вопросы приведены в техническом описании AVR ATMega328. .

Процедура стирания и записи внутренней EEPROM описана в главе 7.6 (Описание регистра).

  • Операция стирания стирает 1 байт (при стирании ячейки EEPROM для нее устанавливаются все единицы, т. е. 0xff).
  • На адрес EEPROM, который нужно стереть/запрограммировать, указывают регистры EEARL и EEARH. Значение, которое должно быть запрограммировано в этом адресе, устанавливается EEDR. Чтение значения из EEPROM возвращает значение в том же регистре EEDR.
  • Перед записью нового значения в EEPROM старое значение должно быть стерто. Вы можете сделать это как два отдельных действия или как одно действие. Вы также можете оставить ячейку депрограммированной (стертой), просто удалив ее и не программируя снова.
  • Вы инициируете стирание адреса EEPROM, на который указывает EEARH/EEARL, установив EEPM1 на 1, EEPM0 на 0 и установив EEPE на 1, чтобы начать операцию стирания. Установка EEPM1 и EEPM0 на 0 приведет к стиранию и программированию нового байта за одну операцию.

Что касается записи в EEPROM без блокировки, вы можете установить (неблокирующий) таймер на продолжительность операции записи, стирания или стирания/записи. По даташиту эти операции занимают соответственно 1,8, 1,8 и 3,4 мс. Просто убедитесь, что ваш код не обращается к EEPROM во время выполнения этих операций.

Вы также можете (не блокируя) периодически опрашивать бит EEPE до тех пор, пока он не будет очищен, сигнализируя о завершении операции.

Наиболее элегантным способом, по моему мнению, является использование флага EERIE, установив для него значение 1, что позволит ATmega генерировать прерывание по завершении операции EEPROM.

,

Если новое значение устанавливает биты в 0, которые равны 1 в старом значении, стирание не требуется. Например, вы можете записать 0x55 в ячейку, содержащую 0xD7, без необходимости стирать ячейку перед этим., @the busybee

@thebusybee, правда, обычно вы можете изменить незапрограммированный («1») бит EEPROM на запрограммированный («0») бит, не стирая ячейку. Изменение битов с 0 на 1 снова требует стирания ячейки. Это не уникально для ATmega328, но работает для многих/большинства EEPROM., @StarCat


-1

Я переключился на FRAM, 32K x 8 можно получить всего за несколько $$$, как правило, за вычетом импортных плат Arduino. Это так быстро, как Arduino может получить к нему доступ, как для чтения, так и для записи. Вы можете использовать I2C или SPI в зависимости от того, какое устройство вы покупаете. Для него есть несколько очень хороших библиотек, упрощающих его использование. Он энергонезависим, т.е. не теряет информацию при отключении питания. Он будет поддерживать в диапазоне триллионов циклов памяти без задержки при записи или чтении, поэтому без блокировки. Всего несколько дополнительных циклов процессора из-за накладных расходов SPI или I2C. Если у вас уже есть код для внешней EEPROM, он должен работать как есть, но в нем будет ненужная задержка.

,

Хотя ваш ответ интересен, это немного похоже на то, что вы отвечаете человеку, у которого проблемы с его Ford, говоря ему, что Cadillac работает лучше., @Nick Gammon