|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
||||||||||||||||
Запись данных в флэш W25Q, интерфейс SPI. STM32F10308.02.2021, 21:31. Показов 16670. Ответов 33
Метки нет (Все метки)
Всем привет.
![]() Появилась идея записывать данные сенсора / сенсоров в флэш память W25Q128. Ни разу этого не делал.. Поэтому не могу понять как правильно записывать данные. Пробовал записывать данные побайтно
Допустим, нужно периодически записывать структуру данных где есть: 1. Номер записи 2. Название сенсора 3. Данные сенсора. Если это писать в одну страницу, в которой есть 256 байт, то останется много не использованной памяти в странице.
0
|
||||||||||||||||
| 08.02.2021, 21:31 | |
|
Ответы с готовыми решениями:
33
stm32f103 spi sd card keil STM32F103 + SPI EEPROM M95M01 Не понятно маркировка SPI флэш-памяти |
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
| 08.02.2021, 22:51 | |
|
У вас же есть функция "W25qxx_WriteByte()". Значит можно побайтно писать данные. В чем проблема? Просто учитывайте, что стирание происходит посекторно, минимум. Ну, если записывать нужно одну и ту же структуру - во Флеши ее записывают последовательно, "размазывая" по всему отведенному пространству флеши. Дополнительно, дописывают "количество" записей, чтобы оценить ресурс страницы FLASH на запись. Это называется "aging control". Есть и другие названия, но цель одна - определить с помощью моделей количество оставшихся записей в страницу. Потому что запись при различных условиях (напряжение питания и температура) влияет в конечном итоге на ресурс страницы.
Рекомендую поискать библиотеки "EEPROM emulation". Они есть и для STM8/STM32, и у многих (почти всех) других производителей. Простенькие, но для начала и большинства задач их достаточно.
1
|
|
|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
|||||||||||
| 09.02.2021, 01:56 [ТС] | |||||||||||
|
Я придумал как-то так записывать данные.
Сделал так. Но проблема.. В функцию W25qxx_WriteByte мне нужно подавать по одному байту. Когда был массив, то проблем как передать не было, но у меня сейчас структура, и я незнаю как ее передать побайтно в эту функцию ![]()
0
|
|||||||||||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||||||||||||
| 09.02.2021, 10:04 | ||||||||||||
1
|
||||||||||||
|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
|||||||||||
| 10.02.2021, 14:17 [ТС] | |||||||||||
|
Правильно ли я понимаю распределение памяти по страницам, блоках и секторах?
В странице есть 265 байт в секторе 16 страниц. Так что в одном секторе 256 * 16 = 4096 байт. В одном блоке 16 секторов по 4096 байт. Итак 16 * 4096 = 65536 байт в обно блоке. В микросхеме W25Q128 блоков 256. Итак 256 * 65536 = 16777216 б во всей микросхеме. Для того чтобы структура данными кратно поместилась в память одной страницы нужно чтобы ее размер был 32 байта. Тогда структура поместится 8 раз в одну страницу. И (допустим) чтобы при заполнении одного сектора структура не была записана между двумя секторами. Стирать можно либо сектор или блок или всю микросхему. Записывать можно побайтно, по странице, по сектору, или по блоку. Стирать можно сектор, блок, или всю память. Функция записи одного байта принимает в качестве аргумента байт, а не адрес на байт, и адрес записи.
Поэтому я передаю в функцию write_struct_in_flash копию структуры, и хочу побайтно ее передать в функцию W25qxx_WriteByte. В функции write_struct_in_flash мне нужно при каждой итерации цикла увеличивать адресов флэш памяти flash_offset и полученной структуры на 1 байт. Я до сих пор не понимаю как передать побайтно эту структуру в функцию W25qxx_WriteByte (uint8_t byte, uint32_t flash_offset) ![]()
я не нашел ни одного примера как правильно паковать данные во внешнюю флэш память(
0
|
|||||||||||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 11.02.2021, 10:35 | ||
|
разница с тем, что вы хотите лишь в том, что вы пишете функциями библиотеки работы с внешней памятью, а здесь используются функции работы с внутренней FLASH. PS: в ходе обсуждения вы нигде не ошиблись - все супер. Небольшая ремарка лишь в том, что в функцию вы передаете всю структуру, а лучше было бы передавать только указатель. Имея функцию для записи данных только известного размера не нужен параметр "size". Это возможно, но как по мне - слишком проприетарное решение.
0
|
||
|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
||||||
| 11.02.2021, 18:48 [ТС] | ||||||
|
Сейчас я записываю массив в котором есть: название сенсора, порядковый номер записи, данные температуры и влажности.
Данные пишутся в один сектор, это 128 записей. После переполнения сектора, он стирается и записывается по кругу снова. Но проблема в том, что при каждом включении у меня происходит стерання этого сектора, поскольку я не храню переменную flash_offset которая бы указывала на адрес внешний флэш памяти куда были записаны последний раз данные.
0
|
||||||
|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
|||||||
| 11.02.2021, 21:21 [ТС] | |||||||
|
Добавлено через 54 секунды
0
|
|||||||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 11.02.2021, 21:24 | ||
|
0
|
||
|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
|||
| 11.02.2021, 21:53 [ТС] | |||
|
В одной странице меня может быть 8 записей. Алгоритм такой: 1. При включении, просканировать память и найти страницу на которой последний запись. Если дошли до нулевой страницы, тогда считать flash_offset = 0. 2. C адресса конца найденной пустой страници побайтно проверять байты с 0xFF (erase). 3. Если равны, значит в данном байте Нет данных. И делать декремент адрес в пока не попадется первый байт с данными. 4. Если найден байт данным, мы от адреса этого байта отнимает 32 (Размер моего сообщения которое мы записываем char test_array [32]) и записываем это сообщение в наш буфер. 5. Парсимо после слова "sensor 1" номер записи, и обновляем его. Для того чтобы счетчик измерений продолжался с того же числа. В теории, этот алгоритм должен решить нашу проблему с дозаписи в флэш память данных, и продолжать посслидовно считать наши измерения. Если я где-то ошибаюсь, или делаю что-то не так, то пишите.
0
|
|||
|
|
|
| 11.02.2021, 22:08 | |
|
Для 256 байт слишком мало записей. Напрасный расход ресурса памяти.
Для сообщения надо не 32 байта, а всего лишь каких-то 8. Парсинг текстов... беее... При посекторном стирании памяти, хранить весь лог в одном секторе?.. Добавлено через 9 минут Посмотрите, как пишет данные видеорегистратор в авто.
1
|
|
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 11.02.2021, 22:09 | ||
. В остальном все верно. А потом допилите систему с проверкой чексуммы данных, и будет совсем хорошо. Ведь при записи могут быть ошибки. А еще питание может неожиданно сброситься, флешь не идеальна - и данные хоть вы и пишете, они могут оказаться недостоверными. Поэтому, проверять достоверность данных не помешает.PS: вообще, алгоритмы эмуляции EEPROM могут быть и хитрее. Допустим, когда Вы пишете в несколько страниц появляется необходимость организовывать FIFO (циклический буфер). Тогда в каждой записи нужно включать индекс записи. И искать последнее записанное сообщение по нему.
1
|
||
|
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
|
|
| 11.02.2021, 22:26 [ТС] | |
|
0
|
|
|
|
|
| 11.02.2021, 22:29 | |
|
Лучше во всю.
Но можно и поменьше, сколько не жалко. От размера записей, частоты их добавления, размера страниц, выделенного объёма секторов... зависит время исчерпания ресурса. И оно вычисляется.
1
|
|
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 12.02.2021, 00:48 | ||
.Ну, то есть да, для упрощения самой задачи можно посоветовать воспользоваться драйвером файловой системы ). Но это ухудшит положение с жизнеспособностью флеши, и увеличит код программы. Зато появится гибкость и все преимущества файловой системы - пиши что хочешь и куда хочешь.
1
|
||
|
|
|
| 12.02.2021, 04:30 | |
|
Voland_, не это важно. Регистратор пишет кусками. Складывая куски последовательно. Под последовательными возрастающими идентификаторами. Когда место в памяти заканчивается, самые старые куски удаляются, а новые пишутся уже на их место.
0
|
|
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 12.02.2021, 10:47 | ||
|
0
|
||
| 12.02.2021, 10:47 | |
|
Помогаю со студенческими работами здесь
20
STM32F4 SPI Master + STM32F103 Slave STM32F103 SPI не дрыгает ножкой NSS stm32f103 + eeprom spi (нет любви) STM32F103 - ошибка в описании в режиме SPI SimplexUnidirect? STM32F103 и синхронная передача по двум каналам SPI Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|