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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Вопрос по FatFs от мистера ChaN'а
kanzler
сообщение Nov 22 2007, 19:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Прикрутил FatFs на ATmega128. В примерах данных от мистера ChaN'а не очень понятно вот что. В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру. Прошу уважаемые коллеги, разобраться с этим вопросом.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2007, 19:32
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kanzler @ Nov 22 2007, 21:11) *
В программе описываю структуру типа FATFS, но ни как не могу найти где он заносит данные в эту структуру.
Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 23 2007, 02:31
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(Сергей Борщ @ Nov 23 2007, 00:32) *
Вы должны передать ее адрес через f_mount в начале работы. Потом он с ней будет работать сам внутри.

Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128
Go to the top of the page
 
+Quote Post
GDI
сообщение Nov 23 2007, 07:20
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Cделайте map-файл и посмотрите какие размеры стеков вам требуются


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2007, 09:59
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kanzler @ Nov 23 2007, 04:31) *
Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что?
Как что? Не прочитали документацию. Хотя бы на f_mount:
Цитата
This function only initializes the work area and registers its address to the internal table, any access to the disk I/O layer does not occure. The actual mounting process is performed depends on requirement in any other file funcitons.
Можно было еще заглянуть в исходники, и увидеть, что f_mount только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 23 2007, 13:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(kanzler @ Nov 23 2007, 09:31) *
Так и делаю, но после f_mount структура пустая. Значить я что то делаю не так. Что? Вопрос - в настройках используемой памяти в IAR какие значения нужно ставить? У меня Heap size 0x400, CSTACK = 256, RSTACK = 128
А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом?


--------------------
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 23 2007, 16:49
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(Сергей Борщ @ Nov 23 2007, 14:59) *
Как что? Не прочитали документацию. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.

Читал, но мой англицкий оставляет желать лучшего.
Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, хотя флешка перед тем была отформатированна FAT16 и записан файл.

Цитата(prottoss @ Nov 23 2007, 18:30) *
А Вы описали функции disk read/write sector/ioctl? Возможно проблема в этом?

В этом нет проблемы драйвер был прикручен и он работает без сбоев.

Цитата(GDI @ Nov 23 2007, 12:20) *
Cделайте map-файл и посмотрите какие размеры стеков вам требуются

Честно говоря я не сильно понимаю как можно узнать в map-файле что со стеком всё впорядке. Подскажите пожайлуста.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 23 2007, 20:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kanzler @ Nov 23 2007, 18:49) *
В этом нет проблемы драйвер был прикручен и он работает без сбоев.

999 против 1, что disk_read() не смотря вышеприведенное утверждение не работает. В чем с легкостью можете убедится посмотрев что Вы получили вместо 0 сектора в fs.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 06:27
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(zltigo @ Nov 24 2007, 01:52) *
999 против 1, что disk_read() не смотря вышеприведенное утверждение не работает. В чем с легкостью можете убедится посмотрев что Вы получили вместо 0 сектора в fs.

Ставка принята. Посмотрев код я не нашёл в функциях f_mount, f_opendir, f_readdir ссылок на да функцию disk_read(). Может быть я что то пропустил. Или может быть после того как произвели регистрацию fs с помощью f_mount нужно вызвать f_getfree()? Хотя и в ней нет ссылка на disk_read().

Вобщем ни одна функция f_opendir, f_readdir, f_getfree не возвращает FR_OK. Эсли это связанно с тем что функция disk_read() не работает, то я её проверю, только объясните по шагам как работать с FatFs, пожайлуста.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 07:51
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kanzler @ Nov 24 2007, 08:27) *
Посмотрев код я не нашёл в функциях...

Расстроили очень sad.gif Читаем:
Цитата
Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM,

Для начала f_readdir() в принципе не может возвращать FR_NO_FILESYSTEM, ибо работает с готовой заполненной структурой DIR. Сию ошибку возвращает f_opendir() которая и пытается прочитать с диска и заполнить вышеупомянутую структуру. В свою очередь FR_NO_FILESYSTEM возвращает только фунуция auto_mount(), которая в свою очередь вызывает функцию с совершенно ожидаемым названием check_fs(), которая в свою очередь ну совсем ожидаемо
(а что ей еще остается делать?) вызывает disk_read() для разборок с содержимым диска.


P.S.
Кстати, auto_mount() очень сомнительное "удобство" введенное в V0.04, ибо узнается о проблемах с диском только при обращении к нему. Например, пришел, сменил носитель, ушел и через некоторое время узнал, что не сработало. Одно из моих изменений в собственно ff (немногих, кстати smile.gif ) касается замены auto_mount() на check_mount(), а собствено монтирование (полное, а не то, огрызок f_mount() ) осуществляется по детектированию вставления SD/MMC, ну и ручками при желании.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 08:15
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(zltigo @ Nov 24 2007, 12:51) *
Расстроили очень sad.gif Читаем:

Для начала f_readdir() в принципе не может возвращать FR_NO_FILESYSTEM, ибо работает с готовой заполненной структурой DIR. Сию ошибку возвращает f_opendir() которая и пытается прочитать с диска и заполнить вышеупомянутую структуру. В свою очередь FR_NO_FILESYSTEM возвращает только фунуция auto_mount(), которая в свою очередь вызывает функцию с совершенно ожидаемым названием check_fs(), которая в свою очередь ну совсем ожидаемо
(а что ей еще остается делать?) вызывает disk_read() для разборок с содержимым диска.

Прошу прощения за то что вас расстроил. А теперь к делу. Согласен FR_NO_FILESYSTEM возвращает auto_mount(). Но в сей функции есть строки:

/* Check if the drive number is valid or not */
if (drv >= _DRIVES) return FR_INVALID_DRIVE; /* Is the drive number valid? */
if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */

Если первая строка у меня проходит то вторая у меня не хочет проходить, таким образом функция f_opendir возвращает не только FR_NO_FILESYSTEM но и FR_NOT_ENABLED. Как быть в этом случае?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2007, 08:22
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kanzler @ Nov 24 2007, 10:15) *
Если первая строка у меня проходит то вторая у меня не хочет проходить
А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 08:29
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(Сергей Борщ @ Nov 24 2007, 13:22) *
А вот как раз f_mount() и должен был заранее прописать в FatFs[drv] адрес вашей структуры FATFS из первого вопроса.

Спасибо за разъяснения, значить где то у меня изначально было неправильно сделанно, буду искать где.
Вопрос: Структура FatFs[drv] описана как массив. Я же в начале описываю свою структуру таким образом FATFS fatfs; это может повлиять на то что у меня не заполняется fatfs. Может быть мне нужно было сделать как в примере FATFS fatfs[2]?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 08:29
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kanzler @ Nov 24 2007, 10:15) *
Как быть в этом случае?

Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов.
В "новом случае" начните, однако, с начала, и вызовите f_mount().


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 08:35
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(zltigo @ Nov 24 2007, 13:29) *
Вы это уж... как нибудь со "случаем" определитесь для начала, а то просто какой-то свободный поток слов.
В "новом случае" начните, однако, с начала, и вызовите f_mount().

Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK. А вот в остальном - я прошу у вас многоуважаемые специалисты помощи.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 08:48
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kanzler @ Nov 24 2007, 10:35) *
f_mount у меня проходит и возвращает FR_OK.

Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали.
В случае успешного монтирования в FatFs[] никоем образом не может быть NULL и соответствено
if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */
никоем образом не FR_NOT_ENABLED



Цитата(kanzler @ Nov 24 2007, 10:35) *
Со случаем я разобрался в самом начале...

Опять неправда - если-бы разобрались, то вопрос о f_mount() вообще не сстоял-бы, ибо ОБЯЗАТЕЛЬНЫМ условием получения того сообщения является наличие смонтированной файловой системы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 09:21
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Цитата(zltigo @ Nov 24 2007, 13:48) *
Это значит только одно - Вы его успещно ОТМОНТИРОВАЛИ, а не примонтировали.
В случае успешного монтирования в FatFs[] никоем образом не может быть NULL и соответствено
if (!(fs = FatFs[drv])) return FR_NOT_ENABLED; /* Is the file system object registered? */
никоем образом не FR_NOT_ENABLED

f_mount возвращает только два значениния - FR_OK или FR_INVALID_DRIVE.
С FR_INVALID_DRIVE всё понятно, но не понятно тогда зачем нужна функция f_mount, если она делает только unmount?

В итоге я совсем запуталься :-( Делаю вывод - значить структуру FATFS fatfs ни когда не примонтировать и она всегда будет пустая.

Тогда просьба - дайте пример исходника как вы делаете инициализацию FATFS.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2007, 09:36
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kanzler @ Nov 24 2007, 10:35) *
Со случаем я разобрался в самом начале, а вот f_mount у меня проходит и возвращает FR_OK.
Совсем тупой вопрос - а какой Logical drive number вы передаете в f_mount? Вообще, покажите код.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 09:37
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kanzler @ Nov 24 2007, 11:21) *
Делаю вывод - значить структуру FATFS fatfs ни когда не примонтировать и она всегда будет пустая.

С чего-бы это?
Там вообще-то пяток строчек! Так и хочется чего-нибудь спросить перефразируя классическое "Киса, скажите, как фидошник фидошнику, Вы почту качать умеете?"....

f_mount() для монтирования нужно передать указатель на РЕАЛЬНО существующую память.
Все больше ничего. Заполнять эту структуру, при условии что ЕСТЬ УКАЗАТЕЛЬ будет уже auto_mount()
А вот если этого указателя нет, то тогда получите отлуп FR_NOT_ENABLED.
Цитата
Тогда просьба - дайте пример исходника как вы делаете инициализацию FATFS.

А то примеров из документации и прилагаемых тестовых исходников УЖЕ не достаточно?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kanzler
сообщение Nov 24 2007, 09:58
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 27-02-06
Из: Екатеринбург
Пользователь №: 14 728



Огромное всем спасибо!
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 24 2007, 13:01
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



У меня тоже вопрос по FatFS.
Рассматриваю возможность прикрутить ее к DataFlash. Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт. А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб). Т.е. мне надо написать достаточно "толстую" прослойку, которая будет скрывать от FatFS этот механизм - или я чего-то не понял?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 13:14
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Непомнящий Евгений @ Nov 24 2007, 15:01) *
Рассматриваю возможность прикрутить ее к DataFlash.

А смысл, для несъемного носителя?
Цитата
Насколько я понял после быстрого просмотра исходников, FatFS пишет и читает данные секторами по 512 байт.

Ну так можно и увеличить, если памяти не жалко.
Цитата
А DataFlash перед записью надо стирать

Необязательно, просто можете периодически запускать процедуру освежения. Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить....
Короче я для DataFlash свою простенькую системку сделал - количесво файлов ограничено, кластеры большие, но зато простая, учмтывает особенности DataFlash и памяти почти не требует - даже "FAT" в буфере DataFlash хранит.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2007, 13:34
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Непомнящий Евгений @ Nov 24 2007, 15:01) *
А DataFlash перед записью надо стирать, причем не по 512 байт, а по блокам (для моей модели минимальный размер блока - 4 кб).
Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1)


Цитата(zltigo @ Nov 24 2007, 15:14) *
А смысл, для несъемного носителя?
А если нужна файловая система часто читать/очень редко писать, то вот она есть - готовая и свободно доступная. Альтернативы (кроме писать свою)?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 24 2007, 14:00
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Сергей Борщ @ Nov 24 2007, 16:34) *
Dataflash можно стирать не только блоками, но и страницами. Для FatFS достаточно указать размер сектора = размеру страницы, и размер кластера = 512 / размер страницы, если ничего не путаю (у меня 321, указан размер сектор 512 и размер кластера 1)


У меня AT26DF321. Запись у нее страницами по 256 байт, а стирание - блоками по 4, 32, 64 Кб.
Т.е. чтобы записать произвольную страницу, надо сначала перекопировать куда-нить остальные страницы блока, стереть блок, скопировать все страницы обратно и при этом записать нужную.

Смысл прикручивать - хотелось что-нибудь стандартное и отлаженное smile.gif.
Но для меня критична устойчивость к сбоям питания, а в FatFS как я понимаю с этим проблемы. Так что наверное придется писать что-то свое, заточненное под DataFlash и с примитивным журналом действий, чтобы восстановиться после сбоя.


Цитата(zltigo @ Nov 24 2007, 16:14) *
Необязательно, просто можете периодически запускать процедуру освежения.

А что за процедура такая?
Цитата
Правда если делать правильно, надо счетчик перезаписей заводить для каждого сектора и где то его хранить....

Я думал хранить очередь свободных секторов - при надобности берется первая, при освобождении - ставится в конец. По-моему, получится эквивалентно счетчику...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 14:35
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Непомнящий Евгений @ Nov 24 2007, 16:00) *
А что за процедура такая?

Смотрите команды "Rewrite Trough".
Цитата
По-моему, получится эквивалентно счетчику...

Я о счетчике записей через "Programm-Erase" (помнится порядка 10 тысяч) в сектор до проведения "Rewrite Trough".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 24 2007, 14:39
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



to zltigo - по моему, мы говорим о разных моделях. В моей AT26DF321 команд "Rewrite Trough" нет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 14:52
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Непомнящий Евгений @ Nov 24 2007, 16:39) *
to zltigo - по моему, мы говорим о разных моделях.

На момент моего ответа Вы не назвали модель. И уж о нерекомендуемой в новых разработках AT26 я при поминании "DataFlash" подумал-бы в последнюю очередь. Я говорю о AT45.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 24 2007, 15:00
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(zltigo @ Nov 24 2007, 17:52) *
На момент моего ответа Вы не назвали модель. И уж о нерекомендуемой в новых разработках AT26 я при поминании "DataFlash" подумал-бы в последнюю очередь. Я говорю о AT45.

Называл в сообщении 24 smile.gif
А насчет нерекомендуемой - можно поподробней?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2007, 15:12
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Непомнящий Евгений @ Nov 24 2007, 17:00) *
Называл в сообщении 24 smile.gif

А теперь прочитайте 21 и 22 сообщения.
Цитата
А насчет нерекомендуемой - можно поподробней?

А чего подробнее - посмотрите dataseet и там на первой станице черным жирным шрифтом набрано.
http://www.atmel.com/dyn/products/product_...sp?part_id=3927


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 20 2009, 09:46
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



В версии ff006 неправильно работает fprintf:
Код
void save_to_file(void)
{
    RTC rtc;
    const char format[] = "%u/%u/%u %02u:%02u:%02u\n";
    ds1338_gettime(&rtc);
    fprintf(&file, format, rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec);
}

В файл не записывается последняя переменная и '\n'.
В то же время через printf выводит как положено:
Код

printf_P("%u/%u/%u %02u:%02u:%02u\n", rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec);

Ошибка явно в функции fprintf. Помогите найти ошибку.


В версии ff006 неправильно работает fprintf:
Код
void save_to_file(void)
{
    RTC rtc;
    const char format[] = "%u/%u/%u %02u:%02u:%02u\n";
    ds1338_gettime(&rtc);
    fprintf(&file, format, rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec);
}

В файл не записывается последняя переменная и '\n'.
В то же время через printf выводит как положено:
Код

printf_P("%u/%u/%u %02u:%02u:%02u\n", rtc.year, rtc.month, rtc.mday, rtc.hour, rtc.min, rtc.sec);

Ошибка явно в функции fprintf. Помогите найти ошибку.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 20 2009, 16:20
Сообщение #31


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



смотрели здесь?
http://elm-chan.org/fsw/ff/patches.txt

есть исправление в том числе к fprintf()


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 21 2009, 06:41
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Вопрос снимается. Проблема была связана с нехваткой стека возвратов. smile.gif
Вообще, нужно написать плакат большими буквами:
"Если программа ведет не так как задумано, первым делом проверь стеки..."
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 23 2009, 08:29
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



В симуляторе проверил fprintf , только убрал обращения к объекту file. Получилось следующее:
в пустой функции main() вызываю
Код
  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 2, 3, 4, 5, 6);
так выводит все числа.
А вот если
Код
  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 22, 333, 4444, 55555, 6666);

то на последнем аргументе (6666) va_arg() возвращает 0, и соответственно, выводит только 5 аргументов.
Видимо, это та проблема, которая описана в patches.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 23 2009, 08:42
Сообщение #34


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alux @ Mar 23 2009, 10:29) *
Видимо, это та проблема, которая описана в patches.
Откуда "видимо"? Аргументируйте. В описании патчей написано:
Цитата
will cause an incorrect behavior on the big-endian processor
С каких пор AVR под IARом стал big-endian?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 23 2009, 09:21
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Сергей Борщ @ Mar 23 2009, 14:42) *
Откуда "видимо"? Аргументируйте. В описании патчей написано:С каких пор AVR под IARом стал big-endian?

Да, там действительно упоминается по то, что эта ошибка возникает для big-endian.
Но, я привык отвечать на вопросы в том объеме, в котором они заданы smile.gif
В исходном вопросе я нигде не увидел упоминание о типе процессора. И хотя я понимаю, что "вероятностно" это проц. с маленькими индейцами, тем не менее формально рекомендация верна smile.gif. А дальше уже дело автора разбираться со своими индейцами (в данном конкртеном случае) или искать причину в другом.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 23 2009, 09:27
Сообщение #36


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



согласен. Тогда почему 6-ой аргумент не выводит? Почему "маленькие" числа выводит, а чуть побольше - не все. Числа ведь в пределах unsigned int
И это уже не связано с нехваткой стека.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 23 2009, 11:23
Сообщение #37


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(alux @ Mar 23 2009, 11:27) *
согласен. Тогда почему 6-ой аргумент не выводит?
У вас в руках есть симулятор. Даже два - родной ИАРовский и Студийный. Прогнать в нем программу, следя куда при вызове testfprintf были положены аргументы, откуда они достаются в va_arg() и кто их портит, если портит - дело минут, ну максимум часа-двух.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 25 2009, 08:52
Сообщение #38


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(alux @ Mar 23 2009, 11:29) *
В симуляторе проверил fprintf , только убрал обращения к объекту file. Получилось следующее:
в пустой функции main() вызываю
Код
  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 2, 3, 4, 5, 6);
так выводит все числа.
А вот если
Код
  const char format[] = "%u/%u/%u %u:%u:%u";
  testfprintf(format, 1, 22, 333, 4444, 55555, 6666);

то на последнем аргументе (6666) va_arg() возвращает 0, и соответственно, выводит только 5 аргументов.
Видимо, это та проблема, которая описана в patches.


6666 это уже 32-битное число. Соответственно, надо

const char format[] = "%u/%u/%u %u:%u:%lu";

Сообщение отредактировал Genadi Zawidowski - Mar 25 2009, 09:02
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Mar 25 2009, 11:10
Сообщение #39


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Genadi Zawidowski @ Mar 25 2009, 10:52) *
6666 это уже 32-битное число. Соответственно, надо

const char format[] = "%u/%u/%u %u:%u:%lu";

Ничего подобного. До 32-битного еще добавлять и добавлять.

Проверьте саму fprintf. Если используется промежуточный буфер и vsnprintf, проверьте его размер, может банально не влезть.
Go to the top of the page
 
+Quote Post
artemm
сообщение Mar 31 2009, 12:11
Сообщение #40


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



Скажите, если я пишу отак:
Цитата
FATFS fs;
FIL fdst;
FRESULT res;
f_mount(0, &fs);
res = f_open(&fdst, "test.dat", FA_CREATE_ALWAYS | FA_WRITE);
fprintf(&fdst, "%s", "This is a test");
f_close(&fdst);
f_mount(0, NULL);


файловая система сама ищет свободные кластера и туда это всё дело записывает?? Нужно лишь беспокоиться о свободном месте на флешке??? или нет?
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 31 2009, 14:25
Сообщение #41


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(artemm @ Mar 31 2009, 17:11) *
файловая система сама ищет свободные кластера и туда это всё дело записывает?? Нужно лишь беспокоиться о свободном месте на флешке??? или нет?

Ну да. А для чего тогда иначе была бы нужна файловая система?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
kostik2
сообщение Apr 1 2009, 17:02
Сообщение #42


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 16-02-06
Пользователь №: 14 375



Цитата(Сергей Борщ @ Nov 23 2007, 12:59) *
Как что? Не прочитали документацию. Хотя бы на f_mount:Можно было еще заглянуть в исходники, и увидеть, что f_mount только сохраняет адрес этой структуры во внутренней переменной. А заполнение произойдет потом, когда попытаетесь призвести какое-нибудь действие с файлом/директорией.

Заинтересовался этим вопросом тоже. avr и flash. Можете, если у вас есть наработки поделиться ими. Буду очень благодарен.

здравствуйте. заинтересовался этим вопросом тоже. о пока я не очень представляю механизм написания программы чтения и записи данных в flash. если не трудно, могете поделиться исходниками по работе с fat32 для avr. буду очень благодарен. kostiapan@mail.ru
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Apr 1 2009, 17:49
Сообщение #43


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(HARMHARM @ Mar 25 2009, 15:10) *
Ничего подобного. До 32-битного еще добавлять и добавлять.

Проверьте саму fprintf. Если используется промежуточный буфер и vsnprintf, проверьте его размер, может банально не влезть.

Проглядел деталь... предпоследнее число было 55555 - мне показалось. что в неработающем примере было 66666. Может, человек по памяти писал?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 1 2009, 19:45
Сообщение #44


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kostik2 @ Apr 1 2009, 20:02) *
Можете, если у вас есть наработки поделиться ими. Буду очень благодарен.
Наработки есть на сайте автора. Их там аж несколько штук. Что вас в них не устраивает и почему вы считаете, что чьи-то еще будут лучше?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 2 2009, 08:02
Сообщение #45


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(kostik2 @ Apr 1 2009, 20:02) *
пока я не очень представляю механизм написания программы чтения и записи данных в flash.

Копайте уровень железа - diskio.*
Вам надо надуться на написание нескольких процедур (чтение/запись/статус/инициализация/контрол) и решить, что будете делать с таймстампом.
Go to the top of the page
 
+Quote Post
Akakiy
сообщение Apr 4 2009, 15:28
Сообщение #46


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 15-11-04
Пользователь №: 1 137



Обновилась FatFS R0.07
Цитата
R0.07, Apr 01, 2009
Merged Tiny-FatFs as a buffer configuration option.
Added long file name support.
Added multiple code page support.
Added re-entrancy for multitask operation.
Added auto cluster size selection to f_mkfs().
Added rewind option to f_readdir().
Changed result code of critical errors.
Renamed string functions to avoid name collision.
Go to the top of the page
 
+Quote Post
Hasky
сообщение Jun 30 2009, 07:22
Сообщение #47





Группа: Новичок
Сообщений: 4
Регистрация: 7-08-08
Из: Краснодар
Пользователь №: 39 472



[quote name='kanzler' date='Nov 23 2007, 20:49' post='328189']
Читал, но мой англицкий оставляет желать лучшего.
Так и пытаюсь произвести чтение директории с помощью f_readdir, возвращает - FR_NO_FILESYSTEM, хотя флешка перед тем была отформатированна FAT16 и записан файл.

В этом нет проблемы драйвер был прикручен и он работает без сбое

Была такая же проблема: все функции в diskio.cpp корректно работали (тестил каждую после портирования на MSP430), но после успешного монтирования (FR_OK) функцией f_mount при попытки открыть фаил f_open возвращал - FR_NO_FILESYSTEM.
Проблема была устранена путем коммента функции disk_initialize перед f_mount, которую вызывал для проверки ее же работоспособности.
Наверное дело в том, что мой проект не поддерживает снятия питания с карты, и при повторной внутренней инициализации в f_open, происходила ошибка.

P.S. FatFs 007, IAR 4.10, MSP430
Go to the top of the page
 
+Quote Post
piz2383
сообщение Aug 16 2009, 15:42
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675



У меня вопрос новичка к вам. Если с помощью FATFs записывать файлы на флешку а потом подключить к компьютеру. То как она определиться по виндой? Как FAT16?

Заранее спасибо за ответ.
Go to the top of the page
 
+Quote Post
VDLab
сообщение Aug 16 2009, 15:47
Сообщение #49


Частый гость
**

Группа: Свой
Сообщений: 133
Регистрация: 30-04-07
Из: DP.UA
Пользователь №: 27 419



Если ее не форматировать средствами fatfs, то какая была до записи файлов, такая и останется.
Go to the top of the page
 
+Quote Post
piz2383
сообщение Aug 16 2009, 15:55
Сообщение #50


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 26-06-09
Пользователь №: 50 675



Я имею ввиду, у меня есть голая флешка, отформатированная. Я на ней создаю файловую систему под средством FATFs, записываю несколько файликов и так далее... Потом подключаю её к компу, она определиться в винде или нет? И если да то как?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 16 2009, 17:31
Сообщение #51


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(piz2383 @ Aug 16 2009, 21:55) *
Потом подключаю её к компу, она определиться в винде или нет? И если да то как?


Определится. Как FAT16.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
VDLab
сообщение Aug 16 2009, 18:01
Сообщение #52


Частый гость
**

Группа: Свой
Сообщений: 133
Регистрация: 30-04-07
Из: DP.UA
Пользователь №: 27 419



Цитата(piz2383 @ Aug 16 2009, 18:55) *
Я имею ввиду, у меня есть голая флешка, отформатированная. Я на ней создаю файловую систему под средством FATFs, записываю несколько файликов и так далее... Потом подключаю её к компу, она определиться в винде или нет? И если да то как?

Флешки "голыми" не выпускаются. От изготовителя они приходят уже отформатированными (как правило в FAT16), Форматирование необходимо только в случае "слета" файловой системы (да и то, если на карточке есть нужная информация, то ее нужно перед фоматированием извлечь, а это, как правило, делается с помощью ПК, там же обычно она и форматируется) или в каких либо особых случаях.
Если все же нужно форматирование, то, вообще говоря, файловая система выбирается исходя из обьема носителя. Но в случае с обычными современными карточками памяти выбор невелик - ФАТ12 никак не подойдет, а ФАТ32 пока нет смысла(хотя возможность есть).
Go to the top of the page
 
+Quote Post
Grape
сообщение Aug 17 2009, 13:09
Сообщение #53


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



Цитата(VDLab @ Aug 16 2009, 22:01) *
Если все же нужно форматирование, то, вообще говоря, файловая система выбирается исходя из обьема носителя. Но в случае с обычными современными карточками памяти выбор невелик - ФАТ12 никак не подойдет, а ФАТ32 пока нет смысла(хотя возможность есть).


на карточку 8Gb и больше FAT16 будет затруднительно прикрутить... не разбивая на разделы
так что FAT32 вполне востребована.

/Gr
Go to the top of the page
 
+Quote Post
VDLab
сообщение Aug 17 2009, 13:37
Сообщение #54


Частый гость
**

Группа: Свой
Сообщений: 133
Регистрация: 30-04-07
Из: DP.UA
Пользователь №: 27 419



Ну такой емкости карточки пока еще не так распространены как 0,5 - 2ГБайтные, тем более для "нескольких файликов".
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Aug 17 2009, 14:17
Сообщение #55


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Бывают и другие причины выбирать FAT32 вместо FAT16. Например из за ограничения на количество файлов в корневом каалоге FAT16. А с появлением поддержки LFN в FatFS это становится актуальным - при длинных именах емкость корневого каталога может оказаться файлов на 30-40. И этого может не хватить.
Go to the top of the page
 
+Quote Post
VDLab
сообщение Aug 17 2009, 18:18
Сообщение #56


Частый гость
**

Группа: Свой
Сообщений: 133
Регистрация: 30-04-07
Из: DP.UA
Пользователь №: 27 419



Ну это легко обходится. Просто не ложите файлы в корень.
Go to the top of the page
 
+Quote Post
Deddy85
сообщение Sep 21 2009, 11:23
Сообщение #57





Группа: Участник
Сообщений: 7
Регистрация: 25-08-09
Пользователь №: 52 038



Цитата(VDLab @ Aug 16 2009, 18:47) *
Если ее не форматировать средствами fatfs, то какая была до записи файлов, такая и останется.

Извиняюсь за очень легкий вопрос, но никак не могу разобратся. А как форматировать накопитель средствами fatfs?
Go to the top of the page
 
+Quote Post
goodwin
сообщение Sep 21 2009, 11:39
Сообщение #58


Местный
***

Группа: Свой
Сообщений: 481
Регистрация: 1-08-05
Пользователь №: 7 267



f_mkfs
Go to the top of the page
 
+Quote Post
Арк К
сообщение Nov 19 2009, 07:17
Сообщение #59


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363



Не смог пока разобраться с такой проблемой.
Есть реализация данной библиотеки на SDC, в контроллере зашита программка как в демке от автора FatFs для общения с контроллером через терминалку.
Всё работает отлично, кроме русских букв в именах файлов.

Проблема состоит из двух частей:
1) Если создать файл с русскими буквами в имени средствами Windows, то при чтении директории через терминалку, буквы отображаются "закорючками".
2) Если то же самое сделать средствами контроллера из терминалки и прочитать директорию на компе под Windows, то эти имена вообще не воспринимаются системой (потом с этими файлами ничего не сделать - ругается на недопустимые символы).

Длинные имена отображаются как положено и с русскими буквами

Кодовая страница в настройках FatFs установлена 1251 (пробовал и 866 - при создании файла прога виснет).
Смотрел на реализацию функции get_fileinfo(), там при выдаче имени файла перекодировок не происходит.
В функции create_name() используется табличка соответствующая.

если по проблеме 2 еще можно грешить на то, что японец не верно построил перекодировку, то по 1-й вообще неясно...

Кто, что скажет?

Сообщение отредактировал Арк К - Nov 19 2009, 07:31
Go to the top of the page
 
+Quote Post
Арк К
сообщение Nov 19 2009, 08:32
Сообщение #60


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363



Очень похоже на то, что Windows для коротких имён использует CP866, а Элм это не учёл...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 19 2009, 09:24
Сообщение #61


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Арк К @ Nov 19 2009, 12:17) *
Кто, что скажет?


Надо задать
Код
#define _CODE_PAGE    866

, и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Арк К
сообщение Nov 19 2009, 12:22
Сообщение #62


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363



Цитата(AHTOXA @ Nov 19 2009, 12:24) *
Надо задать
Код
#define _CODE_PAGE    866

, и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.

Да, действительно, так работает. осталось только перекодировку клавиш как-то осуществить - в моих терминалках этого нет (terminal v1.9 by Br@y++, в ZOC как-то коряво), но в целом проблема ясна:
У русских, как всегда, особенный путь smile.gif : короткие имена Windows хранит в 866-й кодировке, длинные - в 1251-й, путаница ещё та.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 19 2009, 12:30
Сообщение #63


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Арк К @ Nov 19 2009, 15:22) *
ZOC как-то коряво..

Да ну? Совершенно нормальная реализация. Причем у подавляющего большинства и мыслей о других кодировках нет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Арк К
сообщение Nov 19 2009, 19:11
Сообщение #64


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 8-05-08
Пользователь №: 37 363



Цитата(zltigo @ Nov 19 2009, 15:30) *
Да ну?

Согласен, у подавляющего большинства мыслей становится всё меньше и меньше...smile.gif
Лично мне не удалось нормально настроить этот самый ZOC и больше на это время тратить не буду.
Что касается локализации файловой системы, то дело это оказалось нетривиальным и ресурсоемким - всё зависит от конкретной задачи.

Просто я хотел бы узнать как другие решали эти проблемы в своих разработках.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 5 2017, 20:53
Сообщение #65


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Вопрос по Petit FatFs.

Для отладки использую Proteus VSM 8.4 с виртуальной CD/MMC картой. На карте есть единственный файл 7 с хвостиком килобайт, к которому осуществляется доступ в разные произвольные места. Поначалу все работает: файл открывается, из него читаются данные (все верно читается), функция pf_lseek отрабатывает разные смещения. Но потом по неизвестным причинам pf_lseek начинает выдавать ошибку FR_DISK_ERR, и все, разумеется, перестает работать.

При пошаговой отладке добрался до функции send_cmd(CMD17, sector), которая и вызывает эту ошибку. В начале эта функция вызывается многократно успешно, а ошибку возвращает, если sector == 512 (просто обратил внимание, не факт, что именно это значение играет роль).

Что-то никак не могу понять, куда копать... подскажите, пожалуйста, если не сложно...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Mar 10 2017, 14:39
Сообщение #66


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



А в железе пробовали отлаживать?
Симулятор, конечно, хорошо, но не всегда помогает разобраться в причинах.
Так же, можете добавить в обработчике ошибок (кстати, у себя в коде не нашёл такового - похоже, функции писались с бодуна, но работают почти без сбоев) сделать вывод ответа карты - так проще разобраться в ошибках.
На ARM - такое крайне желательно.
Предполагаю, что используете SPI?
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 14 2017, 18:31
Сообщение #67


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Делал и в железе - результат 100% тот же самый. И вывод всех статусов карты и т.п. делал, т.е. из Chan-овской библиотеки в нужных местах выводил, что возвращается... толку ноль - не понимаю, что не так. Когда сектор равен 512 в функции lseek, в конце функции карта просто не отвечает - приходит 0xFF и точка... хоть убей...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Mar 17 2017, 15:24
Сообщение #68


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Обработчики функций библиотеки дописывали сами?

Попробую привести пример своих, может поможет чем.
Сразу поясню: сталкивался с какими-то весёлыми косяками при работе с несколькими картами (всеми имевшимися на тот момент в наличии), код привёл к тому виду, в котором он сейчас. На тот момент всё работало стабильно, читалось, писалось.
Попробуйте, может и заработает.

CODE
DRESULT disk_read (
uint8_t pdrv, /* Physical drive nmuber to identify the drive */
uint8_t *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to read */
)
{
<...>
//case MMC :
//// translate the arguments here

//result = MMC_disk_read(buff, sector, count);
result = 0;
if (count == 1) {
result = SPI_SD_READ_SECTOR_buf(sector, m_buf);
} else {
while (count>0)
{
result = SPI_SD_READ_SECTOR_buf(sector, m_buf);
count--;
sector++;
};
};
return result;
<...>


uint8_t SPI_SD_READ_SECTOR_buf(uint32_t Sector, uint8_t* buff) {
uint16_t i;
uint32_t calc_Addr;
SPI_Select_CARD();
if (!(sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC))) // Если карта НЕ является SDHC - добавляем 9 бит к адресу.
{
// !SDHC
calc_Addr = ((Sector+249) << 9); // DaFaq?! But will not work in other case.
} else {
// SDHC
calc_Addr = (Sector+2048); // And one more DAFAQ!
};
i = SPI_SD_SendCMD(CMD_READ_SINGLE_BLOCK, calc_Addr); // Передаём вычисленный адрес карте
card_answ_at_read = i; // DEBUUUUUG!
if(i)
{
SPI_UnSelect_CARD(); // Отпускаем карту
return R_ERR; // Возвращаем ошибку. =(
};
while (SPI_Rd_Byte() != 0xFE); // Ждём начала блока. Чаще всего до 30-40 итераций.
for (i=0; i<512; i++) // Читаем байт и заносим его в буфер (512 байт)
{
*buff = SPI_Rd_Byte();
buff++;
};
SPI_Rd_Byte(); // CRC
SPI_Rd_Byte(); // CRC (2) // IGNORED T_T
/* deaddress card */
SPI_UnSelect_CARD(); // Отпускаем карту (шину)
SPI_Rd_Byte(); // Тактирование.
return R_OK;
};



ЗЫ: Обратите внимание на комментарии около странных переводов значений секторов. Особенно, +249
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th August 2025 - 04:54
Рейтинг@Mail.ru


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