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

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


artos5

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

Подскажи пожалуйста. 
Есть строчка кода монтирования диска:
 

f_mount(&SDFatFs, (TCHAR const*)USER_Path, 0);

А в свою очередь
 

char USER_Path[4]; /* logical drive path */

Объявлен в начале функции main.c
И больше нигде этот массив не используется кроме монтирования. Так и должно быть? Или где-то нужно USER_Path еще прописать?

Вопрос снимается :)

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

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

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

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

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

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

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

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

После правок библиотек, достиг некоторого успеха!
 

Спойлер
Program start!....
disk_initialize=1
sector=0
disk_mount=0
sector=0
sector=32
sector=33
sector=34
sector=35
sector=36
sector=37
sector=38
sector=39
sector=40
sector=41
sector=42
sector=43
sector=44
sector=45
sector=46
sector=47
sector=48
sector=49
sector=50
sector=51
sector=52
sector=53
sector=54
sector=55
sector=56
sector=57
sector=58
sector=59
sector=60
sector=61
open_File_OK1!
sector=0
sector=32
sector=33
sector=34
sector=35
sector=36
sector=37
sector=38
sector=39
sector=40
sector=41
sector=42
sector=43
sector=44
sector=45
sector=46
sector=47
sector=48
sector=49
sector=50
sector=51
sector=52
sector=53
sector=54
sector=55
sector=56
sector=57
sector=58
sector=59
sector=60
sector=61
open_File_OK2!
TestBytes=0
<0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>read_File_complite!

 

Монтируется успешно, и файлы открывает успешно, но читаются из файлов ноли.

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

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

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

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

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

Что то не ладно в датском королевстве, инициализации должна выдавать 0, у тебя один, я ж писал, что 0 должен возвращаться. А ещё больше непонятно почему моунт равен нулю при диск инициализации равном не нулю, что то там у тебя нахимичено

 

А потому, что не читаешь, что я пишу, в моунте не ноль, а единицу нужно было поставить

Моунт должен один раз вызывать я с единицей лучше.

В disk_initia.... должен быть только return 0, и все, заглушка. И disk_init..... твоим кодом вызываться не должен.

 

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

у меня HAL-вский Fatfs.

Не пойму это везде так?
у меня есть

diskio.c
и user_diskio.c


я сначала правил diskio.c
и вообще не работало. Потом вернул diskio.c к изначальному виду и поправил user_diskio.c, и появились некоторые изменения.

Прикрепляю архив проекта. Тут где-то не до конца сконфигурирована библиотека Fatfs

backup.rar

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

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

У меня нет желания разбираться с STM тем более с HAL, что там и как подключено.

Я вижу такой путь;

1. В твоем коде не должно быть вызова этой функции, ее вызывает f_mount.

DSTATUS disk_initialize ()
{
	return 0;
}

2.

success = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);

должна вызываться один раз при инициализации ФАТа, если без ошибок то success будет равна 0, если не равна то смотреть код ошибки и принимать меры.

3.

success = f_open(&MyFile,"01.wav",FA_READ);

также насчет ошибки

4. если всё без ошибок тогда смотреть данные считанных секторов и если не нормально разбираться.

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

10 минут назад, donec сказал:
success = f_mount(&SDFatFs, (TCHAR const*)USER_Path, 1);

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

А это:
 

	FR_OK = 0,				/* (0) Succeeded */
	FR_DISK_ERR,			/* (1) A hard error occurred in the low level disk I/O layer */
	FR_INT_ERR,				/* (2) Assertion failed */
	FR_NOT_READY,			/* (3) The physical drive cannot work */

 

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

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

Скачал библиотеку с сайта автора и подключил к проекту. Все снова прописал. И выдает также код 3! 
 

FR_NOT_READY,			/* (3) The physical drive cannot work */

Вот:
 

Program start!....
disk_mount=3
Error_f_mount!

У меня уже голова закипает :)

Что я еще забыл там прописать?
Кстати в блок 
 

DRESULT disk_read ()

теперь не заходит, даже при монтировании.

backup1.rar

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

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

А номер диска равен 0? Ну оставь свою disk_initialize только номер диска 0, может у меня что-то переделано поэтому заглушка срабатывает.

Здесь программа которая проверяет совместимость с FatFS.

2024-03-30_08-36-11.png

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

Поставил на diskini...() заглушку return 0;

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

Program start!....
diskread: sector=0; count=1
disk_mount=0 #disk=Ð5
diskread: sector=32; count=1
diskread: sector=33; count=1
diskread: sector=34; count=1
diskread: sector=35; count=1
diskread: sector=36; count=1
diskread: sector=37; count=1
diskread: sector=38; count=1
diskread: sector=39; count=1
diskread: sector=40; count=1
diskread: sector=41; count=1
diskread: sector=42; count=1
diskread: sector=43; count=1
diskread: sector=44; count=1
diskread: sector=45; count=1
diskread: sector=46; count=1
diskread: sector=47; count=1
diskread: sector=48; count=1
diskread: sector=49; count=1
diskread: sector=50; count=1
diskread: sector=51; count=1
diskread: sector=52; count=1
diskread: sector=53; count=1
diskread: sector=54; count=1
diskread: sector=55; count=1
diskread: sector=56; count=1
diskread: sector=57; count=1
diskread: sector=58; count=1
diskread: sector=59; count=1
diskread: sector=60; count=1
diskread: sector=61; count=1
diskread: sector=5582; count=1
Test data Fatfs!=5582; count=1

read_File_complite! Test=16
open_File_OK1!

Тестовый код:
 

int saccess = 0;
Usart1_Send_String(buf1);
char disk[8];
res = f_mount(&FatFs, disk, 1);
sprintf(buf1, "disk_mount=%d #disk=%s\r\n", res, disk);
Usart1_Send_String(buf1);
if(res !=FR_OK)
{
	Usart1_Send_String("Error_f_mount!\r\n");
}
else
{	
	if(f_open(&File,"01.txt",FA_READ)!=FR_OK) //f_open(&, ptr, (BYTE)p1)
  {
		Usart1_Send_String("Error_open_File1!\r\n");
  }
  else
	{
		UINT testBytes=0;
		f_read(&File, buff1, 256, &testBytes);
		Usart1_Send_hex((char*)buff1, strlen((char*)buff1));
		sprintf((char*)buff1, "\r\nread_File_complite! Test=%d\r\n", testBytes);
		Usart1_Send_String((char*)buff1);
   f_close(&File);
	Usart1_Send_String("open_File_OK1!\r\n");
	}

 

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

А номер диска равен 0?

А как номер диска узнать? пытаюсь подставить массив текстовый при монтировании , номер диска не показывает:
 

char disk[5]={'T','E', 'S', 'T', 0};
res = f_mount(&FatFs, disk, 1);
sprintf(buf1, "disk_mount=%d #disk=%s\r\n", res, disk);

Выдает:
 

Program start!....
diskread: sector=0; count=1
disk_mount=0 #disk=TEST

 

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

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

Скинь пожалуйста свои библиотеки, которые работают у тебя...

Кстати в секции read я прописал так:
 

while(count > 0) {
 w25qReadPage(buff, sector * 2);
 w25qReadPage(buff + 256, sector * 2 + 1);
        buff += 512;
			sprintf((char*)buff1, "diskread: sector=%lu; count=%d\r\n", sector, count);
		Usart1_Send_String((char*)buff1);
        count--;
    }

 

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

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

Номер диска ты задаешь pdrv.

Если моунт прошел с FR_OK значит диск смонтирован, можно читать файл по пункту 3, и что выдаст, если FR_OK, т.е. 0, значит файл прочитан.

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

2 часа назад, artos5 сказал:
	if(f_open(&File,"01.txt",FA_READ)!=FR_OK) //f_open(&, ptr, (BYTE)p1)
  {
		Usart1_Send_String("Error_open_File1!\r\n");
  }
  else
	{
		UINT testBytes=0;
		f_read(&File, buff1, 256, &testBytes);
		Usart1_Send_hex((char*)buff1, strlen((char*)buff1));
		sprintf((char*)buff1, "\r\nread_File_complite! Test=%d\r\n", testBytes);
		Usart1_Send_String((char*)buff1);
   f_close(&File);
	Usart1_Send_String("open_File_OK1!\r\n");
	}

По логам как-то странно себя ведет этот код, f_read дана команда прочесть 256 байт, а он читает всего 16 байт, может у тебя файл 16 байт и они заполнены нулями?

Сектора с 32 по 61 это должно быть чтение каталога для поиска файла, сектор 5582 это сам файл.

Короче тут нужно сравнивать структуры FatFS, FIL. и возможно другие...

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

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

char disk[5]={0};

Program start!....
diskread: sector=0; count=1
disk_mount=0 #disk=

 

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

f_read дана команда прочесть 256 байт, а он читает всего 16 байт,

Странно... А может это из-за того что это текстовый файл, и в нем мало данных?

В текстовом файле содержится строка:

Test data Fatfs!

Как раз 16 байт))

Дописал символы:
 

Test data Fatfs!12345

 Победа похоже близка ))))
Нужно проверить как будет читать более крупные файлы!

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

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

После f_open в структуре FIL имеется поле длина файла в байтах, если читаешь f_read, то задаешь количество байт на чтение не более значения в поле структуры FIL когда читаешь сразу весь файл, правильность чтения этих байт контролируешь по количеству байт заданных на чтение и количеству байт прочитанных, значения должны совпадать. Если читаешь часть файла, то можно задавать меньшее количество байт на чтение, но тогда прежде чем читать следующие байты нужно сделать смещение от начала файла функцией f_lseek. 

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

Осталось победить корректное чтение более 512 байт)))
До 512 байт читает нормально. Более 512 байт данных просто вообще не выводит. Получается проблема в обработчике чтения.
 

while(count > 0) {
 w25qReadPage(buff, sector * 2);
 w25qReadPage(buff + 256, sector * 2 + 1);
        buff += 512;
			sprintf((char*)buff1, "diskread: sector=%lu; count=%d\r\n", sector, count);
		Usart1_Send_String((char*)buff1);
        count--;
    }

 

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

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

Размер буфера 4096 , а больше 512 байт прочитать не может.

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

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

Смотри, может это наведет на мысли что не так?
Когда читаешь данные меньше 512 (именно когда файл содержит меньше 512 байт данных), то читается нормально.
Но вот когда файл более 512 байт, то не читается вообще ничего. Даже первые 512 байт.

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

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

Проверил точно поведение программы. В общем, если читаешь меньше 512 и файл больше 512 байт, то тоже нормально все читается.
Если файл больше 512 и читаешь больше 512, то не читает вообще ничего из файла. Но при этом отображается что прочитаны байты все.

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

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

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

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

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

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

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

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

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

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

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

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

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