FatFs

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

FatFs

Сообщение inkHunter »

подключаю SD к AT91SAM7

первым делом как понимаю нужно вызвать f_mountdrv () вот кусочек её:

FATFS *FatFs; /* Pointer to the file system object */

FRESULT f_mountdrv ()
{
BYTE fat;
DWORD sect, fatend, maxsect;
FATFS *fs = FatFs;

if (!fs) return FR_NOT_ENABLED;

/* Initialize file system object */
memset(fs, 0, sizeof(FATFS));

/* Initialize disk drive */
if (disk_initialize() & STA_NOINIT) return FR_NOT_READY;

......

и вот тут и проблема проверка if (!fs) return FR_NOT_ENABLED; возращает FR_NOT_ENABLED почему так ?
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: FatFs

Сообщение Satyr »

рановато маунт вызываешь -))
читай мануал внимательнее
Реклама
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: FatFs

Сообщение inkHunter »

добавил disk_initialize()

printf("SD/MMC\n\r");
res=disk_initialize();
printf("disk_initialize() res=%i\n\r",res);
res=f_mountdrv ();
printf(" f_mountdrv () res=%i\n\r",res);


while (1)
{
}
по юарту принимаю :

SD/MMC

disk_initialize() res=0 - FR_OK

f_mountdrv () res=11 - FR_NOT_ENABLED

если закомментировать строку /* if (!fs) return FR_NOT_ENABLED; */

получаю FR_NO_FILESYSTEM

как мне решить проблему ?
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: FatFs

Сообщение inkHunter »

и зачем эта if (!fs) return FR_NOT_ENABLED проверка вообще ?


если fs это указатель на структуру

typedef struct _FATFS {
BYTE fs_type; /* FAT type */
----------
DWORD database; /* Data start sector */
DWORD winsect; /* Current sector appearing in the win[] */
BYTE win[512]; /* Disk access window for Directory/FAT area */
} FATFS;


FATFS *FatFs; // FATFS тип структуры, FatFs указатель на тип FATFS.

FATFS *fs=FatFs; // fs указатель на тип FATFS, которому присваеваем адрес FatFs.

получаеться если адрес = 0 то получаем return FR_NOT_ENABLED ?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: FatFs

Сообщение urry »

я не знаю, какими именно исходниками Чена Вы пользуетесь.
Просмотрел немного, функция монтирования у него используется как для монтирования, так и для размонтирования диска.
static
FATFS *FatFs; /* Pointer to the file system object (logical drive) */

это глобальный указатель для файловой системы, из функций к нему добираются с помощью локальных указателей fs

FRESULT pf_mount (
FATFS *fs /* Pointer to new file system object (NULL: Unmount) */
)
{
BYTE fmt, buf[36];
DWORD bsect, fsize, tsect, mclst;
FatFs = 0;
if (!fs) return FR_OK;

если вызвать эту функцию с нулевым указателем, происходит размонтирование диска, обнуление глобального и выход
Если вызвать функцию с любым числом, отличным от 0, происходит заполнение fs
информацией с карточки (о ее файловой системе)
if (disk_initialize() & STA_NOINIT) /* Check if the drive is ready or not */
return FR_NOT_READY;
если диск неудачно проинициализировался, выход
fmt = check_fs(buf, bsect); - здесь читаем инфу с 0 сектора
в fs
и в самом конце функции
FatFs = fs;
глобальный указатель инициируется от локального
return FR_OK;
ну и бинго.
Реклама
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: FatFs

Сообщение inkHunter »

я добавил


memset(&fs, 0, sizeof(FATFS)); /* Invalidate file system */
FatFs = &fs;


и уже норм.

запускаю:

printf("SD/MMC\n\r");

res=disk_initialize(0);
printf("disk_initialize() res=%i\n\r",res);

res= f_mountdrv();
printf(" f_mountdrv () res=%i\n\r",res);

res=f_open(&fil_obj, "2.txt",FA_CREATE_ALWAYS);
printf(" f_open () res=%i\n\r",res);

получаю

SD/MMC

disk_initialize() res=0
f_mountdrv () res=0
f_open () res=0

вроде все ок, но смотрю карточку на ноуте а там 2.txt нет ((((
Реклама
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: FatFs

Сообщение inkHunter »

уже все работает ) всем спасибо )
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: FatFs

Сообщение urry »

как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: FatFs

Сообщение inkHunter »

urry писал(а):как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .


ну там FA CREATE_ALWAYS, создает файл, если есть перезаписывает его.
смотрю на ноуте файл есть )

а как правильно нада ?
Valeri
Встал на лапы
Сообщения: 88
Зарегистрирован: Вт дек 15, 2009 13:42:31
Откуда: г. Киев

Re: FatFs

Сообщение Valeri »

Я тоже пытаюсь разобратся с ФатФС. В данный момент испытываю трудности с таблицой фат. Установил :

Код: Выделить всё

#define N_FATS      2      /* Number of FAT copies (1 or 2) */
и сделал дамп своей памяти. создается две копии фата но, в одну заносятся имена файлов, а в другую нет. Пытаюсь понять это ошибка Чана или так и должно быть. Может кто подскажет где именно имя файла записывается в файловую таблицу.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: FatFs

Сообщение ut1wpr »

urry писал(а):как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
fopen() не просто открывает файл, но и создает его. Попробуйте открыть из закрыть файл без записи в него. Должен получится "пустой" файл нулевой длины.
С уважением,
Виктор.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»