Cómo saber si se perdió la conexión USB

Estoy trabajando con el controlador AT90USB1287 con comunicación USB a PC. Estoy enviando algunos comandos desde la PC al controlador mediante comunicación USB para activar algún interruptor controlado. Puedo cambiar los estados del interruptor enviando comandos (ENCENDIDO y APAGADO, interruptor controlado por voltaje).

Mi problema es cuando el interruptor está ENCENDIDO y, lamentablemente, el usuario olvidó enviar el comando APAGADO desde la PC y apagó la PC, pero el controlador sigue funcionando o supongo que si perdí la conexión de la PC a través de USB, en ese momento está causando problemas.

Quiero verificar el código del controlador ATUSB1287 en sí mismo si la conexión USB se perdió, entonces el comando swicth t debe ser cero.

¿Alguien puede ayudarme a saber cómo se pierde la conexión USB o no? este es mi enfoque, ¿es posible verificar en el bucle principal que se perdió la conexión usb? si se pierde, apague.

¿Alguna otra forma de desconectar? después de perder la conexión a la PC o apagar la PC.

Soy nuevo en este tipo de cosas, si hay algo mal en esta pregunta, disculpe.

Respuestas (5)

En la página 258 de la hoja de datos :

• 0 – VBUS: bandera VBus
El valor leído de este bit indica el estado del pin VBUS. Este bit se puede usar en el modo de dispositivo para monitorear el estado de conexión del bus USB de la aplicación. Consulte la Sección 22.10, página 255 para obtener más detalles.

En la página 255:

22.10 Detección de plug-in
La conexión USB es detectada por el pad VBUS, gracias a la siguiente arquitectura:
ingrese la descripción de la imagen aquí
La lógica de control del pad VBUS emite una señal con respecto al nivel de voltaje
VBUS: • La señal "Session_valid" está activa alta cuando el voltaje está encendido. la almohadilla VBUS es mayor o igual a 1.4V. Si es inferior a 1,4 V, la señal no está activa
• La señal "Vbus_valid" está activa alta cuando el voltaje en el pad VBUS es superior o igual a 4,4 V. Si es inferior a 4,4 V, la señal no está activa
• El bit de estado de VBUS se establece cuando VBUS es superior a “Vbus_ válido”. El bit de estado VBUS se borra cuando VBUS cae por debajo de “Session_valid” (comportamiento de histéresis)
• El indicador VBUSTI se establece cada vez que cambia el estado del bit VBUS

No estoy seguro de si esto es lo que estás buscando, pero pensé que lo publicaría de todos modos.

Muchas gracias por su respuesta, descubrí que esto resolverá mi problema, pero tengo una pregunta incluso cuando mi PC está en modo de suspensión, entonces el USB se alimenta a través de la batería. entonces en ese momento no se apaga el interruptor.
¿Cómo estás enviando comandos? ¿Ha escrito una aplicación en su computadora que se comunica con el microcontrolador o es con HyperTerminal o algo similar?
Diseñé la interfaz de usuario en C#, envío los comandos desde la interfaz y recibo la respuesta del controlador.
Iría a programmers.stackexchange y preguntaría si había una forma, en C#, de determinar si la computadora está en modo de suspensión. Si es así, tendría la interfaz que diseñó para enviar automáticamente el comando de apagado cuando "sleep_mode == true".
Otro problema con el que puedo verte es si cierras la aplicación C# sin apagar el interruptor. Es posible que deba asegurarse de que la aplicación envíe el comando "off" "onExit".
Tengo una duda más. Si pierdo la conexión USB, el microcontrolador dejará de funcionar o seguirá funcionando hasta que se corte la energía sin depender de la conexión USB.
Se podría usar un condensador o una batería de reloj para alimentar el controlador el tiempo suficiente para cerrar el interruptor.
La mayoría de los hosts de PC mantendrán VBUS incluso si el sistema operativo está apagado. Entonces ver VBUS no es una solución. -1

Es probable que la solución que mejor se adapte a sus requisitos sea buscar cuándo dejan de ocurrir los eventos de marco USB de 1 ms. Debe haber una lógica relacionada en su código USB para manejar estos eventos, que podría haber reiniciado un temporizador de pérdida de cuadro. Si ese temporizador logra expirar, sabrá que la PC ya no está administrando activamente el USB, incluso si VBUS todavía está presente.

@Chirs Stratton Gracias por su respuesta, pero soy nuevo en la programación de controladores, no pude entender el concepto claramente, si tengo razón, necesito un temporizador para verificar si el evento del marco USB se perdió o no. ¿no es así? si no, ¿puedes dar alguna información al respecto?

¿Cómo saber si la conexión USB se ha perdido o no?

Busque en el manual de su microcontrolador, debe haber información sobre cómo capturar el evento de suspensión de USB. Este evento ocurre cuando el host deja de comunicarse con el dispositivo por más de 3 ms, sin enviar ni siquiera eventos de trama. Se supone que los dispositivos USB reducen su corriente USB en este estado.

Tenga en cuenta que esto no será útil en caso de que el controlador o el programa de control simplemente se elimine, por ejemplo, por el administrador de tareas. El evento del marco USB aún se enviará cada milisegundo.

Tengo una duda más. Si pierdo la conexión USB, el microcontrolador dejará de funcionar o seguirá funcionando hasta que se corte la energía sin depender de la conexión USB.
Esta es la única respuesta correcta a la consulta de OP.
Para asegurarse de que el host realmente se haya ido, el dispositivo puede intentar REANUDAR el enlace. Si no hay respuesta, entonces el host está realmente muerto.

Si está utilizando el marco LUFA para administrar la comunicación USB, entonces puede usar el evento EVENT_USB_Device_Disconnect() para detectar la desconexión física del cable (lo mismo que señaló Wallace para la detección de VBUS).

La respuesta de Chris Stratton también es compatible con el marco LUFA, a través de EVENT_USB_Device_StartOfFrame() que se recibe cada 1 mS y se puede usar para detectar una conexión de nivel de protocolo válida. Simplemente restablezca un temporizador cada vez que se active el evento y verifique si el temporizador alguna vez se desborda; si es así, entonces su dispositivo está conectado físicamente, pero no se comunica.

Puede obtener más información sobre estos eventos en LUFA a través de la documentación aquí: Eventos USB de LUFA

Si está implementando su propia implementación, hay mucho que aprender del código fuente de LUFA y ejemplos para AVR.

Una forma no específica de USB sería que el controlador consultara ocasionalmente a la PC y esperara un reconocimiento. Después de N consultas sin acuse de recibo, el controlador puede suponer que se ha perdido la comunicación.

¿Puede darme una idea más clara de cómo hacerlo? Una forma no específica de USB significa que creo que sin verificación de conexión USB. ¿Cómo hacer esto puede usted dar algún ejemplo.
@verendra, esta es la solución que usaría: algunas PC dejan la energía aplicada cuando se apagan y esto también verifica que su software esté funcionando. Simplemente quiere decir, aparte de los comandos que ya tiene, agregue uno nuevo como lo envía OK?a la PC y su aplicación responde YES. Si no obtiene una respuesta durante un tiempo, sabe que algo está mal (o la PC se apaga) y puede apagar la salida después de un tiempo.
@PeterJ Aquí estoy enviando comandos desde la PC (interfaz c #) al controlador y el controlador responde a esos comandos. Desde su punto de vista, ¿necesito enviar un comando desde el controlador? no de pc? ¿no es así?
@verendra, sí, así es. La respuesta que Chris Stratton acaba de publicar es otra buena también si no necesita verificar que su software también esté funcionando correctamente.
@verendra: Por "no específico de USB", quise decir que la técnica no requiere ninguna característica especial del protocolo USB o hardware USB. Podría funcionar con cualquier tipo de canal de comunicación: RS-232, Ethernet, WiFi; no necesitarías saberlo ni preocuparte. De hecho, ¿no es eso lo que hacemos verbalmente cuando tenemos una conexión de teléfono celular de mierda? Y sí, en este caso, el controlador estaría preguntando y la PC estaría respondiendo.
@JRobert Tengo una duda más. Si pierdo la conexión USB, el microcontrolador dejará de funcionar o seguirá funcionando hasta que se corte la energía sin depender de la conexión USB.
Sí, si es posible que el controlador pierda energía, entonces no podrá apagar su dispositivo. Si eso es un problema, necesitará una fuente de alimentación ininterrumpida o de respaldo que al menos mantendrá el controlador funcionando el tiempo suficiente para realizar el apagado.
@JRobert Si tengo una fuente de alimentación ininterrumpida para el controlador, incluso si perdí la conexión USB, ¿podré apagar mi dispositivo? Porque necesito cambiar mi dispositivo usando comunicación SPI.
Presumiblemente, sí, si todavía tiene suficiente energía para apagarlo. Sin embargo, eso es relativamente fácil de hacer en hardware.