Как понять, что USB-соединение потеряно

Я работаю с контроллером AT90USB1287 с USB-связью с ПК. Я отправляю некоторые команды с ПК на контроллер, используя связь USB, чтобы активировать какой-то управляемый переключатель. Я могу изменить состояние переключателя, отправив команды (ВКЛ и ВЫКЛ, переключатель, управляемый напряжением).

Моя проблема заключается в том, что когда переключатель включен, и, к сожалению, пользователь забыл отправить команду OFF с ПК, и он выключил компьютер, но контроллер все еще работает, или предположим, что если я потерял соединение с ПК через USB, в это время это вызывает проблемы.

Я хочу проверить сам код контроллера ATUSB1287, если соединение USB ослабло, тогда команда swith t должна быть равна нулю.

Может ли кто-нибудь помочь мне, как узнать, что USB-соединение потеряно или нет? это мой подход, например, можно ли в основном цикле проверить, что USB-соединение потеряно? если потеряно, то выключите.

Есть ли другой способ выключить? после потери связи с ПК или выключения ПК.

Я новичок в этом типе вещей, если что-то не так в этом вопросе, пожалуйста, извините меня.

Ответы (5)

На странице 258 таблицы данных :

• 0 – VBUS: Флаг VBus
. Значение, считанное из этого бита, указывает состояние вывода VBUS. Этот бит можно использовать в режиме устройства для контроля состояния подключения приложения к шине USB. См. Раздел 22.10, стр. 255 для более подробной информации.

На странице 255:

22.10 Обнаружение
подключаемого модуля USB-соединение обнаруживается панелью VBUS благодаря следующей архитектуре:
введите описание изображения здесь
Логика управления панели VBUS выдает сигнал относительно уровня напряжения VBUS:
• Сигнал «Session_valid» активен при высоком уровне напряжения, когда напряжение включено . контактная площадка VBUS выше или равна 1,4 В. Если ниже 1,4 В, сигнал не активен
. • Сигнал «Vbus_valid» активен при высоком уровне, когда напряжение на контактной площадке VBUS выше или равно 4,4 В. Если напряжение ниже 4,4 В, сигнал не активен
. • Бит состояния VBUS устанавливается, когда VBUS больше, чем «Vbus_ valid». Бит состояния VBUS сбрасывается, когда значение VBUS падает ниже «Session_valid» (поведение с гистерезисом)
• Флаг VBUSTI устанавливается каждый раз при изменении состояния бита VBUS.

Не уверен, что это то, что вы ищете, но решил, что все равно опубликую это.

Большое спасибо за ваш ответ, я обнаружил, что это решит мою проблему, но у меня есть вопрос, даже когда мой компьютер находится в спящем режиме, USB питается от батареи. так что в то время он не в состоянии выключить переключатель.
Как вы отправляете команды? Вы написали на своем компьютере приложение, которое взаимодействует с микроконтроллером или с HyperTerminal или чем-то подобным?
Я разработал пользовательский интерфейс на С#, я отправляю команды из интерфейса и получаю ответ от контроллера.
Я бы пошел на Programers.stackexchange и спросил, есть ли способ на С# определить, находится ли компьютер в спящем режиме. Если это так, то у меня был бы интерфейс, который вы разработали для автоматической отправки команды выключения, когда «sleep_mode == true».
Еще одна проблема, с которой вы, как я вижу, сталкиваетесь, заключается в том, что вы закрываете приложение C#, не выключая переключатель. Возможно, вам придется убедиться, что приложение отправляет команду «выключить» «onExit».
У меня есть еще одно сомнение. Если я потеряю USB-соединение, микроконтроллер перестанет работать или будет продолжать работать до тех пор, пока не отключится питание, независимо от USB-соединения.
Конденсатор или батарейка для часов могут быть использованы для питания контроллера, достаточного для замыкания переключателя.
Большинство хостов ПК будут поддерживать VBUS, даже если операционная система выключена. Так что смотреть VBUS не выход. -1

Вполне вероятно, что решение, которое лучше всего будет соответствовать вашим требованиям, будет заключаться в том, чтобы искать, когда перестают происходить события кадра USB в 1 мс. В вашем коде USB должна быть соответствующая логика для обработки этих событий, которые вы могли бы сбросить таймером потери кадра. Если этот таймер истечет, вы знаете, что ПК больше не управляет активно USB, даже если VBUS все еще присутствует.

@Chirs Stratton Спасибо за ваш ответ, но я новичок в программировании контроллеров, я не мог четко понять концепцию, если я прав, мне нужен таймер, чтобы проверить потерянное событие USB-фрейма или нет. Не так ли? если нет, можете ли вы дать некоторую информацию об этом?

как узнать потеряно usb соединение или нет?

Посмотрите в мануале вашего микроконтроллера, там должна быть информация как отловить событие USB Suspend. Это событие происходит, когда хост вообще перестает связываться с устройством более чем на 3 мс — не отправляя даже кадровых событий. Предполагается, что USB-устройства в этом состоянии снижают свой USB-ток.

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

У меня есть еще одно сомнение. Если я потеряю USB-соединение, микроконтроллер перестанет работать или будет работать до тех пор, пока не отключится питание, независимо от USB-соединения.
Это единственный правильный ответ на запрос ОП.
Чтобы убедиться, что хост действительно ушел, устройство может попытаться ВОЗОБНОВИТЬ связь. Если нет ответа, то хост действительно мертв.

Если вы используете инфраструктуру LUFA для управления USB-связью, вы можете использовать событие EVENT_USB_Device_Disconnect() для обнаружения физического отключения кабеля (так же, как указал Уоллес при обнаружении VBUS).

Ответ Криса Стрэттона также поддерживается в среде LUFA через EVENT_USB_Device_StartOfFrame(), который принимается каждые 1 мс и может использоваться для обнаружения действительного соединения на уровне протокола. Просто сбрасывайте таймер каждый раз, когда срабатывает событие, и проверяйте, не переполняется ли таймер когда-либо — если да, то ваше устройство физически подключено, но не обменивается данными.

Вы можете узнать больше об этих событиях в LUFA из документации здесь: LUFA USB Events

Если вы запускаете собственную реализацию, из исходного кода LUFA и примеров для AVR можно многому научиться.

Не относящийся к USB способ заключается в том, чтобы контроллер время от времени опрашивал ПК и ожидал подтверждения. После N запросов без подтверждения контроллер может предположить, что связь потеряна.

Можете ли вы дать мне более четкое представление о том, как это сделать, не специфичный для USB способ, я думаю, без проверки USB-подключения. Как это сделать, можете привести пример.
@verendra, это решение, которое я бы использовал - некоторые ПК оставляют включенным питание при выключении, и это также проверяет, работает ли ваше программное обеспечение. Он просто имеет в виду, что помимо команд, которые у вас уже есть, добавьте новую, например, вы отправляете OK?ее на ПК, и ваше приложение отвечает YES. Если вы какое-то время не получаете ответа, вы знаете, что что-то не так (или компьютер выключен), и вы можете отключить вывод через некоторое время.
@PeterJ Здесь я отправляю команды с ПК (интерфейс C#) на контроллер, и контроллер отвечает на эти команды. С вашей точки зрения, мне нужно отправить команду из контроллера? не с ПК? не так ли?
@verendra, да, верно. Ответ, только что опубликованный Крисом Страттоном, является еще одним хорошим ответом, если вам также не нужно проверять, работает ли ваше программное обеспечение в порядке.
@verendra: Под «не специфичным для USB» я имел в виду, что этот метод не требует каких-либо специальных функций протокола USB или оборудования USB. Может работать с любым каналом связи - RS-232, Ethernet, WiFi; вам не нужно знать или заботиться. На самом деле, разве это не похоже на то, что мы делаем устно, когда у нас плохой мобильный телефон? И да, в этом случае контроллер будет спрашивать, а ПК будет отвечать.
@JRobert У меня есть еще одно сомнение. Если я потеряю USB-соединение, микроконтроллер перестанет работать или будет продолжать работать до тех пор, пока не отключится питание, независимо от USB-соединения.
Да, если контроллер может потерять питание, он не сможет выключить ваше устройство. Если это проблема, вам понадобится резервный источник питания или источник бесперебойного питания, который, по крайней мере, будет поддерживать работу контроллера достаточно долго, чтобы выполнить отключение.
@JRobert Если у меня есть источник бесперебойного питания для контроллера, даже если я потерял USB-соединение, я смогу выключить свое устройство? Потому что мне нужно переключить мое устройство с помощью связи SPI.
Предположительно, да, если у вас еще достаточно энергии, чтобы выключить его. Однако это относительно легко сделать на аппаратном уровне.