Я разрабатываю устройство, которое автоматически регулирует его физическое положение при изменении температуры. Если устройство выключено или питание отключено, устройству необходимо запомнить его последнюю температуру и положение. У меня есть возможность сохранить эти значения в EEPROM, но проблема в том, что положение и температура могут меняться очень быстро. Если бы я записывал temp и pos в EEPROM после каждого их изменения, это (1) немного замедляло бы прошивку и (2) скорее всего уничтожало EEPROM через год или два. Итак, как я вижу, мои варианты таковы ...
1) Используйте конденсатор / батарею для поддержания устройства в течение короткого времени после потери питания, чтобы я мог записывать значения в EEPROM только в это время. Мне это не нравится, потому что доска довольно требовательна к энергопотреблению, и это потребует большой кепки. И у меня нет тонны свободного места. И я не хочу дополнительную стоимость батареи и держателя батареи / или большой крышки.
2) использовать F-RAM вместо EEPROM, чтобы я мог писать в нее триллионы раз, не изнашиваясь. Мне не нравится этот вариант, потому что FRAM немного дороже, чем EEPROM, и это для производственного продукта (не только один).
3) Пишите только положение и температуру каждые 5 минут или около того. Таким образом, я всегда записываю довольно недавнюю позицию / темп, но я пишу не каждую секунду, поэтому моя программа не замедляется и EEPROM не умирает так быстро. Это похоже на мой лучший вариант.
У кого-нибудь еще есть предложения, о которых я не думаю?
источник
Ответы:
Что вам нужно, так это техника, которая называется выравниванием износа . Он не записывает ваши данные каждый раз в одно и то же место в EEPROM, но использует некоторый алгоритм для использования в разных местах. Я читал о сложных алгоритмах выравнивания износа, но я не знаю, почему следующий простой метод не сработает.
Добавьте к своим данным 24-битный счетчик, чтобы длина вашего блока данных составляла, например, 8 байтов. Страницы в 24AA64 имеют длину 32 байта, поэтому EEPROM объемом 64 КБ вмещает 256 страниц. Из таблицы данных:
поэтому не имеет смысла использовать блоки данных размером менее 32 байт.
Посмотрите на счетчик первой страницы. Если он равен нулю, вы использовали максимальное количество циклов записи для этой страницы, поэтому вы переходите к следующей странице и проверяете этот счетчик. Повторяйте, пока не найдете счетчик> ноль. Это страница, которую вы сейчас используете. ЭСППЗУ Microchip обладают выносливостью в 1 миллион циклов, которую вы можете увеличить до 256 миллионов с помощью данного примера максимум 32 байта на блок в 64 КБ EEPROM. Этого должно быть достаточно, чтобы пережить ваш продукт: 40 лет, если вы пишете каждые 5 секунд (!).
Вы захотите инициализировать EEPROM при первом использовании. Как вы знаете, когда это. Используйте последнюю страницу, чтобы написать уникальную подпись при инициализации. При каждом включении проверяйте наличие подписи. Если это не так, устройство должно быть инициализировано. Вы можете предварительно установить счетчик на каждой странице с 0xF4240 (для 1 миллиона) или очистить все до 0xFF и записать 0xF4240 при первом использовании страницы.
Инициализация EEPROM необходима, потому что иногда в нее записывается определенный шаблон в процессе производства / тестирования.
редактировать
износ выравнивание должно решить ваши проблемы, но я все равно хочу прокомментировать решение конденсатора. Вы говорите, что плата довольно энергоемкая, но, возможно, вы можете изолировать питание микроконтроллера / EEPROM от остальной платы с помощью диода. Таким образом, вам, вероятно, понадобится всего несколько мА, когда основное питание пропадет. 24AA64 записывает страницу менее чем за 5 мс, затем при 10 мА и допустимом падении напряжения в 100 мВ, которое вам понадобится
Легко с небольшой суперкап.
дальнейшее чтение
таблицы 24AA64
EEPROM Tutorial Endurance
источник
1) Как только вы начали процесс записи, вам нужно только включить MCU / EEPROM и убедиться, что линии управления не глючат - I2C, вероятно, предпочтительнее SPI для этого. Нужно всего лишь несколько мА в течение нескольких миллисекунд, чтобы не оказаться слишком большой, и вы можете перевести MCU в спящий режим после начала записи. 3) вы, вероятно, можете применить некоторый интеллект, например, удержание - после того, как написано, оно всегда содержит определенное время, прежде чем может произойти другая запись. Или подождите, пока значение не станет стабильным, прежде чем писать.
Вы также можете увеличить выносливость, распределив данные по нескольким местам. У микрочипа есть некоторые инструменты и дополнения для расчета выносливости для их EEPROM, которые могут быть полезны.
источник
Я бы предложил использовать блочно-ориентированное флэш-устройство и использовать один байт из каждого блока в качестве флага режима. Поддерживать в качестве инварианта, что почти все флаги режима будут запрограммированы; будет только один блок, где флаг режима не запрограммирован, а предыдущий блок (если необходимо, перенос). Это будет блок с самыми последними данными. Когда этот блок заполняется, сотрите следующий блок (обратите внимание, что стираемый блок может содержать любую комбинацию данных в течение цикла стирания, а инвариант все равно будет удерживаться), затем, когда стирание завершено, установите флаг режима на то, что использовалось для быть последним блоком.
Будет необходимо защитить питание флэш-памяти достаточно хорошо, чтобы гарантировать, что любая попытка запрограммировать байт будет либо успешной, либо неудачной во всей ее полноте, но это не будет иметь значения, если цикл стирания прерывается, оставляя блок, заполненный произвольными данными, так как следующая попытка записи записи данных сотрет этот блок.
Если ваши данные 16 бит, чип 64Kx8 будет содержать более 32 000 записей. Запись одной записи в секунду заполнит фишку примерно в 2,7 раза. Даже чип с выносливостью «всего лишь» 10 тысяч циклов стирания будет работать более 10 лет. Использование более крупного чипа или чипа с выносливостью 100 Кб пропорционально увеличит срок полезного использования.
источник
1) Возможно, самый простой вариант, хотя он может потребовать изменений в оборудовании. Я достиг этого раньше без модификаций PBC, просто увеличивая разъединяющие заглушки и прерывая отключение.
2) Как вы указали, проблема с FRAM - это цена!
3) В зависимости от изменчивости ваших данных о температуре и положении вы будете увеличивать выносливость, записывая, только если значение изменилось. Возможно, вы измеряете температуру один раз в секунду, но если она меняется каждые 5 минут, проблема решена.
источник
Вот как я решил эту проблему в своем проекте:
Зарезервируйте 1 сектор вспышки для хранения битовой маски неиспользуемых слотов и количества слотов для значения.
Я использовал битовую маску длиной 16 байт, поэтому у меня было 128 слотов для установки значений.
Битовая маска инициализируется для всех, что в терминах вспышки является стертым состоянием.
Если вы хотите записать новое значение, прочитайте битовую маску и найдите первый бит, который равен единице. Это номер слота, в который вы напишите значение. Измените этот бит на ноль, чтобы пометить его как использованный, и запишите битовую маску обратно во флэш-память, не стирая ее сначала. Затем запишите значение в слот после битовой маски, также не стирая флэш-память.
Таким образом, вы увеличиваете циклы флэш-записи в 128 раз, записывая новую битовую маску, изменяя только единицу на ноль.
Если вся битовая маска равна 0, удалите сектор флэш-памяти и начните заново.
источник