Перейти к содержанию
    

StmF407+USBFlash+Fatfs Прблемка

Привет всем :)

Есть следующая загвоздка:

 

Пытаюсь реализовать чтение с ЮСБ флешки файла 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. Мож кто сталкивался?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем поправлю себя. Поковырял маленько.

Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем поправлю себя. Поковырял маленько.

Если читать файл с самого начала, то все ок, если переместить указатель больше чем 512 байт, то дальше можно читать любыми кусками, если менее, то только до 512-го байта, дальше ошибка. Я конечно выкрутился из данной ситуации, но все же вопрос остался.

Возможно связано с работой драйвера.

Если флеш, страничная организация - то чтение идет естественно страницей.

Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора.

Вот тут и может быть написано нечто "мелким шрифтом" :)

к примеру что lseek двигать кратно размеру страницы, иначе ОНО должно подкачивать в буфер сразу 2.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот это мелкий шрифт и не читается ))) Тут у меня скорей всего скила не хватает. я сделал так:

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

 

:01: Вообщем вруша я :) Нифигасеньки не получилось :) Все упирается в магические цифры :( перемещаю указатель на 600 позицию - читаю сколько влезет. А если на 2562-ю, то фсе... Опять те же грабли... :( Вообщем ну эти большие куски :) Читаю по 4 байта нужное количество раз (все равно в BMP запись пикселей кратна 4-ем байтам), складываю все в массив, потом отправляю дальше по конвееру :) Так работает :) Уже проверил на железе :) :08:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если флеш, страничная организация - то чтение идет естественно страницей.

Соотв-но если у Вас линейный адрес, то он пересчитывается драйвером в страницы-блоки-сектора.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом, т.е. можно читать и записывать блоки, как минимум 512-4096, или более байт. Как они организованы внутри флешки - да фиг с ними.

У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры.

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да причем тут "низкоуровневой организации флешь"?? Автор явно указал, что "Пытаюсь реализовать чтение с ЮСБ флешки" , т.е. это обычное Mass Storage Device, а следовательно работает уже блочным принципом,

И что???

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

Функция disk_read() (и прочие disk_...()), вызываемая FatFS, каким-то способом обращается к классу MassStorage, скорей всего проблема здесь.

 

У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1

Что это за функция такая? И каким образом Вы узнали что у автора она есть???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У него проблема в функции BlockRead(write), скорее всего параметр "SectorCount" всегда равен 1, и когда идет запрос нескольких секторов, то получается фигня. Из этого следует, либо читать только блоки равные сектору, т.е. 1-512, или править указанные процедуры.

Да где же следует, если

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

 

И еще информация к размышлению на основе данных из первого поста:

62 + 450 = 512, что как бы намекает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще информация к размышлению на основе данных из первого поста:

62 + 450 = 512, что как бы намекает.

Открыть disk_read() (и прочие disk_...()) и разбираться что там да как напортачено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что это за функция такая? И каким образом Вы узнали что у автора она есть???

 

Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Она есть в любом случае, у меня она так называется, у кого-то может добавлено подчеркивание...Суть не в названии...

В любом случае в FatFS есть low-level функции указанные в файле diskio.h. Эти же функции описаны на странице http://elm-chan.org/fsw/ff/00index_e.html в разделе "Device Control Interface". Именно через это API FatFS общается с низкоуровневым драйвером.

А то что у Вас - это что-то лично Ваше. Возможно это что-то более нижнего уровня. И оно не входит в FatFS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...