FatFs
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
FatFs
подключаю 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 почему так ?
первым делом как понимаю нужно вызвать 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 почему так ?
- Реклама
Re: FatFs
рановато маунт вызываешь -))
читай мануал внимательнее
читай мануал внимательнее
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: FatFs
добавил 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
как мне решить проблему ?
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
и зачем эта 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 ?
если 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
я не знаю, какими именно исходниками Чена Вы пользуетесь.
Просмотрел немного, функция монтирования у него используется как для монтирования, так и для размонтирования диска.
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;
ну и бинго.
Просмотрел немного, функция монтирования у него используется как для монтирования, так и для размонтирования диска.
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
я добавил
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 нет ((((
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
urry писал(а):как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
ну там FA CREATE_ALWAYS, создает файл, если есть перезаписывает его.
смотрю на ноуте файл есть )
а как правильно нада ?
Re: FatFs
Я тоже пытаюсь разобратся с ФатФС. В данный момент испытываю трудности с таблицой фат. Установил : и сделал дамп своей памяти. создается две копии фата но, в одну заносятся имена файлов, а в другую нет. Пытаюсь понять это ошибка Чана или так и должно быть. Может кто подскажет где именно имя файла записывается в файловую таблицу.
Код: Выделить всё
#define N_FATS 2 /* Number of FAT copies (1 or 2) */Re: FatFs
fopen() не просто открывает файл, но и создает его. Попробуйте открыть из закрыть файл без записи в него. Должен получится "пустой" файл нулевой длины.urry писал(а):как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
С уважением,
Виктор.
Виктор.


