Страница 1 из 1
QSPI - продолжение
Добавлено: Ср фев 12, 2020 23:12:21
MementoMori
Решил открыть новую тему, так как предыдущие по своему названию и сути не соответствуют обсуждаемому вопросу.
Итак... Я разобрался с QSPI, с работой алгоритма.
Все у меня замечательно стирается и прошивается. Но на одном и том же адресе проверки 0x200 выдает ошибку проверки.
Проверяю вот так:
Код: Выделить всё
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf) {
uint32_t StartAddresse = 0x90000000;
uint32_t VerifiedData = 0;
sz*=4;
QUADSPI_MappedMode();
while (sz>VerifiedData)
{
if ( *(uint8_t*)adr++ != *((uint8_t*)buf + VerifiedData))
{
sprintf((char *)str, "ADDRESS= 0x%08X, DATA=0x%02X, MUST BE= 0x%02X, ERROR ERROR ERROR ERROR ERROR ERROR \r\n",adr-1 + VerifiedData, *(uint8_t*)(adr-1), *((uint8_t*)buf + VerifiedData));
HAL_UART_Transmit(&huart7, str, strlen((char *)str), 3000);
return (adr-1 + VerifiedData);
}
else
{
sprintf((char *)str, "ADDRESS= 0x%08X, DATA=0x%02X, MUST BE= 0x%02X, OK \r\n",adr-1 + VerifiedData, *(uint8_t*)(adr-1), *((uint8_t*)buf + VerifiedData));
HAL_UART_Transmit(&huart7, str, strlen((char *)str), 3000);
}
VerifiedData++;
}
/* Add your Code */
return (0); // Finished without Errors
}
В терминале получаю
ДАнные в этом месте действительно должны быть равны 0x00 - но почему-то IDE сравнивает с 0x49.....
Ковырял по всякому.
В частности - прошив флешку, получив сообщение об ошибке проверки, я запустил обычный проект, прочел содержимое записанного, вывел в терминал, сверил - записано все верно. Глючит проверяльщика.....
Куда копать?... Может с функцией Verify что-то не так?
А с ней явно что-то не так....
1. Размер буфера, переданный IDE, умножается на 4. По факту проверка идет по одной странице, по 256 байт - параметр sz, который IDE передает в функцию, равен 256
2. Адреса идут через один, хотя в каждом цикле идет однократное увеличение адреса (adr++).
Re: QSPI - продолжение
Добавлено: Ср фев 12, 2020 23:24:58
ozzy
как вариант - нарушение границ массива
Re: QSPI - продолжение
Добавлено: Ср фев 12, 2020 23:41:17
MementoMori
[uquote="ozzy",url="/forum/viewtopic.php?p=3789972#p3789972"]как вариант - нарушение границ массива[/uquote]
Вот я уже понял это. И первый пост подправил.
Размер буфера (если у IDE не расходятся слова с делом, то есть параметр sz и истинный размер массива), не соответствует.
sz=256, Всего проверится должно 256 адресов, адреса идут через один, то есть до 0x200, а вот с 0x201 возникает проблема
А посему - посмотрите в код - почему так сделано? Почему sz умножается на 4?
И как объяснить, что адреса идут через один, хотя adr++ встречается в цикле один раз...
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 06:24:52
VladislavS
Я тебе сейчас один умный вещь скажу - ты офигеешь. Флэшка твоя отображается в общее адресное пространство процессора и IDE сама может её читать. Всё что тебе надо сделать - удалить BlanckChek и Verify. От, така фигня, малята. Только не создавай новых тем как это сделать

Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 06:57:55
MementoMori
ты офигеешь
Офигеваю:
удалить BlanckChek
Удалил. Вернулся к обсуждаемой ранее проблеме - не хочет стирать, вываливается в HardFault. Вы писали, что причина тому - недоинициализированный qspi - специально проверил - к моменту вызова стирания сектора все инициализировано
Флэшка твоя отображается в общее адресное пространство процессора и IDE сама может её читать. Всё что тебе надо сделать - удалить ..... Verify.
IDE это не понравилось.
Говорит что он Cannot access Memory
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 07:09:28
VladislavS
Ну так надо сделать чтобы могла Аccess Memory. И IDE она

Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 07:12:27
MementoMori
MemoryMapped включить? Так включен же.
И IDE она
Грамматически нея совсем понятно, что вы хотели сказать.
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 07:37:25
VladislavS
[uquote="MementoMori",url="/forum/viewtopic.php?p=3790052#p3790052"]MemoryMapped включить? Так включен же.[/uquote]Выходит, что не включен.
Кстати, вот зачем так код усложнять? Открыл первый попавшийся пример из Keil
Код: Выделить всё
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf)
{
unsigned char* ptr = (unsigned char*)adr;
for(unsigned int i = 0; i < sz; i++)
{
if(ptr[i] != buf[i])
return (unsigned long)(ptr + i);
}
return (adr + sz);
}
Но повторюсь, IDE сама (вот тут женский род) может это сделать.
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 07:55:41
MementoMori
Ладно... вечером разберусь.
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 09:04:22
VladislavS
Между нами, девочками, прототип функции Verify вот такой
Код: Выделить всё
/*
* Verify Flash Contents
* Parameter: adr: Start Address
* sz: Size (in bytes)
* buf: Data
* Return Value: (adr+sz) - OK, Failed Address
*/
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf);
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 15:42:45
AVI-crak
Возможно поможет
https://bitbucket.org/AVI-crak/system_f ... /qspi_rw.c
Весь смысл работы с флешем - не допускать ошибок. Когда адреса длинные, да ещё и в большом количестве - уследить за всем очень трудно. А если ещё нужно контролировать границы секторов в ручном режиме - значит что-то вы делаете явно не так. Буфер под один сектор - это минимальная плата от головной боли. Да, он большой, некоторые 25-тые чипы имеют сектора размером 512к, и встроенной памяти уже не хватит. Но лучше чтобы оно само там у себя считало, без нашего участия.
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 20:13:40
MementoMori
Заработало......
Стирает, пишет, проверяет.
Неужели настал этот день и час?....
Добавлено after 26 minutes 1 second:
Напоследок обьясните мне одну вещь, которую я так и не понял. Вот настройки секторов из мануала в качестве примера
256 KB divided into:
4 * 16 KB
1 * 64 KB
1 * 128 KB
<SectorInfo>:
// SectSize StartAddr of block (absolute)
0x00004000, 0x00000000, // 4 * 16 KB = 64 KB
0x00010000, 0x00010000, // 1 * 64 KB = 64 KB
0x00020000, 0x00020000, // 1 * 128 KB = 128 KB
Как я понимаю архитектуру моей флешки: есть сектор 4 кб, 16 секторов объединены в блоки по 64 кб (в других микросхемах зовется субсектор и сектор, но коды обращения те же). Можно стирать по 4 кб, можно стирать по 64 кб. Адреса начинаются с нуля и кратны либо 4 кб либо 64 кб.
Вернемся теперь к мануалу - там 3 варианта. Это что - список для IDE, в котором есть возможные размеры секторов, а IDE уже сама выбирает по сколько стирать?
Запись 0x4000, 0x00 мне понятна размер сектора и начальный адрес.
А вот следующая запись 0x00010000, 0x00010000 - почему начальный адрес не нулевой?
Во флеши что, сектора не идентичны? Первый сектор меньше чем остальные?
Я попробовал стереть по нулевому адресу сектор (блок) размерами 64 кб - стерся весь.
Добавлено after 2 hours 19 minutes 2 seconds:
Вот результат....
Спасибо Владиславу за помощь!

Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 20:16:06
VladislavS
[uquote="MementoMori",url="/forum/viewtopic.php?p=3790272#p3790272"]А вот следующая запись 0x00010000, 0x00010000 - почему начальный адрес не нулевой?[/uquote]Указывается адрес с которого начинается другой размер сектора.
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 20:21:42
MementoMori
То есть по нулевому адресу расположен сектор меньшего размера? А работать с секторами размером 0x10000 можно только с адреса 0x10000?
Но почему тогда я без проблем стираю сектор 64кб находящийся по адресу 0x00000000 ?
Или это просто инструкция для IDE, как работать, но не отражающая структуру памяти?
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 21:10:50
AVI-crak
[uquote="MementoMori",url="/forum/viewtopic.php?p=3790272#p3790272"]Как я понимаю архитектуру моей флешки: есть сектор 4 кб, 16 секторов объединены в блоки по 64 кб (в других микросхемах зовется субсектор и сектор, но коды обращения те же). Можно стирать по 4 кб, можно стирать по 64 кб. Адреса начинаются с нуля и кратны либо 4 кб либо 64 кб.[/uquote]
Режим эмуляции малых секторов включается записью в OTP регион памяти, причём эта запись будет удачной только после команды полного стирания флеша. Малые сектора могут начинаться с нулевого адреса, или располагаться в самом конце флеша. Ресурс малых секторов в несколько раз ниже полноразмерных, а потому они актуальны только для использования с очень дешёвыми мк.
Re: QSPI - продолжение
Добавлено: Чт фев 13, 2020 21:15:52
MementoMori
У меня стоит вот так
// Specify Size and Address of Sectors
0x00010000, 0x00000000,
SECTOR_END
Работает. Оставить так и не париться?