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

STM32f407 и FatFS

Написал данную тему в разделе армов, но ее почему-то перенесли в операционные системы??

Видимо фатфс уже стала не просто файловой, а у же осью :rolleyes:

 

Собственно вопрос к светилам в особенности по fatfs, есть 3 физ. диска - sd-карта, усб флешка и флеш контроллера, который используется как диск на 512Кбайт.

 

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

но вместе (например копирование с диска на диск) не работает, причем отследил, что фатфс просто не обращается к процедурам чтения-записи соотв диска. Предполагаю, что фатфс не запоминает, к какому из дисков нужно обратиться, хотя в f_mount четко определяю номер 0,1 или 2 и открываю файл, где перед именем тоже указываю соотв диск - "1:filename.ext"

 

Смотрел доки, там что-то мутное по поводу одновременной работы дисков, макросы типа LD2PD и тп. Я не использую логические диски в пределах одного физического. Как настроить фатфс для такого режима работы?

Поделиться сообщением


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

Тоже сталкивался с некорректной работой fatFS с несколькими дисками. В моём случае было два диска, и проблема заключалась в том, что при отсутствии первого диска невозможно было работать со вторым. К сожалению, у меня не было времени на выяснение причин, поэтому я просто поменял их местами (поставил первым диск, который всегда присутствует в системе).

Поделиться сообщением


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

Не знаю, в тему или нет - насколько помню, возможность работы с несколькими дисками включалась через #define. Он у вас определен правильно?

Поделиться сообщением


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

Не знаю, в тему или нет - насколько помню, возможность работы с несколькими дисками включалась через #define. Он у вас определен правильно?

 

Вот я про это и спрашиваю, как "настроить" дефайны в частности. Там много понаписано про логические диски, плюс как-то непонятно сделана передача номера физ. устройства в процедуры diskread и write...

 

Есть переменная default_vol, которая оределяется процедурой f_mount и переменная fs->drv, значение которой передается в disk_read, в структуре раздела, причем они берут данные из разных мест...

Поделиться сообщением


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

Коды возврата какие? по ним и смотрите, что не так.

 

вот пример общения двух устройств

 

в конфиге насколько помню, только это менял: #define _VOLUMES 2 /* Number of volumes (logical drives) to be used. */

 

 


#define CSV_CONFIG_FILE_NAME 	"1:/file1.ext"	//on the USB
#define BIN_CONFIG_FILE_NAME 	"0:/file2.ext"	//on the SDC


FIL usb_file, sdc_file;		/* File object */
FATFS usb_fs, sdc_fs;

//open CSV_CONFIG_FILE_NAME on the USB drive

   Drive_Mount (USB_DRIVE, &usb_fs);
   Drive_Mount (SDCARD_DRIVE, &sdc_fs);

//check: does the config file exist on the disk?
   if (FR_OK!=f_open(&usb_file, CSV_CONFIG_FILE_NAME, FA_READ)) goto err;
   //the file is found and ready for reading

//creating and openning the config file on the SDC
   if (FR_OK!=f_open(&sdc_file, BIN_CONFIG_FILE_NAME, FA_CREATE_ALWAYS | FA_WRITE)) goto err;

   //the files are openned

тут просто работа с файлами через f_read, f_write и остальными
..............

и закрываем:

//close files
if (FR_OK != f_close(&sdc_file)) goto err;
if (FR_OK != f_close(&usb_file)) goto err;
//unmount drives
   Drive_Mount (USB_DRIVE, 0);
   Drive_Mount (SDCARD_DRIVE, 0);

Поделиться сообщением


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

Да все так и есть за искл того, что у меня там цифра 3 стоит.

 

Коды возврата правильные, но работает так:

 

Делаю f_mount (0,fatSD);

f_mount (1,fatUSB);

 

Далее циклю все это -

{

открываю файл на SD -

res= f_open(&fileSD,"0:fileSD.txt",FA_READ);

...

res=f_read(&fileSD,&buff,512,&cnt);

затем вывожу в уарт то, что прочитал

f_close(&fileSD);

 

открываю файл на USB -

res= f_open(&fileSD,"1:fileUSB.txt",FA_READ);

...

res=f_read(&fileUSB,&buff,512,&cnt);

затем вывожу в уарт то, что прочитал

f_close(&fileUSB);

 

еще раз открываю тот-же файл на USB -

res= f_open(&fileSD,"1:fileUSB.txt",FA_READ);

...

res=f_read(&fileUSB,&buff,512,&cnt);

затем вывожу в уарт то, что прочитал

f_close(&fileUSB);

}

 

А работает все это так - читается файл на SD правильно, затем не читает с USB, но читает второй раз, потом снова читает с SD и т.д...

 

Если убираю чтение с SD, то с усб читает оба раза правильно! В чем тут может быть дело? Да, когда идет первое "чтение" с усб, активности в процедурах USB_DiskRead нет!

 

 

Вот еще один вопрос - что означает запись: *rfs=fs=FatFs[vol];

Т.е. создается массив структур FatFs, равный кол-ву дисков? Тогда зачем вот это - FATFS usb_fs, sdc_fs;???

Или это мутная часть чена, который решил втюхать работу с лог. и физ. дисками одновременно?

Поделиться сообщением


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

Это Вы сейчас ошиблись или в исходнике так?

открываю файл на USB -

res= f_open(&fileSD,"1:fileUSB.txt",FA_READ);

...

res=f_read(&fileUSB,&buff,512,&cnt);

затем вывожу в уарт то, что прочитал

f_close(&fileUSB);

&fileSD или &fileUSB ? :)

Поделиться сообщением


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

Это Вы сейчас ошиблись или в исходнике так?

 

&fileSD или &fileUSB ? :)

 

Это я ошибся при перепечатке сюда. В данном случае - &fileUSB.

Поделиться сообщением


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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