Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по FatFs от мистера ChaN'а
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
AHTOXA
Цитата(piz2383 @ Aug 16 2009, 21:55) *
Потом подключаю её к компу, она определиться в винде или нет? И если да то как?


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

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


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

/Gr
VDLab
Ну такой емкости карточки пока еще не так распространены как 0,5 - 2ГБайтные, тем более для "нескольких файликов".
Qwertty
Бывают и другие причины выбирать FAT32 вместо FAT16. Например из за ограничения на количество файлов в корневом каалоге FAT16. А с появлением поддержки LFN в FatFS это становится актуальным - при длинных именах емкость корневого каталога может оказаться файлов на 30-40. И этого может не хватить.
VDLab
Ну это легко обходится. Просто не ложите файлы в корень.
Deddy85
Цитата(VDLab @ Aug 16 2009, 18:47) *
Если ее не форматировать средствами fatfs, то какая была до записи файлов, такая и останется.

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

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

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

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

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

Кто, что скажет?
Арк К
Очень похоже на то, что Windows для коротких имён использует CP866, а Элм это не учёл...
AHTOXA
Цитата(Арк К @ Nov 19 2009, 12:17) *
Кто, что скажет?


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

, и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.
Арк К
Цитата(AHTOXA @ Nov 19 2009, 12:24) *
Надо задать
Код
#define _CODE_PAGE    866

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

Да, действительно, так работает. осталось только перекодировку клавиш как-то осуществить - в моих терминалках этого нет (terminal v1.9 by Br@y++, в ZOC как-то коряво), но в целом проблема ясна:
У русских, как всегда, особенный путь smile.gif : короткие имена Windows хранит в 866-й кодировке, длинные - в 1251-й, путаница ещё та.
zltigo
Цитата(Арк К @ Nov 19 2009, 15:22) *
ZOC как-то коряво..

Да ну? Совершенно нормальная реализация. Причем у подавляющего большинства и мыслей о других кодировках нет.
Арк К
Цитата(zltigo @ Nov 19 2009, 15:30) *
Да ну?

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

Просто я хотел бы узнать как другие решали эти проблемы в своих разработках.
ARV
Вопрос по Petit FatFs.

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

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

Что-то никак не могу понять, куда копать... подскажите, пожалуйста, если не сложно...
AlanDrakes
А в железе пробовали отлаживать?
Симулятор, конечно, хорошо, но не всегда помогает разобраться в причинах.
Так же, можете добавить в обработчике ошибок (кстати, у себя в коде не нашёл такового - похоже, функции писались с бодуна, но работают почти без сбоев) сделать вывод ответа карты - так проще разобраться в ошибках.
На ARM - такое крайне желательно.
Предполагаю, что используете SPI?
ARV
Делал и в железе - результат 100% тот же самый. И вывод всех статусов карты и т.п. делал, т.е. из Chan-овской библиотеки в нужных местах выводил, что возвращается... толку ноль - не понимаю, что не так. Когда сектор равен 512 в функции lseek, в конце функции карта просто не отвечает - приходит 0xFF и точка... хоть убей...
AlanDrakes
Обработчики функций библиотеки дописывали сами?

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

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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.