Перейти к содержанию

Fatfs STM32F103 spi W25Q32 не находит файлы которые есть


artos5

Рекомендуемые сообщения

Добрый вечер всем! 
Проблема следующая:
Есть флешка с записанной файловой системой через USB MASS STORAGE DEVICES.
При "втыкании"  в порт USB открывается на ПК диск с содержимым.
Я подключил библиотеку Fatfs и прописал низкоуровневые функции чтения и записи в файле diskio.c
Работаю с файлом так:
 

disk_initialize(SDFatFs.drv);
if(f_mount(&SDFatFs,(TCHAR const*)USER_Path,0)!=FR_OK)
{
  //Error_Handler();
	Usart1_Send_String("Error_f_mount!\r\n");
}
else
{	
	if(f_open(&MyFile,"01.WAV",FA_READ)!=FR_OK)
  {
    //Error_Handler();
		Usart1_Send_String("Error_open_File1!\r\n");
  }
  else
	{
	Usart1_Send_String("open_File_OK1!\r\n");
	}
		
	if(f_open(&MyFile,"01.wav",FA_READ)!=FR_OK)
  {
    //Error_Handler();
		Usart1_Send_String("Error_open_File2!\r\n");
  }
  else
  {
		Usart1_Send_String("open_File_OK2!\r\n");
		UINT testBytes=0;
		f_read(&MyFile, buff1, 512, &testBytes);
		
		sprintf(buf1, "TestBytes=%d\r\n", testBytes);
		Usart1_Send_String(buf1);
		
		Usart1_Send_hex((char*)buff1, 512);
		Usart1_Send_String("read_File_complite!\r\n");
   f_close(&MyFile);
  }
}

подправил diskio.c так:
 

DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	DWORD sector,	        /* Sector address in LBA */
	UINT count		/* Number of sectors to read */
)
{
  DRESULT res;
 
  //res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count);
	sprintf(buffer0, "sector=%lu\r\n", sector);
	Usart1_Send_String(buffer0);
 w25qReadPage(buff, sector*2);
 w25qReadPage(buff + 256, sector*2+256);
	res=RES_OK;
  return res;
}
#if _USE_WRITE == 1
DRESULT disk_write (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	const BYTE *buff,	/* Data to be written */
	DWORD sector,		/* Sector address in LBA */
	UINT count        	/* Number of sectors to write */
)
{
  DRESULT res;
  
  //res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count);
		w25qWritingByUSB(sector, (uint8_t*)buff);
	res=RES_OK;
  return res;
}
#endif /* _USE_WRITE == 1 */

функцию чтения на самом деле пробовал прописывать по разному, все равно не корректно работает...

Выдает в отладке такое:
 

Program start!....
sector=0            // это обращение к функции чтения DRESULT disk_read ();
Error_open_File1!
sector=0            // это обращение к функции чтения DRESULT disk_read ();
Error_open_File2!

Что я забыл еще добавить?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Это тот самый проект, просто следующий этап задачи - реализовать чтение уже записанных файлов на стороне МК.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Проанализируй свой лог, f_mount, что несколько раз вызывается?

Если брать твой лог отладки, то как Я понял disk read-у дана команда прочитать сектор 0, т.е. прочитать MBR диска. Другие сектора не читались (т.е. дольше f_mount не пошло), к MBR-у там обращается только f_mount, а f_mount заполняет структуру диска, где много чего указано в том числе начало FAT, начало каталога и т.п. После MBR должен читаться сектор с BPB.

f_open(&MyFile,"01.WAV",FA_READ) имя файла не помню можно ли так задавать, у меня там указатель на

char FileName[20] = "30.dcr";

f_mount(&SDFatFs,(TCHAR const*)USER_Path,0)!=FR_OK - всегда будет Ок, так как стоит 0.

Отлаживай по очереди, сделай принудительное монтирование f_mount - посмотри, что структура заполнена правильно, потом f_open

Ссылка на комментарий
Поделиться на другие сайты

А что там анализировать?

1) Монтируется успешно.

2) Запрашивается в функции чтения данные с сектором 0, и перед каждым не успешно найденным файлом.

3) если выкинуть отладку, то один файл находит, но чтение буфера 0 и сам буфер пустой.

Где-то косяк с конфигами...

Кто работал пожалуйста подскажите, чтобы меньше потратить времени...

4 часа назад, donec сказал:

f_open(&MyFile,"01.WAV",FA_READ) имя файла не помню можно ли так задавать, у меня там указатель на

char FileName[20] = "30.dcr";

Можно конечно. Какая разница как название указывать? Через массив символов либо явно указав массив символов в виде строки.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

1. Вообще не монтируется, это факт;

2. Я писал кем запрашивается;

3. Как он может файл находить если диск не смонтирован, это ошибка в твоей логике, Я писал, что f_mount(&SDFatFs,(TCHAR const*)USER_Path,0) всегда равно FR_OK, почему тоже писал;

4. 

7 часов назад, artos5 сказал:

Какая разница как название указывать?

Когда вернусь к своему проекту, проверю, может и без разницы.

Ссылка на комментарий
Поделиться на другие сайты

Подскажи пожалуйста как правильно инициировать монтирование диска, и вообще помоги пожалуйста куском кода, который будет открывать файл.

Этот пример я взял в интернете.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Я вычитал полностью дамп , и начало у меня выглядит так:

скрин.png

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Так это я форматировал виндой. Сейчас микроконтроллер и флеш память как USB флешка. Вот в винде я и отформатировал...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

На твоем диске записан загрузчик который винда считывает и запускает, вероятно потом этот загрузчик считывает еще один загрузчик уже логического диска и его запускает, и уже он работает с файловой системой этого диска.

Ссылка на комментарий
Поделиться на другие сайты

Примерно так

DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
{
		BYTE buffer[4096);
		//
		while (count)
		{
			w25qReadPage(buffer, sector >> 3);
			memcpy(buff, buffer + ((sector & 0x07) << 9), 512);
			buff += 512;
			count--;
		}	
		//
		return RES_OK; // или соответственно с ошибкой от w25qReadPage
}

Можно еще проверку внести считаны ли уже данные этого сектора w25g, чтоб быстрее было.

Ссылка на комментарий
Поделиться на другие сайты

44 минуты назад, donec сказал:

Примерно так

Я написал там код точно также как у меня написан код в обработчике USB. Это рабочий код чтения с USB размер как раз 512 байт.
119839048_2024-03-29130738.png.f2e3091574b4009e46095c08fb2e01ae.png
 

В Fatfs не работает корректно, в USB работает корректно.

//Чтение 512 байт в Fatfs
DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	DWORD sector,	        /* Sector address in LBA */
	UINT count		/* Number of sectors to read */
)
{
  DRESULT res;
 
  //res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count);
	sprintf(buffer0, "sector=%lu\r\n", sector);
	Usart1_Send_String(buffer0);
 w25qReadPage(buff, sector*2);
 w25qReadPage(buff + 256, sector*2+1);
	res=RES_OK;
  return res;
}

//Чтение 512 байт в USB:
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
LED0;  // 0 включение светодиода

 w25qReadPage(buf, blk_addr * 2);
 w25qReadPage(buf + 256, blk_addr * 2 + 1);

 LED1;  // 1 выключение светодиода
 return (USBD_OK);
  /* USER CODE END 6 */
}

 

52 минуты назад, donec сказал:

Можно еще проверку внести считаны ли уже данные этого сектора w25g, чтоб быстрее было.

Стоп, или нужно сразу 4КБ вычитывать из обработчика DRESULT disk_read()?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

34 минуты назад, artos5 сказал:

Это рабочий код чтения с USB размер как раз 512 байт

Тогда нужно разобраться с параметрами этих функций, что есть что.

Ссылка на комментарий
Поделиться на другие сайты

27 минут назад, donec сказал:

w25qReadPage читает

Она читает по 256 байт. Как правильно состыковать из 

 

28 минут назад, donec сказал:

disk_read

?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, artos5 сказал:
disk_initialize(SDFatFs.drv);

эта функция должна возвращать значение 0 - это так?

Для тебя это должна быть заглушка которая возвращает 0.

uint8_t success = disk_initialize();
success - вывести в отладку, что выдает

uint8_t success = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);
success - вывести в отладку, что выдает

 

Ссылка на комментарий
Поделиться на другие сайты

42 минуты назад, dolmatovva сказал:

но в disk_initialize нет ретурнов...

Есть ретурны.

DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
  DSTATUS stat = RES_OK;
  
  if(disk.is_initialized[pdrv] == 0)
  { 
    disk.is_initialized[pdrv] = 1;
    stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
  }
  return stat;
}
43 минуты назад, dolmatovva сказал:

у ТСа нет понимания работы файловой системы, вопрос, для чего он взялся за этот проект ?

Общее понимание работы файловой системы есть. Нет пока понимания как пользоваться библиотекой Fatfs.

Взялся за задачу, чтобы разобраться как работает файловая система и т.д. Все когда-то не понимали что и как работает.

1 час назад, donec сказал:

Для тебя это должна быть заглушка которая возвращает 0.

Сейчас сделаю и посмотрю что выдает. Спасибо что помогаешь!

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, donec сказал:
uint8_t success = disk_initialize();
success - вывести в отладку, что выдает

uint8_t success = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);
success - вывести в отладку, что выдает
Program start!....
disk_initialize=1
sector=0
disk_mount=13
sector=0
Error_open_File1!
sector=0
Error_open_File2!

Код отладки такой:

int saccess = disk_initialize(SDFatFs.drv);
sprintf(buf1, "disk_initialize=%d\r\n", saccess);
Usart1_Send_String(buf1);
saccess = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);
sprintf(buf1, "disk_mount=%d\r\n", saccess);
Usart1_Send_String(buf1);

Диск не монтируется, ошибка..

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, artos5 сказал:

Есть ретурны

в первом посте или не полный листинг, но не увидел их. По поводу библиотеки смотреть её тексты и, или править, или принимать как есть. Ну и код можно универсальнее написать наверное.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • 2,4кОм уже заказал, новая сложность))) неполярные электролиты, впервые с ними сталкиваюсь, стоят они как космолет, можно конечно сделать из полярных но получится громоздко
    • Конечно нет. Более того, вышеупомянутой 140уд1 достаточно для 90% всех БП, но новые детали позволяют применять разные схемотехнические решения ранее недоступные - например, отсутствие отрицательного источника питания или цепей балансировки ибо их смещение по входам может оказаться пренебрежимо мало, а крайне малый ток полевикового входа не требует сильного согласования импедансов для выравнивания смещений, создаваемых входными токами. Но в чем тогда интерес в разработке схемы, если это будет всё тот же болгарский БП из 70х, причем на тех же самых деталях и по абсолютно такой же схеме Понятно, что особо улучшать схемотехнику линейных БП некуда. Но со старыми деталями, требующими дополнительные пару вольт питания из-за узкого диапазона синфазных сигналов или имеющих почти микроамперы входного тока приходится схемотехнически возиться как с каким-то пажылым дедушкой - там ему костыль в виде отрицательного питания, тут надо импедансы равные по входам, не то смещение будет (у 140уд1, например, даже нет выводов балансировки, т.е. смещение надо вводить отдельной  цепью по входу), а здесь надо выход повторителем усилить, ибо не может раскачать базу силового транзистора... и т.д. Повозиться из интереса можно, но не знаю какое веселье в который раз изобретать один и тот же болгарский велосипед.   Это даже скорее не БП, а гибрид из БП и  вольтамперметра для всяческих издевательств над детальками. Как пример. И вот ещё. Причем эти "много оу" не просто какие-то там буферы-измерялки, а именно в петле ООС стоят, что прибавляет головной боли схемотехнику. Я пытался повторить их "переключалку петель оос", или просто "клампу", как я ее обзываю, в микрокапе хотяб на моделях ОУ типа 741, с использованием в интеграторе TL071, но ничего не вышло, схема стабильно даёт овершуты под 5-10%, что говорит о неоптимально скорректированной под БП АЧХ. Этот рубеж пока что мне не доступен никак, вот  и вожусь со схемой шелестова на четырёх ОУ.  
    • Думаю тут мини версию усилка сделать. А то валяется коробочка одна, от заброшенного одного проекта) Турецкий фильтр тут плату добиваю неспешно, с ней совместить что ли. TDA7377 норм будет ?  
    • Что за бп такой, что аж 10 оу надо. После керамики идёт предпочтение "индустриальных". а точно эти "новейшие новинки" вот так нужны всегда ?  вполне себе может быть, почему и нет. сомнительный кайф корпеть над мелкотой лишний раз)
    • лапки 3 и 4 IC2 ? Точней 15-16-17 CD разъёма.   что это значит ?  
    • Мне третий раз написать что можно? Или у кого аргументированные возражения будут?
    • Я согласен, что эти корпуса неудобны для ручного монтажа, но брать микросхему хуже по параметрам просто потому что корпус надо устанавливать под лупой эт не оправдание кмк. И древний. Современные детали в керамике достать проблематично. "Точно орига" может быть только при прямой покупке у поставщика, ну или отечественной комплектухи, пока китайцы благо не поняли, что можно на 140уд7 написать 140уд17 и никто не заметит) А про качество - ну посмотрите на сроки сохраняемости, это пожалуй единственный плюс герметичного керамического корпуса для любителя. Но если мне в БП на 10 ОУ пихать каждый корпус керамический... Цена выйдет такая что дешевле взять заводской SMU
×
×
  • Создать...