Можно ли использовать флэш-чип SPI с Arduino (Atmega328p) - PullRequest
0 голосов
/ 27 мая 2019

Можно ли использовать флэш-чип SPI с минимальным размером стирания сектора 4 КБ и Atmega 328p (2 КБ встроенной памяти)?

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

Но сектор объемом 4 КБ не может быть сохранен в ОЗУ объемом 2 КБ, так какие решения используют другие люди в этой ситуации? Потому что я видел, как Arduinos использовался в этой настройке, но не мог определить, каким было их решение.

(Arduino - просто пример небольшого микроконтроллера в этом вопросе)

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Вы можете просто использовать схему страниц с двойным резервированием.Для двух 4 КБ страниц, организованных таким образом:

 Page A           Page B
+------------+   +------------+
| Sequence A |   | Sequence B |
!~Sequence A |   !~Sequence B |
+------------+   +------------+
|            |   |            |
|            |   |            |
| Data A     |   |  Data B    |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
+------------+   +------------+

Первоначально вы пишете Data A и устанавливаете Sequence A в ноль для его инверсии ~Sequence A.При запуске вы проверяете порядковый номер каждой страницы и задаете для страницы самый высокий действительный порядковый номер (действительный, когда sequence ^ ~sequnece == 0xff) в качестве текущей страницы чтения , а другой - в качестве текущей страницы записи.

Когда вы обновляете данные, вы стираете текущую страницу записи , записываете область data , затем устанавливаете порядковый номер равным порядковому номерупрочитанная страница плюс 1 (по модулю 256) и установите ее обратно.Затем поменяйте местами текущие страницы чтения / записи.При обновлении вы можете копировать данные с одной страницы на другую без буферизации всей страницы и изменять только ту часть, которую вы собираетесь изменить.

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

При выборетекущая активная страница, вам, конечно, приходится иметь дело с циклическим изменением (т. е. когда порядковые номера равны 255 и нулю, ноль - новее).

Эта схема подходит для данных, которые будут часто читатьсяи написано редко.Характер и частота ваших циклов чтения / записи NV будут диктовать подходящий механизм, поскольку для последовательной регистрации или энергонезависимых счетчиков событий будут подходить разные решения.

0 голосов
/ 28 мая 2019

Немного неясно, какой контент (размер) вы планируете писать и как часто.

Можно подумать о нескольких меньших NV блоках, которые намного меньше, чем размер страницы. Каждый NV-блок имеет некоторый заголовок блока, идентифицирующий блок (например, BlockID + Size). Затем вы можете обновить страницу, если новый блок NV умещается на этой странице. Если нет, запишите это на следующую страницу и скопируйте все последние другие блоки на новую страницу. Затем вы можете стереть и подготовить старую страницу к следующему обмену.

...