1 | |
Криво записывается на флеш-память по протоколу SPI26.09.2022, 13:03. Показов 645. Ответов 7
Метки нет (Все метки)
Здравствуйте. Заинтересовала тема SPI протокола. Пробовал скопировать данные с одной флеш-памяти на другую. Для этого я использовал Ардуино в качестве программатора (см. в поисковике), но после записи возникает следующая проблема:
- Первые 128 байт каждого 4096-байтного блока вместо данных содержат байты 0xFF. Вообще не могу понять, в чём дело. При этом читается флеш-память без проблем. Весь исходный код перепроверил. Никаких ошибок. Флеш-память: 25L6433F Даташит тоже ничем не помог. Вообще не понимаю, куда дальше копать.
0
|
26.09.2022, 13:03 | |
Ответы с готовыми решениями:
7
Криво работает флеш анимация в TWebBrowser LPC2468: запись SPI-флеш 25P64V6P, какие-то глюки с SSP0DR Криво выделяет память Флеш память CF Флеш-память и кремний |
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
|
|
26.09.2022, 13:31 | 2 |
То есть, посмотрели в отладчике, что в SPI нужные данные в первых 128 байтах идут?
Посмотрите, что у вас в программе размером 128 байт. Может всё-таки какой-то буфер при первом обращении не заполняется?
0
|
26.09.2022, 14:55 [ТС] | 3 |
Я сначала тоже про это подумал. Кстати, вот сама статья (надеюсь не запрещено). Судя по комментам, у многих правильно работает, как чтение, так и запись.
В коде Ардуино действительно в буфер записываются 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 |
Посмотрел даташит. У этой флешки такой же принцип записи, как у "классических" 24-х. Размер минимально стираемого блока 4 кБайта, размер записываемой страницы 256 байт. Видимо используемая вами библиотека сначала писалась под другую флешку, потом сделана попытка какой-то универсальности, но с этой флешкой получается криво, последовательность действий абсолютно неправильная.
Напишите сами, как положено. Сначала стирание блока 4 кБайта, потом в пределах него запись страниц по 256 байт до заполнения блока, потом следующий блок... Порядок выдачи команд в даташите достаточно подробно написан. Но таким способом записи никто в здравом уме не пользуется. Во первых, это жутко медленно, особенно с операциями стирания, а во-вторых, мгновенно съедает ресурс флеш-памяти. Все нормальные алгоритмы использования флешек сначала пишут последовательно в чистую область, и только когда она заполнится, начинают стиранием освобождать место. Если конечно есть место, где помечено (вами), что эти данные удалены. Почитайте про алгоритмы работы контроллеров накопителей SSD и "флешек". А "библиотеку", которой вы пользуетесь, вероятно ключница делала. Напишите свой код, и всё будет работать. Не забудьте сделать контроль записи, продумать механизм обхода "битых" блоков. Для проверки успешности записи во флешках предусмотрен встроенный механизм с флагами, но при записи большими массивами проще и гораздо быстрее делать проверку чтением всего блока и сравнением с исходным.
1
|
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
|
|
27.09.2022, 11:48 | 5 |
Выдалось время, почитал статью...
kzru_hunter, одного вот этого: то выше напряжение подавать НЕЛЬЗЯ.
0
|
29.09.2022, 08:31 [ТС] | 6 |
3.3V выдавал, но тема временно не актуальна из-за моего косяка.
Скорее всего дело в самой библиотеке. Она стабильно читает, но пишет с данным диагнозом. Попробовал другую библиотеку, скачанную из менеджера библиотек Arduino под названием SPIMemory, а она вообще странно себя ведёт, то сначала видела флешку и считывала DeviceID и даже могла записывать данные туда, куда не могла записать 1-я библиотека, а потом вообще перестала работать с флешкой, хотя прежняя библиотека по-прежнему стабильно работала, но с данным диагнозом.
0
|
locm
|
29.09.2022, 12:49
#7
|
Не по теме: Скачать даташит на флешку, изучить его и написать свою библиотеку не вариант?
0
|
i8085
|
29.09.2022, 16:33
Криво записывается на флеш-память по протоколу SPI
#8
|
Не по теме: Да есть у него всё. Просто "ардуинщик" - это сильно заразное. Думалку отшибает напрочь. А он вон уже почти смертельную дозу впитал. Теперь всю жизнь так и будет чужие кривые библиотеки бездумно подбирать. Подойдёт-не подойдёт...
0
|
29.09.2022, 16:33 | |
Отказала флеш-память навигатора Эээ... Редкостная флеш-память. связка STM32L476 и память M25PE80 по SPI. HAL-драйверы как записать во флеш память PIC16f73 При вызове int21h в память вместо моей строки записывается мусор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |