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

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 пользователей онлайн

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

×
×
  • Создать...