реклама на сайте
подробности

 
 
> FATfs и SD-карта, не хочет записываться вновь созданный файл..
Artem
сообщение May 3 2011, 05:29
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424



Доброго времени суток! Микроконтроллер STM32 работает с SD картой по SPI. Прицеплена FATfs. Необходимо открыть файл для записи, если файла нет, то создать его и в него записать строку. Но вот в чём проблема, если в файле уже есть хоть один символ, то запись проходит успешно, а если файл только что создали, т.е. его размер равен 0 , то запись не происходит, f_write возвращает FR_INT_ERR. Не могу понять в чём проблема... Помогите кто чем может.. Заранее спасибо.
Вот код:
CODE
void proba ()
{
volatile FRESULT res; // FatFs function common result code
UINT br, bw; // File read/write count
uint8_t str_cnt = 0;

// Register a work area for logical drive 0
f_mount(0, &fs);

// Открываем файл
res = f_open(&fdst, "test_cpy.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
if(res)
{
res = res;
}


buffer[0] = 'A';
buffer[1] = 'B';
buffer[2] = 'C';
buffer[3] = 'D';
buffer[4] = 'E';

for(str_cnt = 0; str_cnt < 10; str_cnt++)
{
res = f_lseek(&fdst, fdst.fsize);
br = 5;
res = f_write(&fdst, buffer, br, &bw);
if(res)
{
res = res;
}

f_puts ("Proba \r\n", &fdst);
f_sync (&fdst);
}

f_close(&fdst);

// Unregister a work area before discard it
f_mount(0, NULL);
}


Добавлю:
Файл не пишется размером больше 4033 байт.


Сделал вот так:
CODE
void proba ()
{
volatile FRESULT res; // FatFs function common result code
UINT br, bw; // File read/write count
uint8_t str_cnt = 0;

// Register a work area for logical drive 0
f_mount(0, &fs);

// Открываем файл
res = f_open(&fdst, "test_cpy.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
if(res)
{
res = res;
}


buffer[0] = 'A';
buffer[1] = 'B';
buffer[2] = 'C';
buffer[3] = 'D';
buffer[4] = 'E';

for(str_cnt = 0; str_cnt < 10; str_cnt++)
{
res = f_lseek(&fdst, fdst.fsize);
br = 5;
res = f_write(&fdst, buffer, br, &bw);
if(res)
{
res = res;
}

f_puts ("Proba \r\n", &fdst);
f_sync (&fdst);
}

//---------------------------------------------------------------------------------
// Вот этот блок добавил

for(str_cnt = 0; str_cnt < 10; str_cnt++)
{
res = f_lseek(&data_file, ((&data_file)->fsize));

f_puts ("Proba\r\n", &fdst);

f_sync (&data_file);
}
//---------------------------------------------------------------------------------

f_close(&fdst);

// Unregister a work area before discard it
f_mount(0, NULL);
}

и стало писаться с в только что созданный файл, и размер файла не ограничен.
Ничего не понимаю, в чём дело? Что за танцы с бубном?

Сообщение отредактировал IgorKossak - May 4 2011, 14:14
Причина редактирования: [codebox] !!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Artem
сообщение May 6 2011, 06:38
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424



Спасибо, Ваш пример работает. Переработал свой код по образу и подобию, тоже заработало. Спасибо!
Go to the top of the page
 
+Quote Post
dimasusl
сообщение Jun 23 2011, 13:26
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 1-12-08
Пользователь №: 42 111



Цитата(Artem @ May 6 2011, 09:38) *
Спасибо, Ваш пример работает. Переработал свой код по образу и подобию, тоже заработало. Спасибо!

Artem, добрый день. У меня аналогичный набор (stm32+fatfs+freertos) и абсолютно та же проблема. При этом я ранее реализовывал эту связку на более старшем проце, только там был SDIO, а не SPI как здесь. Вроде делаю все как у вас заработало - у меня эффект ноль. Можете скинуть ваши исходники относительно Fatfs (ff.c diskio.c и т.п.) на мыло dimasusl@gmail.com?

Цитата(dimasusl @ Jun 23 2011, 16:00) *
Artem, добрый день. У меня аналогичный набор (stm32+fatfs+freertos) и абсолютно та же проблема. При этом я ранее реализовывал эту связку на более старшем проце, только там был SDIO, а не SPI как здесь. Вроде делаю все как у вас заработало - у меня эффект ноль. Можете скинуть ваши исходники относительно Fatfs (ff.c diskio.c и т.п.) на мыло dimasusl@gmail.com?

Блин, занятное дело...

Был код
Код
res = f_mount(0, &fs);
res = f_open(&fsrc, "spi1.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE );
if (fsrc.fsize) res = f_lseek(&fsrc, fsrc.fsize);
res = f_write(&fsrc, usb_buffer, sizeof(usb_buffer), &br);
res = f_close(&fsrc);
res = f_mount(0, NULL);

Файл создавался, но данные в него не писались (если сделать ненулевой размер файла то все Ок).
Подсмотрел тут что еще юзаете для своих целей f_puts(...)
Код
res = f_mount(0, &fs);
res = f_open(&fsrc, "spi1.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE );
if (fsrc.fsize) res = f_lseek(&fsrc, fsrc.fsize);
res = f_puts("",&fsrc); // Пустая строка, чтобы не "ломать" формат файла
res = f_write(&fsrc, usb_buffer, sizeof(usb_buffer), &br);
res = f_close(&fsrc);
res = f_mount(0, NULL);

и стало все Ок и при нулевом размере файла. Откуда ноги растут так и не ясно

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016