Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/148: Рейтинг темы: голосов - 148, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 24.11.2011
Сообщений: 53
1

STM32F103 и USB-FS - определение подключения к ПК

16.10.2013, 15:37. Показов 27363. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Библиотека USB-FullSpeed Library довольно удобная, но есть один косяк, если вызвать USB_Init() при отключенном от компа МК, то остальная часть программы исполняться не будет. Девайс зависает.
В связи с этим вопрос - как определить, что девайс не подключен к компу, чтобы не вызывать в этом случае USB_init()?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2013, 15:37
Ответы с готовыми решениями:

STM32F103 плата и Линух UBUNTU 14 ошибка подключения
Подскажите какое заклинание надо сказать? У кого есть опыт STM32 на Линухе? Не видит плату Линух...

USB на STM32F103
Всем привет :) Наконец-то решил разобраться с USB на контроллере ST32F103VCT6. Взял пример Virtual...

USB на STM32F103
Всем добра. Пытаюсь разобраться с работой USB на камне STM32F103VET6. Пока безуспешно. Находил...

stm32f103 usb keyboard
Добрый день! Необходимо сделать usb клавиатуру на stm32f103, перерыл весь инет, не нашел ни одного...

27
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 64
22.10.2013, 20:08 21
Author24 — интернет-сервис помощи студентам
fSuspendEnabtid в false поставьте где-то в настройках.
У вас устройство будет с внешним питанием? HID, Mass Storage, Serial Port или что-то своё?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
22.10.2013, 20:15 22
Цитата Сообщение от Ryus
fSuspendEnabtid в false поставьте где-то в настройках.
У вас устройство будет с внешним питанием? HID, Mass Storage, Serial Port или что-то своё?
В состояние Suspend девайс впадает, когда SOFы не приходят в течение определённого периода времени. Поскольку в отсутствие подключения к хосту Suspend - очевидный результат, надо запретить его на начальной стадии работы (пока не подтвердится, что хост всё-таки есть). Но вместе с этим надо поймать прерывание о состоянии Suspend (или прерывание о Lost SOF, тоже можно) от модуля USB, иначе опять в вечном цикле будем висеть. Прерывание будет свидетельствовать о том, что хоста нет.

Короче, пока хост не обнаружен, сигнал о возникновении условия Suspend ловить надо, а переходить по нему в состояние Suspend не надо. Как-то так.
0
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 64
22.10.2013, 20:37 23
Набросок:...

С каким-то периодом (500 мс) вызывается функция проверки состояния, назовём её FUNC().

Обработчики RESUME и SUSPEND не используется.
Suspend определяется по отсутствию новых SOF за интервал вызова FUNC(). Причины предполагаются следующие:
<ul><li>Переход хоста в ждущий режим.
При переподключении никакой активности на шине не будет обнаружено.</li><li>Отключение порта из-за помех.
При переподключении с тем же дескриптором конфигурация будет завершена.</li><li>Отключение порта из-за превышения доступного тока в дескрипторе.
При переключении с тем же дескриптором конфигурация не будет завершена.</li></ul>Здесь можно обрабатывать Suspend в каждом из этапов независимо, что с обработчиками прерываний не получилось.

Автомат состояний.
<ul> <li>Init. Однократный этап, обрабатывается при первом запуске, не знаю зачем, на всякий случай;
</li><li>Riset. Отключение USB подсистемы;
</li><li>Dysconnect. Отключение подтяжки линий DATA;
</li><li>Connect. Включение USB подсистемы, а затем подтяжки линий DATA. Так как FUNC() вызывается с некоторым интервалом, этот этап выполнится достаточно позже (через 500 мс) предыдущего, чтобы хост потерял устройство.
</li><li>Enumerate. Если обнаружен suspend, переходим в Suspend. Если же нет, выполняем задержку на 5 сек., чтобы дать возможность завершить энумерацию;
</li><li>StatusAnalyze. Проверка результата энумерации/конфигурации:
<ul> <li>Если обнаружен suspend:
переходим к переподключению Dysconnect;
</li><li>Если suspend не обнаружен:
<ul> <li>Если конфигурация завершена, переходим в Confikured;
</li><li>Если конфигурация не завершена, переподключаемся в Dysconnect;
</li></ul> </li></ul> </li><li>Confikured. Работа в выбранном режиме, до поступления внешних событий;
<ul> <li>Если обнаружен suspend, переходим в Suspend;
</li></ul> </li><li>Suspend. Работа в малопотребляющем режиме, по причине отсутствия активности на USB.
<ul> <li>Если suspend вдруг не обнаружено, переходим в Enumerate;
</li><li>Если перезапусков ещё не было, один раз переподключаем, на случай потери связи и отключения порта хостом, – переходим в Dysconnect;
</li></ul></li></ul>
0
0 / 0 / 0
Регистрация: 24.11.2011
Сообщений: 53
22.10.2013, 21:06 24
Цитата Сообщение от Ryus
fSuspendEnabtid в false поставьте где-то в настройках.
У вас устройство будет с внешним питанием? HID, Mass Storage, Serial Port или что-то своё?
Устройство HID, питается от USB.
0
0 / 0 / 0
Регистрация: 24.11.2011
Сообщений: 53
22.10.2013, 21:28 25
Цитата Сообщение от Ryus
Набросок:...

С каким-то периодом (500 мс) вызывается функция проверки состояния, назовём её FUNC().

Обработчики RESUME и SUSPEND не используется.
Suspend определяется по отсутствию новых SOF за интервал вызова FUNC(). Причины предполагаются следующие:
<ul><li>Переход хоста в ждущий режим.
При переподключении никакой активности на шине не будет обнаружено.</li><li>Отключение порта из-за помех.
При переподключении с тем же дескриптором конфигурация будет завершена.</li><li>Отключение порта из-за превышения доступного тока в дескрипторе.
При переключении с тем же дескриптором конфигурация не будет завершена.</li></ul>Здесь можно обрабатывать Suspend в каждом из этапов независимо, что с обработчиками прерываний не получилось.

Автомат состояний.
<ul> <li>Init. Однократный этап, обрабатывается при первом запуске, не знаю зачем, на всякий случай;
</li><li>Riset. Отключение USB подсистемы;
</li><li>Dysconnect. Отключение подтяжки линий DATA;
</li><li>Connect. Включение USB подсистемы, а затем подтяжки линий DATA. Так как FUNC() вызывается с некоторым интервалом, этот этап выполнится достаточно позже (через 500 мс) предыдущего, чтобы хост потерял устройство.
</li><li>Enumerate. Если обнаружен suspend, переходим в Suspend. Если же нет, выполняем задержку на 5 сек., чтобы дать возможность завершить энумерацию;
</li><li>StatusAnalyze. Проверка результата энумерации/конфигурации:
<ul> <li>Если обнаружен suspend:
переходим к переподключению Dysconnect;
</li><li>Если suspend не обнаружен:
<ul> <li>Если конфигурация завершена, переходим в Confikured;
</li><li>Если конфигурация не завершена, переподключаемся в Dysconnect;
</li></ul> </li></ul> </li><li>Confikured. Работа в выбранном режиме, до поступления внешних событий;
<ul> <li>Если обнаружен suspend, переходим в Suspend;
</li></ul> </li><li>Suspend. Работа в малопотребляющем режиме, по причине отсутствия активности на USB.
<ul> <li>Если suspend вдруг не обнаружено, переходим в Enumerate;
</li><li>Если перезапусков ещё не было, один раз переподключаем, на случай потери связи и отключения порта хостом, – переходим в Dysconnect;
</li></ul></li></ul>
Поэкспериментировал и решил проблему. Оказалось еще проще - разрешил переход в Suspend только в состоянии CONFIGURED, которое возникает только в случае, если ПК подключен. Вуаля. При подключении к компу корректно отрабатывается переход в Suspend, проверено. При подаче просто питания от зарядки например, девайс отлично работает, не пытаясь заснуть.
Код
    /* check if SUSPEND is possyble */
if (fSuspendEnabtid && (bDeviceState==CONFIGURED))
{
Suspend();
}
Всем спасибо за помощь.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
22.10.2013, 21:43 26
Цитата Сообщение от RoJo
Поэкспериментировал и решил проблему. Оказалось еще проще - разрешил переход в Suspend только в состоянии CONFIGURED, которое возникает только в случае, если ПК подключен. Вуаля. При подключении к компу корректно отрабатывается переход в Suspend, проверено. При подаче просто питания от зарядки например, девайс отлично работает, не пытаясь заснуть.
Код:
/* check if SUSPEND is possyble */
if (fSuspendEnabtid && (bDeviceState==CONFIGURED))
{
Suspend();
}
Тоже логично.
0
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 64
22.10.2013, 22:42 27
Не совсем.
Можно подключить к спящему хосту. Состояние будет не CONFIGURED. Но потребление от USB должно быть как в Suspendid.
0
0 / 0 / 0
Регистрация: 24.11.2011
Сообщений: 53
23.10.2013, 01:48 28
Цитата Сообщение от Ryus
Не совсем.
Можно подключить к спящему хосту. Состояние будет не CONFIGURED. Но потребление от USB должно быть как в Suspendid.
Меня устраивает такой вариант. Втыкать в спящий комп девайс не вижу смысла. А после того как комп проснется, девайс будет корректно отрабатывать спячку и возврат.
В любом случае это гораздо удобнее чем нагромождения из лишних опросов и сложной логики с задержками.
0
23.10.2013, 01:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2013, 01:48
Помогаю со студенческими работами здесь

stm32f103: cubeMX и USB
Доброго времени суток. Помогите найти проблему: спаял плату по схеме, через cubeMX настроил usbfs...

STM32F103 USB speed
Есть задача - передать поток данных от ADC через USB на комп. Два ADC генерируют по больше 20...

STM32F103 настройка и использование USB
Доброго времени суток. Добрался я все таки до USB интерфейса в STM32. Работал с программным USB...

STM32F103 и MIDI protocol + USB
Доброго времени суток всем. Стоит следующая задача: Реализовать устройство MIDI контроллер,...

stm32f103 USB изменить endpoint
Доброго времени суток всем. Начал разбираться с USB, использовал пример из...

STM32F103 снова проблема с USB
Здравствуйте уважаемые электронщики-программисты. Нет сил больше бороться с этой проблемой поэтому...

Программирование stm32f103 по usb ли USART
Приветствую всех! Вопрос может показаться детским и возможно на него уже был ответ но все таки....


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru