Часте записування в енергонезалежну пам'ять


10

Я проектую пристрій, який автоматично регулює його фізичне положення під час зміни температури. Якщо пристрій вимкнено або відключено живлення, пристрій повинен пам’ятати про його останню температуру та положення. У мене є можливість зберігати ці значення в EEPROM, але проблема полягає в тому, що положення і температура можуть змінюватися дуже швидко. Якби я писав темп і поз в EEPROM після кожного разу, коли вони змінювались, це (1) трохи уповільнить прошивку, і (2), швидше за все, вб'є EEPROM через рік-два. Отже, як я бачу, мої варіанти такі:

1) використовуйте конденсатор / акумулятор, щоб утримати пристрій живлення протягом короткого часу після втрати живлення, щоб я могла записувати значення в EEPROM лише в той час. Мені це не подобається, бо дошка якось голодна, і для цього знадобиться велика шапка. І у мене немає тонни вільного місця. І я не хочу додаткової вартості акумулятора та тримача акумулятора / чи великої кришки.

2) використовуйте F-RAM замість EEPROM, щоб я міг записувати в неї трильйони разів, не зношуючись. Мені цей варіант не подобається, оскільки FRAM коштує трохи дорожче, ніж EEPROM, і це стосується виробничого продукту (не лише одного).

3) Пишіть лише положення та температуру кожні 5 хвилин. Таким чином, у мене завжди записується досить недавня позиція / темп, але я пишу не щосекунди, щоб моя програма не сповільнилася, і EEPROM не загине так швидко. Це здається моїм найкращим варіантом.

Хтось ще має якісь пропозиції, про які я не думаю?


5
Лише питання. Якщо пристрій автоматично регулює його фізичне положення, навіщо вам пам'ятати про останню температуру? Коли ви знову вмикаєте пристрій, він не оновлюватиме температуру та не регулює його положення?
Даніель Грілло

1
Я згоден з Даніелем. Що робити, якщо ви вимкнете живлення і температура навколишнього середовища різко зміниться? При включенні живлення, якщо ви використовували останній збережений темп / позицію, ви все одно опинитесь у неправильному місці, і пристрій перестане рухатися незалежно. Чи є ще одна вимога, яка не вказана у вашому запитанні?
Дейв

Що таке специфікація EEPROM - скільки циклів запису?
Джейсон S

Відповіді:


10

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

Додайте до своїх даних 24-бітний лічильник, щоб ваш блок даних, наприклад, був 8 байт. Сторінки на 24AA64 мають 32 байти, тому 64-футовий EEPROM вміщує 256 сторінок. З даних:

"Під час запису менше 32 байт дані на решті сторінки оновлюються разом із записаними байтами даних. Це змусить всю сторінку витримати цикл запису, тому витривалість визначається на кожній сторінці."

тому не має сенсу використовувати блоки даних розміром менше 32 байт-сторінки.

Подивіться на лічильник першої сторінки. Якщо він дорівнює нулю, ви використали максимальну кількість циклів запису для цієї сторінки, тож переходите до наступної сторінки та перевіряєте цей лічильник. Повторюйте, поки не знайдете лічильник> нуль. Це сторінка, яку ви зараз використовуєте. EEPROM Microchip мають витривалість в 1 мільйон циклів, яку ви можете збільшити до 256 мільйонів за допомогою наведеного прикладу максимум 32 байт на блок в 64-футовому EEPROM. Цього має бути достатньо, щоб витратити ваш продукт: 40 років, якщо ви пишете раз на 5 секунд (!).

Ви хочете ініціалізувати свій EEPROM при першому використанні. Як ти знаєш, коли це. На останній сторінці написати унікальний підпис після ініціалізації. Перевіряйте при кожному включенні живлення, чи є підпис. Якщо це не пристрій, його потрібно ініціалізувати. Ви можете встановити лічильник на кожній сторінці за допомогою 0xF4240 (на 1 мільйон) або очистити все до 0xFF і написати 0xF4240 під час першого використання сторінки.
Ініціалізація EEPROM потрібна, оскільки іноді в процесі виробництва / випробування їй пишеться певна закономірність.

редагування
Вирівнювання зносу повинно вирішити ваші проблеми, але я все ж хочу прокоментувати рішення конденсатора. Ви кажете, що плата досить сильна, але, можливо, ви можете ізолювати потужність мікроконтролера / EEPROM від решти плати діодом. Тож вам, мабуть, знадобиться лише кілька мА, коли основної потужності не буде. 24AA64 пише сторінку менш ніж за 5 мс, то при 10 мА та допустимому падінні напруги 100 мВ вам знадобиться

C=ItΔV=10mA5ms100mV=500μF

Легко за допомогою невеликої суперкапки.

подальше читання
даних 24AA64
EEPROM Підручник з витривалості


Витривалість EEPROM задається на сторінку (принаймні для 24AA64 та інших EEPROM, які я використовував). 24AA64 вказує 32-байтну сторінку, тому кількість повинна бути на одну сторінку, а не на блок.
Саад

@Saad - Правильно. Виправлено у моїй відповіді.
stevenvh

4

1) Після того, як ви розпочали процес запису, вам потрібно лише включити MCU / EEPROM і переконатися, що контрольні лінії не блищать - I2C, мабуть, кращий для SPI для цього. Потрібно лише кілька мА протягом декількох мілісекунд, щоб це не було великим ковпаком, і ви можете перевести MCU у режим сну, коли запис буде розпочато. 3) ви, ймовірно, можете застосувати деякий інтелект, наприклад, призупинення - коли він написаний, це завжди триває певний час, оскільки може статися інше записування. Або зачекайте, поки значення не буде стабільним деякий час, перш ніж писати.
Ви також можете підвищити витривалість, поширивши дані по ряду локацій. У мікрочіпа є кілька інструментів та додатків для обчислення витривалості для їхніх епромерів, що може бути корисно.


4
Примітка програми Microchip про витривалість: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf З програми Appnote ви також можете збільшити витривалість приблизно в 2 рази, зменшивши робочу напругу з 5v до 3,5v.
vandee

1
Якщо ви використовуєте свій перший метод, переконайтеся, що запис у енергонезалежну пам'ять є найвищим пріоритетом у вашій системі, як тільки він запускається, тобто. що переривання не може змусити ваші значення змінити середину запису або мікрозапустити якусь іншу обробку, через що у вас не вистачає часу. Найголовніше, щоб ви не писали пошкоджені значення під час вимкнення живлення. Крім того, CRC щодо значень допоможе вам підтвердити, що корупція не сталася, але вам доведеться вирішити, що робити, якщо це відбудеться, наприклад, за допомогою значень за замовчуванням.
Мартін

3

Я б запропонував використовувати флеш-пристрій, орієнтований на блок, і використовувати один байт з кожного блоку як прапор режиму. Підтримуйте як інваріант, що майже всі прапори режиму будуть запрограмовані; буде лише один блок, де прапор режиму не запрограмований, але попередній блок (при необхідності обгортання). Цей блок буде тим, хто має найновіші дані. Коли цей блок заповнюється, видаліть наступний блок (зауважте, що блок, що стирається, може містити будь-яку комбінацію даних під час циклу стирання, а інваріант все-таки утримуватиметься), після того, як стирання буде виконано, запрограмуйте прапор режиму на те, що раніше бути останнім блоком.

Необхідно буде достатньо добре захистити подачу на флеш, щоб гарантувати, що будь-яка спроба запрограмувати байт буде успішною або завершиться повністю, але це не має значення, якщо цикл стирання буде перервано, залишаючи блок, наповнений довільними даними, оскільки наступна спроба введення даних буде повторно стерта цей блок.

Якщо ваші дані - 16 біт, чіп 64Kx8 вмістить понад 32 000 записів. Написання одного запису в секунду заповнило б фішку приблизно в 2,7 рази. Навіть чіп із витривалістю циклів стирання "лише" 10 К тривав би понад 10 років. Використання більшого чіпа, або такого, що має витривалість 100 К, пропорційно збільшить термін корисного використання.


2

1) Можливо, найпростіший варіант, хоча це може зажадати апаратних змін. Я раніше цього домагався без модифікацій PBC, просто збільшуючи кришки розв'язки та перериваючи на коричневий.

2) Як ви вже зазначали, проблема FRAM - ціна!

3) Залежно від мінливості даних про температуру та положення, ви підвищуєте витривалість, лише записуючи, якщо значення змінилося. Ви можете взяти вибірку температури раз на секунду, але якщо вона змінюється лише кожні 5 хвилин, проблема вирішена.


1

Ось як я вирішив цю проблему в своєму проекті:

Зарезервуйте 1 сектор спалаху, щоб утримувати біт-маску невикористаних слотів та кількість слотів для значення.

Я використовував біт-маску довжиною 16 байт, тому для встановлення значень у мене було 128 слотів.

Бітмаска ініціалізується для всіх, що у флеш-термінах є стертим станом.

Коли ви хочете написати нове значення, прочитайте в біт-масці і знайдіть перший біт, який є одним. Це номер слота, куди ви будете писати значення. Змініть цей біт на нуль, щоб позначити його як використаний, і запишіть бітову маску назад у спалах, не попередньо видаляючи її. Далі запишіть значення в слот після біт-маски також, не стираючи спалах.

Таким чином, ви подовжуєте цикли запису флеш-сигналу у 128 разів, записуючи нову растрову маску із лише зміною з одиниці на нуль.

Якщо вся бітова маска дорівнює 0, видаліть флеш-сектор і почніть свіжий.


3
Я можу вас розчарувати, але коли ви трохи спалахнете, весь сектор перезаписується. Ваше рішення зробить сектор «бітмаски» мертвим дуже скоро
Андрейс Кайніков

1
Якщо спалах не стирається, ви не використовуєте один з циклів стирання 10K для сектора. Якщо у вас є значення 0x7F і ви записуєте значення 0x3F, результат буде 0x3F. Це забезпечує оновлення біткої маски, але спалах не стирає. Стирання трапляється лише після того, як вся растрова маска дорівнює 0.
Роберт

Якщо я помиляюся, давайте обговоримо. Я не хочу тут поганих відповідей, і я дійсно не хочу поганого дизайну в своєму проекті.
Роберт

Я думаю, що Роберт має рацію. На моєму мікроконтролері можна одночасно записувати лише 4 байти, але необхідні біти встановлюються на нуль. Єдиний спосіб повернути їх до позначки 1 - це очищення блоку 1k. Єдині цикли стирання, які носять спалах ...
Тім

Це може бути різним для кожного типу пам’яті, а може бути, навіть постачальником пам’яті. Я бачив, що EEPROM повинні стерти сторінку, а потім переписати її для кожного запису. Я бачив флеш-пам’ять, ви можете писати біти, які досі є 1, не стираючи сторінку.
mjh2007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.