Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,880
Записей в блоге: 1
1

Криво записывается на флеш-память по протоколу SPI

26.09.2022, 13:03. Показов 645. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Заинтересовала тема SPI протокола. Пробовал скопировать данные с одной флеш-памяти на другую. Для этого я использовал Ардуино в качестве программатора (см. в поисковике), но после записи возникает следующая проблема:
- Первые 128 байт каждого 4096-байтного блока вместо данных содержат байты 0xFF.
Вообще не могу понять, в чём дело. При этом читается флеш-память без проблем. Весь исходный код перепроверил. Никаких ошибок.

Флеш-память: 25L6433F
Даташит тоже ничем не помог. Вообще не понимаю, куда дальше копать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2022, 13:03
Ответы с готовыми решениями:

Криво работает флеш анимация в TWebBrowser
Программа на делфи 7 В TWebBrowser флеш анимация криво работает, не видны некоторые элементы....

LPC2468: запись SPI-флеш 25P64V6P, какие-то глюки с SSP0DR
Тему обновил! В устройстве есть плата на LPC2468 с SPI-флеш ST25P64V6P. Стал смотреть как в...

Криво выделяет память
Пишу программку на dev-c++. При выделении памяти для двух массивов, первому выделяет память...

Флеш память CF
Добрый день, есть промышленная compact flash карта на 8 гб фирмы swissbit, проблема при...

Флеш-память и кремний
Добрый день! Подскажите, пожалуйста, где (и для чего) во флеш-памяти используется кремний? Почему...

7
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
26.09.2022, 13:31 2
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Весь исходный код перепроверил. Никаких ошибок.
То есть, посмотрели в отладчике, что в SPI нужные данные в первых 128 байтах идут?
Посмотрите, что у вас в программе размером 128 байт. Может всё-таки какой-то буфер при первом обращении не заполняется?
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,880
Записей в блоге: 1
26.09.2022, 14:55  [ТС] 3
Цитата Сообщение от i8085 Посмотреть сообщение
То есть, посмотрели в отладчике, что в SPI нужные данные в первых 128 байтах идут?
Посмотрите, что у вас в программе размером 128 байт. Может всё-таки какой-то буфер при первом обращении не заполняется?
Я сначала тоже про это подумал. Кстати, вот сама статья (надеюсь не запрещено). Судя по комментам, у многих правильно работает, как чтение, так и запись.
В коде Ардуино действительно в буфер записываются 128 байт, при этом код дополнительно прибегает к мини-библиотеке SPIFlash.cpp, код которой вполне простой и понятный. Мониторил то, что передаёт прога на Ардуино, не считая инициализации, а именно, она сначала:
1) отправляет команду 'e' для очистки 4096-го байтного блока вместе с адресом блока.
2) отправляет команду 'w', адрес и данные для для записи первых 128 байт (данные верны)
3) отправляет команду 'r' для считывания 4096-го байтного блока. И тут самое интересное: первые 1024 байт этого блока заполнены 0x00, а остальные 0xFF.
4) снова отправляет команду 'w', адрес для записи следующих 128-ми байт и сами данные.
5) снова отправляет команду 'r' для считывания 4096-го байтного блока. При этом первые 128 байт вместо нулей уже заполнены 0xFF, а следующие 128 байт верными данными.
и т.д.
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
26.09.2022, 21:57 4
Цитата Сообщение от kzru_hunter Посмотреть сообщение
для записи первых 128 байт... для считывания 4096-го байтного блока...
Посмотрел даташит. У этой флешки такой же принцип записи, как у "классических" 24-х. Размер минимально стираемого блока 4 кБайта, размер записываемой страницы 256 байт. Видимо используемая вами библиотека сначала писалась под другую флешку, потом сделана попытка какой-то универсальности, но с этой флешкой получается криво, последовательность действий абсолютно неправильная.
Напишите сами, как положено. Сначала стирание блока 4 кБайта, потом в пределах него запись страниц по 256 байт до заполнения блока, потом следующий блок... Порядок выдачи команд в даташите достаточно подробно написан.

стр. 41.
10-19. Page Program (PP)
The Page Program (PP) instruction is for programming memory bits to "0". One to 256 bytes can be sent to the
device to be programmed. A Write Enable (WREN) instruction must be executed to set the Write Enable Latch (WEL)
bit before sending the Page Program (PP). If more than 256 data bytes are sent to the device, only the last 256
data bytes will be accepted and the previous data bytes will be disregarded. The Page Program instruction
requires that all the data bytes fall within the same 256-byte page. The low order address byte A[7:0] specifies the
starting address within the selected page. Bytes that will cross a page boundary will wrap to the beginning of the
selected page. The device can accept (256 minus A[7:0]) data bytes without wrapping. If 256 data bytes are going
to be programmed, A[7:0] should be set to 0.
Чтение страницы записи или сектора применяется в алгоритме записи, когда хотят записывать побайтно. А стирания одного байта во флешках нет, только целиком блок. Добавлять последовательно по одному байту в ранее стёртую страницу можно. Для этого нужно сначала прочитать всю страницу в свой буфер (все 256 байт), вставить в неё в нужное место следующий байт, потом всю страницу перезаписать. Если нужно заменить байт (записать можно только на место "чистого", равного FFh), то надо копировать себе в буфер весь блок 4 кбайта, на флешке стереть его, потом заменить в нём (в скопированном буфере) байт, потом полностью весь блок страницами записать обратно. Но опять же, для данной микросхемы делать это надо страницами по 256 байт.
Но таким способом записи никто в здравом уме не пользуется. Во первых, это жутко медленно, особенно с операциями стирания, а во-вторых, мгновенно съедает ресурс флеш-памяти. Все нормальные алгоритмы использования флешек сначала пишут последовательно в чистую область, и только когда она заполнится, начинают стиранием освобождать место. Если конечно есть место, где помечено (вами), что эти данные удалены.
Почитайте про алгоритмы работы контроллеров накопителей SSD и "флешек".

А "библиотеку", которой вы пользуетесь, вероятно ключница делала. Напишите свой код, и всё будет работать.
Не забудьте сделать контроль записи, продумать механизм обхода "битых" блоков. Для проверки успешности записи во флешках предусмотрен встроенный механизм с флагами, но при записи большими массивами проще и гораздо быстрее делать проверку чтением всего блока и сравнением с исходным.
1
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
27.09.2022, 11:48 5
Выдалось время, почитал статью...
kzru_hunter, одного вот этого:
Пофиг что 5 вольт
достаточно, чтобы возникло сомнение в уровне квалификации автора. Если в даташите на флешку написано, что она трёхвольтовая, а для особо одарённых в таблице предельных максимальных значений (это когда работоспособность уже не гарантируется, только сохранность) на всякий случай ещё и циферки указаны:
Криво записывается на флеш-память по протоколу SPI

то выше напряжение подавать НЕЛЬЗЯ.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,880
Записей в блоге: 1
29.09.2022, 08:31  [ТС] 6
Цитата Сообщение от i8085 Посмотреть сообщение
то выше напряжение подавать НЕЛЬЗЯ.
3.3V выдавал, но тема временно не актуальна из-за моего косяка.
Скорее всего дело в самой библиотеке. Она стабильно читает, но пишет с данным диагнозом. Попробовал другую библиотеку, скачанную из менеджера библиотек Arduino под названием SPIMemory, а она вообще странно себя ведёт, то сначала видела флешку и считывала DeviceID и даже могла записывать данные туда, куда не могла записать 1-я библиотека, а потом вообще перестала работать с флешкой, хотя прежняя библиотека по-прежнему стабильно работала, но с данным диагнозом.
0
locm
29.09.2022, 12:49
  #7

Не по теме:

Скачать даташит на флешку, изучить его и написать свою библиотеку не вариант?

0
i8085
29.09.2022, 16:33     Криво записывается на флеш-память по протоколу SPI
  #8

Не по теме:

Да есть у него всё. Просто "ардуинщик" - это сильно заразное. Думалку отшибает напрочь. А он вон уже почти смертельную дозу впитал. Теперь всю жизнь так и будет чужие кривые библиотеки бездумно подбирать. Подойдёт-не подойдёт...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2022, 16:33

Отказала флеш-память навигатора
Доброго времени! Решил обновить автонавигатор, перед этим сделал форматирование (через виндус 7)....

Эээ... Редкостная флеш-память.
Простите, долго метался по форуму, не знал куда отправить запрос. Но т.к. я в этом деле дуб дубом,...

связка STM32L476 и память M25PE80 по SPI. HAL-драйверы
Заранее прошу прощения за HAL. :-) Но всё же. Настройка SPI. static void MX_SPI1_Init(void) { ...

как записать во флеш память PIC16f73
как записать во флеш память PIC16f73 читать как - написано в даташите, а писать как

При вызове int21h в память вместо моей строки записывается мусор
При вызове int21h в память вместо моей строки записывается мусор.model tiny .code org 100h ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru