|
|
  |
STM32f407 и FatFS, 3 физических диска, одновременная работа... |
|
|
|
Sep 15 2013, 15:06
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Написал данную тему в разделе армов, но ее почему-то перенесли в операционные системы?? Видимо фатфс уже стала не просто файловой, а у же осью Собственно вопрос к светилам в особенности по fatfs, есть 3 физ. диска - sd-карта, усб флешка и флеш контроллера, который используется как диск на 512Кбайт. Нижний уровень работает исправно, т.е. по "отдельности" доступ к дискам есть, все читает и записывает, но вместе (например копирование с диска на диск) не работает, причем отследил, что фатфс просто не обращается к процедурам чтения-записи соотв диска. Предполагаю, что фатфс не запоминает, к какому из дисков нужно обратиться, хотя в f_mount четко определяю номер 0,1 или 2 и открываю файл, где перед именем тоже указываю соотв диск - "1:filename.ext" Смотрел доки, там что-то мутное по поводу одновременной работы дисков, макросы типа LD2PD и тп. Я не использую логические диски в пределах одного физического. Как настроить фатфс для такого режима работы?
|
|
|
|
|
Sep 15 2013, 17:16
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Сергей Борщ @ Sep 15 2013, 19:10)  Не знаю, в тему или нет - насколько помню, возможность работы с несколькими дисками включалась через #define. Он у вас определен правильно? Вот я про это и спрашиваю, как "настроить" дефайны в частности. Там много понаписано про логические диски, плюс как-то непонятно сделана передача номера физ. устройства в процедуры diskread и write... Есть переменная default_vol, которая оределяется процедурой f_mount и переменная fs->drv, значение которой передается в disk_read, в структуре раздела, причем они берут данные из разных мест...
|
|
|
|
|
Sep 15 2013, 21:09
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Коды возврата какие? по ним и смотрите, что не так. вот пример общения двух устройств в конфиге насколько помню, только это менял: #define _VOLUMES 2 /* Number of volumes (logical drives) to be used. */ CODE
#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);
|
|
|
|
|
Sep 16 2013, 07:43
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Да все так и есть за искл того, что у меня там цифра 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;??? Или это мутная часть чена, который решил втюхать работу с лог. и физ. дисками одновременно?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|