Существует микросхема MX25R6435FZNI. Если расшифровывать маркировку, то это 8MByte NOR-Flash память с SPI интерфейсом, питанием 1.65V-3.6V, в корпусе 8-WSON и индустриальном диапазоне исполнения (-40°C to 85°C). NOR-Flash память можно перезаписывать всего-навсего 100k раз. Еще у чипа есть 1k byte OTP памяти.

Этот чип очень любят производители PCB. Во многом благодаря цене. Порядка 20 RUB за мегабайт. Микросхема была замечена в следующих платах.

Плата

Чип

Вендор

LAUNCHXL-CC26X2R1

MX25R8035FZUIL0

TI

NRF5340-DK

MX25R6435FZNI

NS

Аналоги это S25FL064LABMFM010, 25Q127CSIG, SST25VF064C.

Аппаратная чаcть

На системном уровне внутри есть поддержка SPI, поля, усаженные памятью, генератор высокого напряжения (чтобы стирать Flash память), SRAM память, собственные регистры и конечный автомат, который всем этим управляет.

С точки зрения программиста чип выглядит так:



Что известно про распиновку микросхемы MX25R6435FZNI?

На плате NRF5340-DK NOR Flash выглядит так

MX25R6435F на плате NRF5340-DK
MX25R6435F на плате NRF5340-DK

Программная часть

Как настроить SPI для работы с MX25R6435F?

Как и у любого умного чипа у MX25R6435F есть 7 регистров. Из которых 4 регистра это конфиги. Суммарно у чипа 17 бит конфигов.

В качестве ручки управления для MX25R6435F выступает интерфейс SPI. Через SPI отправляются команды. Есть отдельные команды для чтение и для записи конфигураций в микросхему.

Настройки SPI такие. В режиме IDLE на проводе SCLK должен быть 0V. Сhip enable происходит при 0V. Данные защелкиваются по положительному перепаду на проводе SCLK.

Данные передаются старшим битом вперед. Когда передается адрес, то адрес передается старшим байтом вперед (big endian). Скорее всего у вас будет Little endian микроконтроллер и адрес придется инвертировать зеркально. К слову, физический адрес является 24битным. Теоретически можно адресовать 16777216 байт = 16384 kByte = 16MByte. Однако в нашем случае адресуются всего только 8MByte, то есть хватило бы и 23бит адреса.

Вся 8-ми мегабайтная NOR-Flash память поделена на блоки. Всего 128 блоков, получается 64k Byte на блок.

У чипа есть своя собственная система SPI из 35-ти команд. Вот полный реестр SPI команд.

Система команд чипа MX25R6435F
Система команд чипа MX25R6435F

https://docs.google.com/spreadsheets/d/1AwzaBD0OCYFFigogcoal0qgQ-hjwQ_fTHCio--lrmoU/edit#gid=813451886

Как прочитать NOR Flash память из микросхемы?

Читать память чипа можно по любому адресу, любое количество байт. Можно одной командой 0x03 прочитать всю SPI NOR Flash память.

Как стереть память?

Минимальная единица данных которую можно стереть называется сектор. Сектор это 4kByte памяти. Всего в чипе получается 2048 секторов. Также можно стирать блоками по 32kByte или 64kByte.

Как записать NOR-Flash память?

Тут всё плохо. При работе с NOR flash есть 3 неприятности.

Неприятность №1

Под понятием "запись NOR Flash" подразумевается обнуление битов. Обнуленный бит нельзя просто как в RAM переключить на 1. Это первая проблема.

Логическое И как иллюстрация правила записи NOR-Flash
Логическое И как иллюстрация правила записи NOR-Flash

Можно только разом переключить в 0xFF всю страницу NOR Flash(а), а это куски 4kByte.

Однако есть бонус. Можно до сбросить уже частично прописанные flash байты. То есть сначала прописать 0x55 а потом 0x00.

Неприятность №2

Данные можно записывать только по 256 байт за раз.

Неприятность №3

Адреса должны быть выравненными по 256 байт. Это значит, что 24 битные адреса, которые подают в SPI должны в младших 8 битах содержать нули.

Это крайне неудобный интерфейс. Вот захочет приложение прописать блок B 50байт по адресу 250 и приходится вам писать функции-обертки, которые создадут иллюзию записи произвольных кусков данных в произвольные адреса.

Так как операция записи NOR Flash такая дорогая, то имеет смысл делать так называемый "lazy write". Это значит, что перед записью куска памяти память надо прочитать. Если там уже то же самое, что мы хотим прописать, то отменить запись, и дать сигнал что запись прошила успешно.

Вот такая она NOR-Flash память. Зато 20 RUB за мага байт и этим всё сказано.

Для SPI прописывания существует команда Page Program (0x02). Вот полный список команд записи, что предлагает микросхема MX25R6435F

Вывод

Чипы NOR flash это дешевый способ добавить в плату энергонезависимое число хранилище мегабайтных размеров. Однако потребуется очень аккуратно написать драйвер для этого чипа.

Обычно в РФ можно увидеть как Junior программисты МК организовывают поверх SPI-Flash циклический массив

https://www.youtube.com/watch?v=0U6eT9vTitc

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

Сама по себе SPI-NOR Flash бессмысленна, если нет программного компонента файловой системы.

Для полноценной работы с NOR-Flash надо писать надежный программный компонент NVRAM, чтобы были виртуальные адреса, в которые можно читать и писать блоки произвольной длинны в одно виртуальное место. А это под силу только Senior Embedded разработчику, так как надо ориентироваться в абстрактных структурах данных во внешней памяти.

Как по мне, дак лучше заложить в проект PCB сразу SD карту и запустить FatFs. SD карты сейчас тоже очень-очень дешевые. Там и размеры циклопические (гигабайты) и SD карта сама на аппаратном уровне делает равномерный износ, плюс можно файлы докидывать и разбирать прямо на PC.

Такие SPI-NOR Flash ставят только когда конструктив гаджета не позволяет вывести на улицу разъем для SD карты. Например надо чтобы вода и песок не попадали на PCB.

Для работы с SPI-Flash чипами надо ориентироваться в следующих акронимах:

Акроним

Расшифровка

SPI

Serial Peripheral Interface

MSB

most significant bit

SD

Secure Digital

WSON

Very Very Small Outline Non-Leaded

HV

High voltage

OTP

one time programmable

JEDEC

Joint Electron Devices Engineering Council

SFDP

Serial Flash Discoverable Parameter

VCC

voltage collector collector

NOR

Not OR

NVRAM

Non Volatile Random Access Memory

Контрольные вопросы

  • Сколько надо бит, чтобы адресовать 8МByte памяти?

  • Что такое lazy write?

  • Как можно организовать равномерный износ SPI-NOR Flash памяти? Как обрабатывать виртуальные адреса?

Links

https://docs.google.com/spreadsheets/d/1AwzaBD0OCYFFigogcoal0qgQ-hjwQ_fTHCio--lrmoU/edit#gid=982659173

https://habr.com/ru/articles/687616/

https://habr.com/ru/articles/706972/

https://habr.com/ru/articles/730232/

Комментарии (9)