Вопрос по FATFS
Вопрос по FATFS
Всем привет.
Подскажите, пожалуйста.
Хочу записывать в текстовые файлы на карте памяти данные, поступающие по UART. CodeVision AVR.
По UART вопросов нет.
С картой раньше не работал. Использую FATFS, встроенную в CVAVR. Карта памяти 4Gb.
Начал с теста карты памяти. И сразу наткнулся на ошибку - f_open возвращает FR_NO_FILE.
Перед открытием файла выполняю disk_initialize и f_mount - все нормально.
Делаю все, как в тысяче примеров в сети и в хэлпе CVAVR, и в примерах CVAVR.
Путь к файлу char path[]="0:/file.txt";
res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ); В этом месте res=1(FR_DISK_ERR). Также в параметры ставил FA_CREATE_NEW, для существующего файла ставил FA_OPEN_EXISTING | FA_READ - результат один.
Точно такой же ответ и на f_mkdir(path), где char path[]="0:/files"; Пишет FR_DISK_ERR.
В общем - любые процедуры с файлами/папками - FR_DISK_ERR.
Подскажите, пожалуйста.
Хочу записывать в текстовые файлы на карте памяти данные, поступающие по UART. CodeVision AVR.
По UART вопросов нет.
С картой раньше не работал. Использую FATFS, встроенную в CVAVR. Карта памяти 4Gb.
Начал с теста карты памяти. И сразу наткнулся на ошибку - f_open возвращает FR_NO_FILE.
Перед открытием файла выполняю disk_initialize и f_mount - все нормально.
Делаю все, как в тысяче примеров в сети и в хэлпе CVAVR, и в примерах CVAVR.
Путь к файлу char path[]="0:/file.txt";
res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ); В этом месте res=1(FR_DISK_ERR). Также в параметры ставил FA_CREATE_NEW, для существующего файла ставил FA_OPEN_EXISTING | FA_READ - результат один.
Точно такой же ответ и на f_mkdir(path), где char path[]="0:/files"; Пишет FR_DISK_ERR.
В общем - любые процедуры с файлами/папками - FR_DISK_ERR.
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Вопрос по FATFS
А что про нее комп говорит? Может она неисправна, не отформатирована, или отформатирована, да не в FAT...mir_ds писал(а):С картой раньше не работал.
Re: Вопрос по FATFS
Полный код выкладывайте. Путь к файлу должен заканчиваться символом конца строки '\0'.
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Вопрос по FATFS
Полностью разделяю Вашу низкую оценку гуану по имени CVAvr, но все же... чем еще может оканчиваться массив char, заданный таким обазом:GRAF писал(а):Путь к файлу должен заканчиваться символом конца строки '\0'.
, - пусть даже и в этой дурно пахнущей отрыжке мира программирования?mir_ds писал(а):... CodeVision AVR ... char path[]="0:/file.txt";
Последний раз редактировалось Pnjom-Penb Вс фев 07, 2016 18:00:59, всего редактировалось 1 раз.
Re: Вопрос по FATFS
Цель кода - быстро проверить как работает карта, поэтому на реализацию ругаться не нужно.
То есть я нажимаю на кнопку и при каждом нажатии с картой что-то происходит.
1 - монтируется диск,
2 - открывается файл,
3 - указатель в конец файла,
4 - пишется какой-то текст,
5 - закрывается файл.
По флагам - какая-то индикация светодиодами.
Есть две карты: SD 2Gb и SDHC 4Gb. Карты форматировал всеми известными способами, то есть разные наборы "фатов" и размеров кластеров.
Когда в case 1:...... не появился FR_OK - вычислил, что возвращается ошибка FR_DISK_ERR.
initialize (в самом начале) и f_mount проходят нормально.
часов нет, поэтому библиотеку часов немного поправил:
rtc_get_time возвращает нули (hour, min, sec). rtc_get_date возвращает date - 1, month - 1, year - 2000.
Когда пойму как работают все эти функции - буду писать нормальную программу.
#include <mega32u4.h>
#include <delay.h>
#include <sdcard.h>
#include <ff.h>
#include <PCF8563.h>
//
typedef unsigned char byte;
typedef unsigned int uint;
//
#define cb(x,y) (x&=~y)
#define sb(x,y) (x|=y)
//portf defines
#define ledRed (1<<4)
#define ledGreen (1<<0)
#define sbRec (1<<6)
//add leds deines
#define ledE1 (1<<6)
#define ledE2 (1<<2)
#define ledB (1<<7)
#define ledD (1<<5)
//flags
//#define butPressF (1<<0)
//const
#define BLINK_DELAY 250
#define BUT_DELAY 1000
//flags1
#define butPressF (1<<0)
#define diskStatusF (1<<1)
#define diskMountF (1<<2)
#define fileOpenF (1<<3)
#define fileLseekF (1<<4)
#define fileWrF (1<<5)
#define fileCloseF (1<<6)
//var
uint flags1=0;
uint blinkCr=0;
uint butCr=0;
byte diskStatus=0;
byte pressNum=0;
/* FAT function result */
FRESULT res;
/* number of bytes written/read to the file */
unsigned int nbytes;
/* will hold the information for logical drive 0: */
FATFS fat;
/* will hold the file information */
FIL file;
/* will hold file attributes, time stamp information */
FILINFO finfo;
/* file path */
char path[]="0:/log.txt";
/* text to be written to the file */
char text[]="<TEST_test>";
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0x00;
TCNT1L=0x00;
//
disk_timerproc();
}
void main()
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
//ports init
DDRB=0xff;
PORTB=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0x00;
DDRE=0xff;
PORTE=0x00;
//
DDRF=0xff;
cb(DDRF,sbRec);
PORTF=0x00;
sb(PORTF,sbRec);
// Timer/Counter 1 initialization
//62.5 kHz, 10 ms interrupt OCR1A
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
TIMSK1=0x02;
//
prtc_get_time =(void (*)(unsigned char *,unsigned char *,unsigned char *)) rtc_get_time;
prtc_get_date=(void (*)(unsigned char *,unsigned char *,unsigned int *)) rtc_get_date;
#asm("sei")
delay_ms(1000);
diskStatus=disk_initialize(0);
if ((diskStatus & STA_NOINIT) || (diskStatus & STA_NODISK) || (diskStatus & STA_PROTECT)) cb(flags1,diskStatusF); else sb(flags1,diskStatusF);
delay_ms(2500);
//
while(1)
{
//set leds
if (++blinkCr>=BLINK_DELAY)
{
blinkCr=0;
//disk init and mount indic
if ((~flags1&diskStatusF)&&(~flags1&diskMountF)) cb(PORTF,ledRed);
if ((flags1&diskStatusF)&&(~flags1&diskMountF)) PORTF^=ledRed;
if ((flags1&diskStatusF)&&(flags1&diskMountF)) sb(PORTF,ledRed);
//file indic
if (flags1&fileOpenF) sb(PORTE,ledE1); else PORTE^=ledE1;
if (flags1&fileLseekF) sb(PORTE,ledE2);
if (flags1&fileWrF) sb(PORTB,ledB);
if (flags1&fileCloseF) sb(PORTD,ledD);
}
//read button
if ((~PINF&sbRec)&&(~flags1&butPressF))
{
if (++butCr>=BUT_DELAY)
{
butCr=0; sb(flags1, butPressF);
PORTF^=ledGreen;
//
switch (pressNum)
{
case 0: if ((res=f_mount(0,&fat))==FR_OK) sb(flags1,diskMountF); break;
case 1: if ((res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ))==FR_OK) sb(flags1,fileOpenF); break;
case 2: if ((res=f_lseek(&file,file.fsize))==FR_OK) sb(flags1,fileLseekF); break;
case 3: if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK) sb(flags1,fileWrF); break;
case 4: if ((res=f_close(&file))==FR_OK) sb(flags1,fileCloseF); break;
}
if (pressNum<4) pressNum++;
}
}
if (PINF&sbRec)
{
cb(flags1,butPressF); butCr=0;
}
delay_ms(1);
}
}
То есть я нажимаю на кнопку и при каждом нажатии с картой что-то происходит.
1 - монтируется диск,
2 - открывается файл,
3 - указатель в конец файла,
4 - пишется какой-то текст,
5 - закрывается файл.
По флагам - какая-то индикация светодиодами.
Есть две карты: SD 2Gb и SDHC 4Gb. Карты форматировал всеми известными способами, то есть разные наборы "фатов" и размеров кластеров.
Когда в case 1:...... не появился FR_OK - вычислил, что возвращается ошибка FR_DISK_ERR.
initialize (в самом начале) и f_mount проходят нормально.
часов нет, поэтому библиотеку часов немного поправил:
rtc_get_time возвращает нули (hour, min, sec). rtc_get_date возвращает date - 1, month - 1, year - 2000.
Когда пойму как работают все эти функции - буду писать нормальную программу.
#include <mega32u4.h>
#include <delay.h>
#include <sdcard.h>
#include <ff.h>
#include <PCF8563.h>
//
typedef unsigned char byte;
typedef unsigned int uint;
//
#define cb(x,y) (x&=~y)
#define sb(x,y) (x|=y)
//portf defines
#define ledRed (1<<4)
#define ledGreen (1<<0)
#define sbRec (1<<6)
//add leds deines
#define ledE1 (1<<6)
#define ledE2 (1<<2)
#define ledB (1<<7)
#define ledD (1<<5)
//flags
//#define butPressF (1<<0)
//const
#define BLINK_DELAY 250
#define BUT_DELAY 1000
//flags1
#define butPressF (1<<0)
#define diskStatusF (1<<1)
#define diskMountF (1<<2)
#define fileOpenF (1<<3)
#define fileLseekF (1<<4)
#define fileWrF (1<<5)
#define fileCloseF (1<<6)
//var
uint flags1=0;
uint blinkCr=0;
uint butCr=0;
byte diskStatus=0;
byte pressNum=0;
/* FAT function result */
FRESULT res;
/* number of bytes written/read to the file */
unsigned int nbytes;
/* will hold the information for logical drive 0: */
FATFS fat;
/* will hold the file information */
FIL file;
/* will hold file attributes, time stamp information */
FILINFO finfo;
/* file path */
char path[]="0:/log.txt";
/* text to be written to the file */
char text[]="<TEST_test>";
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0x00;
TCNT1L=0x00;
//
disk_timerproc();
}
void main()
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
//ports init
DDRB=0xff;
PORTB=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0x00;
DDRE=0xff;
PORTE=0x00;
//
DDRF=0xff;
cb(DDRF,sbRec);
PORTF=0x00;
sb(PORTF,sbRec);
// Timer/Counter 1 initialization
//62.5 kHz, 10 ms interrupt OCR1A
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
TIMSK1=0x02;
//
prtc_get_time =(void (*)(unsigned char *,unsigned char *,unsigned char *)) rtc_get_time;
prtc_get_date=(void (*)(unsigned char *,unsigned char *,unsigned int *)) rtc_get_date;
#asm("sei")
delay_ms(1000);
diskStatus=disk_initialize(0);
if ((diskStatus & STA_NOINIT) || (diskStatus & STA_NODISK) || (diskStatus & STA_PROTECT)) cb(flags1,diskStatusF); else sb(flags1,diskStatusF);
delay_ms(2500);
//
while(1)
{
//set leds
if (++blinkCr>=BLINK_DELAY)
{
blinkCr=0;
//disk init and mount indic
if ((~flags1&diskStatusF)&&(~flags1&diskMountF)) cb(PORTF,ledRed);
if ((flags1&diskStatusF)&&(~flags1&diskMountF)) PORTF^=ledRed;
if ((flags1&diskStatusF)&&(flags1&diskMountF)) sb(PORTF,ledRed);
//file indic
if (flags1&fileOpenF) sb(PORTE,ledE1); else PORTE^=ledE1;
if (flags1&fileLseekF) sb(PORTE,ledE2);
if (flags1&fileWrF) sb(PORTB,ledB);
if (flags1&fileCloseF) sb(PORTD,ledD);
}
//read button
if ((~PINF&sbRec)&&(~flags1&butPressF))
{
if (++butCr>=BUT_DELAY)
{
butCr=0; sb(flags1, butPressF);
PORTF^=ledGreen;
//
switch (pressNum)
{
case 0: if ((res=f_mount(0,&fat))==FR_OK) sb(flags1,diskMountF); break;
case 1: if ((res=f_open(&file,path, FA_OPEN_ALWAYS | FA_WRITE ))==FR_OK) sb(flags1,fileOpenF); break;
case 2: if ((res=f_lseek(&file,file.fsize))==FR_OK) sb(flags1,fileLseekF); break;
case 3: if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK) sb(flags1,fileWrF); break;
case 4: if ((res=f_close(&file))==FR_OK) sb(flags1,fileCloseF); break;
}
if (pressNum<4) pressNum++;
}
}
if (PINF&sbRec)
{
cb(flags1,butPressF); butCr=0;
}
delay_ms(1);
}
}
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Вопрос по FATFS
М-да... Именно так формулируется цель написания большинства программ, состоящих, в основном, из ошибок... Исходных данных нет, результатов каких-либо проверок - тоже нет...mir_ds писал(а):Цель кода - быстро проверить как работает карта ...
Че-то, как-то... повеяло не то безысходностью, не то скукой. Пойду посмотрю КВН от 95 года.
Re: Вопрос по FATFS
Pnjom-Penb писал(а):Полностью разделяю Вашу низкую оценку гуану по имени CVAvr, но все же... чем еще может оканчиваться массив char, заданный таким обазом:, - пусть даже и в этой дурно пахнущей отрыжке мира программирования?mir_ds писал(а):... CodeVision AVR ... char path[]="0:/file.txt";
CVAVR я не оценивал.
И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по FATFS
Ну, если он хоть как-то придерживается стандартам, то - естественно нулевым байтом (аля '\0').GRAF писал(а):И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Re: Вопрос по FATFS
Теперь ясно, что в DATASEG никто не заглядывает.
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Вопрос по FATFS
Не судите обо всех по себе. 

Re: Вопрос по FATFS
Тема не обо мне, а о применении fatfs в CVAVR. Не отклоняйтесь.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по FATFS
Т.е. о всех:
Можно Вам тот-же вопрос : И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Ну и вообще, чем оканчиваются массивы в Си, инициализированные строкой ?
Мне просто даже интересно, куда Вы там заглядываете и какую информацию об этом вопросе держите в голове. Может мы просто ошибаемся. Тогда поправьте нас и прикрепите свои поправки аргументами, а не домыслами о том, куда мы все заглядываем, а куда нет. Тогда будет уже конструктивный разговор.
можно тут разговаривать, а конкретно о Вас - нет ?GRAF писал(а):в DATASEG никто не заглядывает.
Можно Вам тот-же вопрос : И чем же может оканчиваться массив char path[]="0:/file.txt"; в CVAVR?
Ну и вообще, чем оканчиваются массивы в Си, инициализированные строкой ?
Мне просто даже интересно, куда Вы там заглядываете и какую информацию об этом вопросе держите в голове. Может мы просто ошибаемся. Тогда поправьте нас и прикрепите свои поправки аргументами, а не домыслами о том, куда мы все заглядываем, а куда нет. Тогда будет уже конструктивный разговор.
Re: Вопрос по FATFS
Файл asm, генерируемый CVAVR.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по FATFS
Поставил CVAVR, проверил. Даже и не знаю что сказать... Кроме того, что мнение о Вас складывается, как о любителе впустую потрепаться языком.

В догонку - https://yandex.ru/search/?lr=5&msid=228 ... 0%A1%D0%B8
Какие asm-файлы, какие DATASEG, ... какая блоха....
Спойлер
В догонку - https://yandex.ru/search/?lr=5&msid=228 ... 0%A1%D0%B8
Какие asm-файлы, какие DATASEG, ... какая блоха....

-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Вопрос по FATFS
Увы, одни люди, аргументируя свою позицию, ссылаются на Re'альные знания, другие - на Im'нимые... Отношение числа первых к числу вторых, что вполне ожидаемо, повторяет отношение числа действительных чисел к числу комплексных.Аlex писал(а):Какие asm-файлы, какие DATASEG, ... какая блоха....
Re: Вопрос по FATFS
Код: Выделить всё
#include <mega48.h>
char path[]="0:/AVR.exe";
char a=0x0E;
void main(void)
{
char c;
unsigned char i;
for(i=0; i<sizeof(path);i++)
{
c=path[i];
}
path[1]=a;
while(1);
}
HEX:
Код: Выделить всё
:0400000026C0FECF49
:10000400FDCFFCCFFBCFFACFF9CFF8CFF7CFF6CFA8
:10001400F5CFF4CFF3CFF2CFF1CFF0CFEFCFEECFD8
:10002400EDCFECCFEBCFEACFE9CFE8CFE7CFE6CF08
:10003400303A2F4156522E6578650E000A00800131
:100044003400010005003E000000F894EE27EFBBE9
:10005400E5BFF8E1A895A4B7A77FA4BFF09360001B
:10006400E09360008DE0A2E0BB27ED938A95E9F769
:1000740080E092E0A0E0B1E0ED930197E9F7E0E4DD
:10008400F0E085919591009761F0A591B591059067
:100094001590BF01F00105900D920197E1F7FB0166
:1000A400F0CFE0E0EEBBEFEFEDBFE2E0EEBFC0E883
:1000B400D1E000C000E00B3038F4E02FF0E0E0586D
:1000C400FE4F10810F5FF7CF50928101FFCFFFCF1A
:00000001FF
Данные начинаются с адреса 0034. Следом за массивом символов идёт a, затем 00.
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Вопрос по FATFS
Читать DATASEG черех HEX, это хорошо забытый старый изврат. Над ним стебались еще во времена "Настоящие программисты не используют Паскаль". Но что гораздо хуже - это поооолное непонимание строк в Си.
Re: Вопрос по FATFS
Сейчас немного экспериментирую. Дело не в строке. Сегодня/завтра отпишусь.