|
|
  |
Вопрос по FatFs от мистера ChaN'а |
|
|
|
Nov 19 2009, 09:24
|

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

|
Цитата(Арк К @ Nov 19 2009, 12:17)  Кто, что скажет? Надо задать Код #define _CODE_PAGE 866 , и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 19 2009, 12:22
|
Участник

Группа: Участник
Сообщений: 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 как-то коряво), но в целом проблема ясна: У русских, как всегда, особенный путь  : короткие имена Windows хранит в 866-й кодировке, длинные - в 1251-й, путаница ещё та.
|
|
|
|
|
Nov 19 2009, 19:11
|
Участник

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

|
Цитата(zltigo @ Nov 19 2009, 15:30)  Да ну? Согласен, у подавляющего большинства мыслей становится всё меньше и меньше...  Лично мне не удалось нормально настроить этот самый ZOC и больше на это время тратить не буду. Что касается локализации файловой системы, то дело это оказалось нетривиальным и ресурсоемким - всё зависит от конкретной задачи. Просто я хотел бы узнать как другие решали эти проблемы в своих разработках.
|
|
|
|
|
Mar 5 2017, 20:53
|

Профессионал
    
Группа: Свой
Сообщений: 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 (просто обратил внимание, не факт, что именно это значение играет роль).
Что-то никак не могу понять, куда копать... подскажите, пожалуйста, если не сложно...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 10 2017, 14:39
|

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

|
А в железе пробовали отлаживать? Симулятор, конечно, хорошо, но не всегда помогает разобраться в причинах. Так же, можете добавить в обработчике ошибок (кстати, у себя в коде не нашёл такового - похоже, функции писались с бодуна, но работают почти без сбоев) сделать вывод ответа карты - так проще разобраться в ошибках. На ARM - такое крайне желательно. Предполагаю, что используете SPI?
|
|
|
|
|
Mar 17 2017, 15:24
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|