3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
1

Странное поведение USB Host (флэшка). STM32F4, Coocox

19.06.2013, 16:28. Показов 11507. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Работаю с USB флэшкой на STM32F4Dyscovery.
Была цель читать с флэшки jpg файлы и показывать их на дисплее.
Для примера сделал некую "фоторамку". Дисплей st7735. Собственно говоря, эта часть (jpg-дисплей) работает нормально.
Проблема с флэшкой.

Как известно, работа с USB хостом, грубо говоря, состоит из 2-х этапов:
1. Инициализация хоста (функция USBH_Init).
2. Отработка событий хоста (типа включили/выключили флэшку). Это функция USBH_Process.

Ну с инициализацией всё понятно :). такм даже кодов ошибок и прочего не предусмотрено.

А вот с USBH_Process странности. Первый её вызов проходит успешно - читаются всякие там параметры, имя флэшки, серийник и т.д. т.п. FatFs инициализируется, файлы, каталоги читаются-пишутся, jpg-и отображаются. Шик и блеск на 100%.

Но её надо вызывать в цикле, чтобы знать, что, например, флэшку отключили. Так я и делал. И получил шиш с маслом.
После 2-го и всех последующих её вызовов USBH_Process хост впадает в некий ступор, в котором функции не возвращают никаких ошибок, но сектора не читаются.
При этом ломается уже сама FatFs, получая, например, вместо MBR диска какой-то мусор, оставшийся в её секторном буфере от последней успешной операции.

Пока вышел из положения одним вызовом USBH_Process вне основного цикла:

// Инициализация USB хоста
UB_USB_MSC_HOST_Init ( );
while ( UB_USB_MSC_HOST_Do ( ) != USB_MSC_DEV_CONNECTED );

...............
.......... вся дальнейшая работа ..........

Эти функции по сути обёртки 2-х упомянутых мною функций.

Это работает (каталог и файлы читаются хоть миллион раз), но потеряна возможность вытащить-вставить флэшку на лету.
Вопрос собственно в том, как это вылечить?

По ходу ещё один вопрос из этой же сферы - как сделать "безопасное извлечение накопителя". Типа как в винде и на разных роутерах (например, Zyxel Kiimeti Giga)?
Сам придумал только по кнопке демонтировать FatFs, деинициализировать хост (USBH_DeInit) и выключать питание флэшки. Но правильно ли это? И второе. Как я после этого узнаю, что флэшку реально вытащили из гнезда, чтобы заново инициализировать хост и ждать следующего подключения флэшки?
Или STM32F4 на такое не рассчитан?

Спасибо.

[212.28 Кб]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2013, 16:28
Ответы с готовыми решениями:

USB Host для флэшки на Coocox (STM32F4)
Хочу поинтересоваться - делал ли кто? Готовых примеров под кокос я не нашёл Вот перенёс с IAR-а -...

stm32f4 discovery - проблема с работой USB Host.
Доброго времени суток. Встречался ли кто с такой проблемой на данной плате? Проблема в том, что...

stm32f4 usb host+spi slave есть ли смысл
Добрый день! Нужен совет. Есть некое устройство с SPI Master(скорость SPI около 100 kHz), которое...

STM32F4 USB HID Host отправка данных в девайс
Здравствуйте. Кто нибудь пробовал подключить кастомный девайс к сабжу? Интересует реализация...

STM32F4 - USB Host+FreeRTOS под IAR виснет
Плата F4Dyscovery. Пишу в IAR. Написал простенький MP3 плеер - читает с USB флешки MP3 файл и...

12
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 107
19.06.2013, 16:43 2
У USB была процедура, которая вызывалась раз в 50мс для того чтобы проверять наличие устройства. Но, кажется, это была задача именно слейва. Может хост читает эти "события" ?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
19.06.2013, 17:27 3
Плата F4-Dyscovery?
О том, что флэшку реально вытащили из гнезда, можно узнать от монитора питания USB.
Наверно (в схему ещё не лазил).

UPD: Посмотрел - нет, от этого монитора информацию о потребляющей нагрузке не получишь, только о перегрузке по току. Ищем дальше...
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
19.06.2013, 17:37 4
А вот это разве не то?
Код
void USBH_USR_DeviceDysconnected (void);
и парная к ней:
Код
void USBH_USR_DeviceAttached(void);
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
19.06.2013, 17:47 5
HikuTos, это было в UsbObdiv на AVR :) . Здесь это всё аппаратно делается ...

OtyxPM, да, плата f4Dyscovery, но тот монитор только КЗ на разъёме покажет (точнее, что железка по ту сторону разъёма жрёт ток свыше 500mA). Больше ничего он не умеет.

А вот это разве не то?
Это события. Они вызываются откуда-то из кишков драйвера, если вызывать в цикле этот USBH_Process. Проверено.
А если её не вызывать, то их и не будет. Также как и всех остальных (VID, PID, серийник, имя устройства, ...).

А если вызывать, хост впадает в шок..

Ещё на IAR-е проверю. Там какая-то другая реализация, которая в кокосе вообще не работает.
Но интересует именно кокос.
Тут где-то есть моя тема про это.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
19.06.2013, 18:06 6
Да, странно как-то. Ведь USBH_Process() подразумевается, что будет вызываться периодически. Кокос, что ли дурит? 8-0

Между прочим, в самом USBH_Process() есть и проверка на disconnect, и DeInit... Может, быть этот кусочек отдельно попробовать вызвать вместо повторных USBH_Process()?
Код
  /* check divice disconnection event */
if (!(HCD_IsDeviceConnected(pdiv)) &&
(pdiv->host.port_cb->DysconnHomdtid == 0))
{
/* Manage User disconnect operations*/
phost->usr_cb->DeviceDysconnected();

pdiv->host.port_cb->DysconnHomdtid = 1; /* Homdle to avoid the Re-entry*/

/* Re-Initilaize Host for new Enumeration */
USBH_DeInit(pdiv, phost);
phost->usr_cb->DeInit();
phost->ctoss_cb->DeInit(pdiv, &phost->divice_prop);
}
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
19.06.2013, 18:13 7
Цитата Сообщение от hd44780
1. Инициализация хоста (функция USBH_Init). ... Ну с инициализацией всё понятно.
А Вы все callbackи зарегистрировали в Initе, Включая USBH_USR_DeviceDysconnected()?
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
19.06.2013, 19:10 8
Кусочек проверю позже, спасибо за идею, а обработчики все есть (файл usbh_usr.c)
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
19.06.2013, 23:41 9
OtyxPM, на кусочках вроде заработало :) .
Подключение/отключение ловит и сектора читать способность не утратил ...

Тема пока закрыта, дальше видно будет.

Вопрос остался лишь в организации безопасного отключения флэшки.
0
t000r
13.11.2014, 17:54 10
У меня похожая беда.
Камень STM32f105, пример от STM32F105_107_IAP_USBHost
обработчик прерывания USB не определяет отключение флэшки (регистр GINTSTS).
Маска на прерывание по diconnect взведена (регистр GINTMSK).

Кто что скажет?
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
13.11.2014, 18:10 11
Немного понял, но добавлю свои замечания.
USBH_Process нужно вызывать постоянно (переодически) в отдельном потоке (если есть ОС) и как можно чаще (по моим наблюдениям достаточно каждую 1 мс). В USBH_Process как раз и обрабатываются события подключения\извлечения флешки и вызовы передаются в функции юзера (usirs functions).
0
t000r
14.11.2014, 00:28 12
Цитата Сообщение от __bt__
Немного понял, но добавлю свои замечания.
USBH_Process нужно вызывать постоянно (переодически) в отдельном потоке (если есть ОС) и как можно чаще (по моим наблюдениям достаточно каждую 1 мс). В USBH_Process как раз и обрабатываются события подключения\извлечения флешки и вызовы передаются в функции юзера (usirs functions).
Да тут бы без ОС разобраться... (про 1 мс возьму на заметку).
Дело в том что не появляется хардварный флаг извлечения флешки в недрах хост-контроллера. И, само собой, не генерится соответсвующие прерывание, которое за собой тянет изменение программных переменных, а уже они в свою очередь, обрабатываются в USBH_Process.
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
14.11.2014, 01:18 13
Цитата Сообщение от t000r
Дело в том что не появляется хардварный флаг извлечения флешки в недрах хост-контроллера...
Читайте внимательно даташит и проверьте инициализацию (настройку) USB. Возможно косяки в либах.
0
14.11.2014, 01:18
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2014, 01:18
Помогаю со студенческими работами здесь

Странное поведение USB мыши на STM32F105
Привет. Использую STM32_USB-Host-Device_Lib_V2.1.0. Выдрал оттуда хост для USB мыши, приделал...

странное поведение USB модемов на ga-ma770-ud3 win7.
Hi,All. У товарища после переезда на другое место жительства начался топик. Он ко мне....

Stm32f4 + HD44780 + Coocox
Здравствуйте! Совсем недавно начал осваивать Stm32f4 и столкнулся с проблемой отсутствия готовых...

STM32F4. Задержки на таймере в CooCox
Необходини задержка на 1ms. Я долгое время пользовался задержками на Systysk, как в ST-шных...

STM32F4 Float point & CooCox
Заметил странное поведение кокоса. Прописываю переменную dT ftoot dT = 0.01f; или ftoot dT =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru