Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: StmF407+USBFlash+Fatfs Прблемка
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
pahanvs
Привет всем sm.gif
Есть следующая загвоздка:

Пытаюсь реализовать чтение с ЮСБ флешки файла BMP. Как бы все работает вроде неплохо, но вот наткнулся на один косяк.
все подключается, пишется и т.д. НО мне нужно прочитать в заголовке файла некую информацию, а именно откуда начинаются данные самого растра, дабы переместится туда и начать их считывать. Ну ладно думаю в чем проблема-то:
f_lseek (&MyFile, 10);
f_read (&MyFile, rastr, sizeof(rastr), &br);
считываю что растр начинается с 62 байта.
перемещаюсь туда:
f_lseek (&MyFile, 62);
и вот прикол- пытаюсь считать 2500 байт
f_read (&MyFile, send, sizeof(send), &br); буфер send имеет размер 2500...
и фигушки...
ну ладно думаю, погляжу в отладке.. смотрю... а он считывает только 450 байт и все. при повторном обращении не читает ничего и f_error(&MyFile) устанавливает единичку, тобиш ахтунг...
Ломал голову и так и сяк, потом заметил что если сначала не читать заголовок файла, а сразу начинать читать кусками по 2500, то все нормально. читает весь файл до конца без ошибок.
Вообщем суть такова что после любого перемещения указателя по файлу он разрешает читать только 450 байт, а если сразу читать нужные куски, то хоть 4000. Мож кто сталкивался?
pahanvs
Вообщем поправлю себя. Поковырял маленько.
Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался.
k155la3
Цитата(pahanvs @ Sep 29 2016, 14:23) *
Вообщем поправлю себя. Поковырял маленько.
Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался.

Возможно связано с работой драйвера.
Если флеш, страничная организация - то чтение идет естественно страницей.
Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора.
Вот тут и может быть написано нечто "мелким шрифтом" sm.gif
к примеру что lseek двигать кратно размеру страницы, иначе ОНО должно подкачивать в буфер сразу 2.



pahanvs
вот это мелкий шрифт и не читается ))) Тут у меня скорей всего скила не хватает. я сделал так:
читаю заголовок и перемещаю указатель на начало растра+величина одной строки растра и поехал дальше читать. первую строчку канеш теряю, но их там очень много, и потеря одной не критична sm.gif

01.gif Вообщем вруша я sm.gif Нифигасеньки не получилось sm.gif Все упирается в магические цифры sad.gif перемещаю указатель на 600 позицию - читаю сколько влезет. А если на 2562-ю, то фсе... Опять те же грабли... sad.gif Вообщем ну эти большие куски sm.gif Читаю по 4 байта нужное количество раз (все равно в BMP запись пикселей кратна 4-ем байтам), складываю все в массив, потом отправляю дальше по конвееру sm.gif Так работает sm.gif Уже проверил на железе sm.gif 08.gif
jcxz
Цитата(k155la3 @ Sep 29 2016, 17:41) *
Если флеш, страничная организация - то чтение идет естественно страницей.
Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора.

Если так, то очевидно, что проблема в кривом low-level драйвере, через который работает FatFS. Так как FatFS - это middleware, то FatFS не знает и не должен ничего знать о низкоуровневой организации флешь (всяких страницах, секторах, ...). Вот его и надо выпрямлять.
mantech
Цитата(jcxz @ Sep 29 2016, 17:17) *
Если так, то очевидно, что проблема в кривом low-level драйвере, через который работает FatFS. Так как FatFS - это middleware, то FatFS не знает и не должен ничего знать о низкоуровневой организации флешь (всяких страницах, секторах, ...). Вот его и надо выпрямлять.


Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом, т.е. можно читать и записывать блоки, как минимум 512-4096, или более байт. Как они организованы внутри флешки - да фиг с ними.
У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры.
jcxz
Цитата(mantech @ Sep 29 2016, 20:56) *
Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом,

И что???
Значит low-level драйвер через который работает FatFS - это реализация класса MassStorage на UsbHost. Вот он и "при том". В нём и следует искать проблему, что-то он читает неверно.
Функция disk_read() (и прочие disk_...()), вызываемая FatFS, каким-то способом обращается к классу MassStorage, скорей всего проблема здесь.

Цитата(mantech @ Sep 29 2016, 20:56) *
У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1

Что это за функция такая? И каким образом Вы узнали что у автора она есть???
aaarrr
Цитата(mantech @ Sep 29 2016, 17:56) *
У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры.

Да где же следует, если
Цитата
...заметил что если сначала не читать заголовок файла, а сразу начинать читать кусками по 2500, то все нормально. читает весь файл до конца без ошибок.


И еще информация к размышлению на основе данных из первого поста:
62 + 450 = 512, что как бы намекает.
jcxz
Цитата(aaarrr @ Sep 29 2016, 21:12) *
И еще информация к размышлению на основе данных из первого поста:
62 + 450 = 512, что как бы намекает.

Открыть disk_read() (и прочие disk_...()) и разбираться что там да как напортачено.
mantech
Цитата(jcxz @ Sep 29 2016, 18:07) *
Что это за функция такая? И каким образом Вы узнали что у автора она есть???


Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии...
jcxz
Цитата(mantech @ Sep 30 2016, 00:01) *
Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии...

В любом случае в FatFS есть low-level функции указанные в файле diskio.h. Эти же функции описаны на странице http://elm-chan.org/fsw/ff/00index_e.html в разделе "Device Control Interface". Именно через это API FatFS общается с низкоуровневым драйвером.
А то что у Вас - это что-то лично Ваше. Возможно это что-то более нижнего уровня. И оно не входит в FatFS.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.