Страница 1 из 1
FatFs
Добавлено: Вс окт 09, 2011 18:49:57
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 почему так ?
Re: FatFs
Добавлено: Вс окт 09, 2011 19:02:37
Satyr
рановато маунт вызываешь -))
читай мануал внимательнее
Re: FatFs
Добавлено: Вс окт 09, 2011 19:26:42
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
как мне решить проблему ?
Re: FatFs
Добавлено: Вс окт 09, 2011 20:30:16
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 ?
Re: FatFs
Добавлено: Вс окт 09, 2011 21:41:50
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;
ну и бинго.
Re: FatFs
Добавлено: Вс окт 09, 2011 21:56:59
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 нет ((((
Re: FatFs
Добавлено: Вс окт 09, 2011 22:31:59
inkHunter
уже все работает ) всем спасибо )
Re: FatFs
Добавлено: Пн окт 10, 2011 07:55:00
urry
как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
Re: FatFs
Добавлено: Пн окт 10, 2011 09:03:14
inkHunter
urry писал(а):как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
ну там FA CREATE_ALWAYS, создает файл, если есть перезаписывает его.
смотрю на ноуте файл есть )
а как правильно нада ?
Re: FatFs
Добавлено: Вт дек 20, 2011 19:26:57
Valeri
Я тоже пытаюсь разобратся с ФатФС. В данный момент испытываю трудности с таблицой фат. Установил :
Код: Выделить всё
#define N_FATS 2 /* Number of FAT copies (1 or 2) */
и сделал дамп своей памяти. создается две копии фата но, в одну заносятся имена файлов, а в другую нет. Пытаюсь понять это ошибка Чана или так и должно быть. Может кто подскажет где именно имя файла записывается в файловую таблицу.
Re: FatFs
Добавлено: Вт дек 20, 2011 20:51:39
ut1wpr
urry писал(а):как же оно заработало, если функцией опен происходит только поиск файла с именем в аргументах и заполнение данных?
Запись файла через write .
fopen() не просто открывает файл, но и создает его. Попробуйте открыть из закрыть файл без записи в него. Должен получится "пустой" файл нулевой длины.