Существует микросхема 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 выглядит так
Программная часть
Как настроить 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 команд.
Как прочитать NOR Flash память из микросхемы?
Читать память чипа можно по любому адресу, любое количество байт. Можно одной командой 0x03 прочитать всю SPI NOR Flash память.
Как стереть память?
Минимальная единица данных которую можно стереть называется сектор. Сектор это 4kByte памяти. Всего в чипе получается 2048 секторов. Также можно стирать блоками по 32kByte или 64kByte.
Как записать NOR-Flash память?
Тут всё плохо. При работе с NOR flash есть 3 неприятности.
Неприятность №1
Под понятием "запись NOR Flash" подразумевается обнуление битов. Обнуленный бит нельзя просто как в RAM переключить на 1. Это первая проблема.
Можно только разом переключить в 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://habr.com/ru/articles/687616/
https://habr.com/ru/articles/706972/