QSPI - продолжение

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

QSPI - продолжение

Сообщение 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++).
Последний раз редактировалось MementoMori Ср фев 12, 2020 23:33:06, всего редактировалось 2 раза.
Реклама
Аватара пользователя
ozzy
Грызет канифоль
Сообщения: 256
Зарегистрирован: Вс янв 18, 2009 20:15:27
Откуда: UA ZT

Re: QSPI - продолжение

Сообщение ozzy »

как вариант - нарушение границ массива
Реклама
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение MementoMori »

[uquote="ozzy",url="/forum/viewtopic.php?p=3789972#p3789972"]как вариант - нарушение границ массива[/uquote]

Вот я уже понял это. И первый пост подправил.
Размер буфера (если у IDE не расходятся слова с делом, то есть параметр sz и истинный размер массива), не соответствует.

sz=256, Всего проверится должно 256 адресов, адреса идут через один, то есть до 0x200, а вот с 0x201 возникает проблема

А посему - посмотрите в код - почему так сделано? Почему sz умножается на 4?
И как объяснить, что адреса идут через один, хотя adr++ встречается в цикле один раз...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: QSPI - продолжение

Сообщение VladislavS »

Я тебе сейчас один умный вещь скажу - ты офигеешь. Флэшка твоя отображается в общее адресное пространство процессора и IDE сама может её читать. Всё что тебе надо сделать - удалить BlanckChek и Verify. От, така фигня, малята. Только не создавай новых тем как это сделать :)
Реклама
Эиком - электронные компоненты и радиодетали
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение MementoMori »

ты офигеешь
Офигеваю:
удалить BlanckChek
Удалил. Вернулся к обсуждаемой ранее проблеме - не хочет стирать, вываливается в HardFault. Вы писали, что причина тому - недоинициализированный qspi - специально проверил - к моменту вызова стирания сектора все инициализировано
Флэшка твоя отображается в общее адресное пространство процессора и IDE сама может её читать. Всё что тебе надо сделать - удалить ..... Verify.
IDE это не понравилось.
Говорит что он Cannot access Memory
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: QSPI - продолжение

Сообщение VladislavS »

Ну так надо сделать чтобы могла Аccess Memory. И IDE она :)
Реклама
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение MementoMori »

MemoryMapped включить? Так включен же.
И IDE она
Грамматически нея совсем понятно, что вы хотели сказать.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: QSPI - продолжение

Сообщение 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 сама (вот тут женский род) может это сделать.
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение MementoMori »

Ладно... вечером разберусь.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: QSPI - продолжение

Сообщение 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);
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: QSPI - продолжение

Сообщение AVI-crak »

Возможно поможет https://bitbucket.org/AVI-crak/system_f ... /qspi_rw.c
Весь смысл работы с флешем - не допускать ошибок. Когда адреса длинные, да ещё и в большом количестве - уследить за всем очень трудно. А если ещё нужно контролировать границы секторов в ручном режиме - значит что-то вы делаете явно не так. Буфер под один сектор - это минимальная плата от головной боли. Да, он большой, некоторые 25-тые чипы имеют сектора размером 512к, и встроенной памяти уже не хватит. Но лучше чтобы оно само там у себя считало, без нашего участия.
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение 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:
Вот результат....
Спасибо Владиславу за помощь!
Изображение
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: QSPI - продолжение

Сообщение VladislavS »

[uquote="MementoMori",url="/forum/viewtopic.php?p=3790272#p3790272"]А вот следующая запись 0x00010000, 0x00010000 - почему начальный адрес не нулевой?[/uquote]Указывается адрес с которого начинается другой размер сектора.
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение MementoMori »

То есть по нулевому адресу расположен сектор меньшего размера? А работать с секторами размером 0x10000 можно только с адреса 0x10000?
Но почему тогда я без проблем стираю сектор 64кб находящийся по адресу 0x00000000 ?

Или это просто инструкция для IDE, как работать, но не отражающая структуру памяти?
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: QSPI - продолжение

Сообщение AVI-crak »

[uquote="MementoMori",url="/forum/viewtopic.php?p=3790272#p3790272"]Как я понимаю архитектуру моей флешки: есть сектор 4 кб, 16 секторов объединены в блоки по 64 кб (в других микросхемах зовется субсектор и сектор, но коды обращения те же). Можно стирать по 4 кб, можно стирать по 64 кб. Адреса начинаются с нуля и кратны либо 4 кб либо 64 кб.[/uquote]

Режим эмуляции малых секторов включается записью в OTP регион памяти, причём эта запись будет удачной только после команды полного стирания флеша. Малые сектора могут начинаться с нулевого адреса, или располагаться в самом конце флеша. Ресурс малых секторов в несколько раз ниже полноразмерных, а потому они актуальны только для использования с очень дешёвыми мк.
MementoMori
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср фев 05, 2020 19:35:56

Re: QSPI - продолжение

Сообщение MementoMori »

У меня стоит вот так

// Specify Size and Address of Sectors
0x00010000, 0x00000000,
SECTOR_END

Работает. Оставить так и не париться?
Ответить

Вернуться в «ARM»