Woher weiß ich, dass die USB-Verbindung unterbrochen ist?

Ich arbeite mit dem Controller AT90USB1287 mit USB-Kommunikation zum PC. Ich sende einige Befehle vom PC an den Controller über die USB-Kommunikation, um einen gesteuerten Schalter zu aktivieren. Ich kann die Schalterzustände ändern, indem ich Befehle sende (EIN und AUS, spannungsgesteuerter Schalter).

Mein Problem ist, wenn der Schalter eingeschaltet ist und der Benutzer leider vergessen hat, den AUS-Befehl vom PC zu senden, und er den PC heruntergefahren hat, aber der Controller immer noch läuft, oder wenn ich annehme, dass ich die PC-Verbindung über USB verloren habe. Zu diesem Zeitpunkt verursacht es Probleme.

Ich möchte den ATUSB1287-Controller-Code selbst überprüfen, wenn die USB-Verbindung gelöst ist, sollte der Befehl swicth t Null sein.

Kann mir jemand helfen, woher ich weiß, ob die USB-Verbindung unterbrochen ist oder nicht? Dies ist mein Ansatz, wie ist es möglich, in der Hauptschleife zu überprüfen, ob die USB-Verbindung unterbrochen ist? wenn verloren dann abschalten.

Andere Möglichkeiten zum Abschalten? nach Verlust der Verbindung zum PC oder Herunterfahren des PCs.

Ich bin neu in dieser Art von Dingen, wenn irgendetwas in dieser Frage falsch ist, entschuldigen Sie mich bitte.

Antworten (5)

Auf Seite 258 des Datenblatts :

• 0 – VBUS: VBus-Flag
Der von diesem Bit gelesene Wert zeigt den Zustand des VBUS-Pins an. Dieses Bit kann im Gerätemodus verwendet werden, um den Verbindungsstatus des USB-Busses der Anwendung zu überwachen. Siehe Abschnitt 22.10, Seite 255 für weitere Details.

Auf Seite 255:

22.10 Plug-In-Erkennung
Die USB-Verbindung wird vom VBUS-Pad dank der folgenden Architektur erkannt:
Geben Sie hier die Bildbeschreibung ein
Die Steuerlogik des VBUS-Pad gibt ein Signal bezüglich des VBUS-Spannungspegels aus:
• Das „Session_valid“-Signal ist aktiv hoch, wenn die Spannung eingeschaltet ist das VBUS-Pad ist höher oder gleich 1,4 V. Wenn es niedriger als 1,4 V ist, ist das Signal nicht aktiv.
• Das „Vbus_valid“-Signal ist aktiv hoch, wenn die Spannung am VBUS-Pad größer oder gleich 4,4 V ist. Bei weniger als 4,4 V ist das Signal nicht aktiv.
• Das VBUS-Statusbit wird gesetzt, wenn VBUS größer als „Vbus_valid“ ist. Das VBUS-Statusbit wird gelöscht, wenn VBUS unter „Session_valid“ fällt (Hystereseverhalten)
• Das VBUSTI-Flag wird jedes Mal gesetzt, wenn sich der VBUS-Bitzustand ändert

Ich bin mir nicht sicher, ob das das ist, wonach Sie suchen, aber ich dachte, ich würde es trotzdem posten.

Vielen Dank für Ihre Antwort. Ich habe festgestellt, dass dies mein Problem lösen wird, aber ich habe eine Frage, selbst wenn sich mein PC im Ruhemodus befindet und USB über die Batterie mit Strom versorgt wird. also zu diesem Zeitpunkt ist es nicht möglich, den Schalter auszuschalten.
Wie sendest du Befehle? Haben Sie eine Anwendung auf Ihrem Computer geschrieben, die mit dem Mikrocontroller kommuniziert, oder ist es mit HyperTerminal oder ähnlichem?
Ich habe die Benutzeroberfläche in C# entworfen, ich sende die Befehle von der Schnittstelle und erhalte die Antwort vom Controller.
Ich würde zu programers.stackexchange gehen und fragen, ob es in C# eine Möglichkeit gibt, festzustellen, ob sich der Computer im Energiesparmodus befindet. Wenn ja, dann hätte ich die von Ihnen entworfene Schnittstelle, um den Ausschaltbefehl automatisch zu senden, wenn "sleep_mode == true".
Ein weiteres Problem, auf das Sie stoßen, ist, wenn Sie die C#-App schließen, ohne den Schalter auszuschalten. Möglicherweise müssen Sie sicherstellen, dass die App den "Aus"-Befehl "onExit" sendet.
Ich habe noch einen Zweifel. Wenn ich die USB-Verbindung verliere, funktioniert der Mikrocontroller nicht mehr oder funktioniert weiter, bis der Strom ohne Abhängigkeit von der USB-Verbindung ausfällt.
Ein Kondensator oder eine Uhrenbatterie könnte möglicherweise verwendet werden, um die Steuerung lange genug mit Strom zu versorgen, um den Schalter zu schließen.
Die meisten PC-Hosts behalten VBUS bei, selbst wenn das Betriebssystem heruntergefahren wird. VBUS zu beobachten ist also keine Lösung. -1

Es ist wahrscheinlich, dass die Lösung, die Ihren Anforderungen am besten entspricht, darin besteht, zu suchen, wann die 1-ms-USB-Frame-Ereignisse nicht mehr auftreten. Ihr USB-Code sollte eine entsprechende Logik für die Behandlung dieser Ereignisse enthalten, die Sie möglicherweise für einen Verlust des Frame-Timers zurückgesetzt haben. Wenn dieser Timer abläuft, wissen Sie, dass der PC den USB nicht mehr aktiv verwaltet, selbst wenn VBUS noch vorhanden ist.

@Chirs Stratton Vielen Dank für Ihre Antwort, aber ich bin neu in der Controller-Programmierung. Ich konnte das Konzept nicht klar verstehen. Wenn ich Recht habe, brauche ich einen Timer, um zu überprüfen, ob das USB-Frame-Ereignis verloren gegangen ist oder nicht. Ist es nicht? wenn nein kannst du da ein paar infos geben?

Woher weiß ich, dass die USB-Verbindung unterbrochen ist oder nicht?

Schauen Sie in das Handbuch Ihres Mikrocontrollers, dort sollten Informationen zum Abfangen des USB-Suspend-Ereignisses enthalten sein. Dieses Ereignis tritt auf, wenn der Host die Kommunikation mit dem Gerät für mehr als 3 ms vollständig unterbricht und nicht einmal Frame-Ereignisse sendet. Die USB-Geräte sollen in diesem Zustand ihren USB-Strom senken.

Beachten Sie, dass dies nicht hilfreich ist, falls der Treiber oder das Steuerprogramm einfach beendet wird, z. B. durch den Task-Manager. Das USB-Frame-Ereignis wird weiterhin jede Millisekunde gesendet.

Ich habe noch einen Zweifel. Wenn ich die USB-Verbindung verliere, funktioniert der Mikrocontroller nicht mehr oder funktioniert, bis der Strom ohne Abhängigkeit von der USB-Verbindung ausfällt.
Dies ist die einzig richtige Antwort auf die Anfrage von OP.
Um sicherzustellen, dass der Host wirklich weg ist, kann das Gerät versuchen, die Verbindung WIEDERHERZUSTELLEN. Wenn keine Antwort erfolgt, ist der Host wirklich tot.

Wenn Sie das LUFA-Framework zum Verwalten der USB-Kommunikation verwenden, können Sie das Ereignis EVENT_USB_Device_Disconnect() verwenden, um die physische Trennung des Kabels zu erkennen (dasselbe wie die VBUS-Erkennung, auf die Wallace hingewiesen hat).

Die Antwort von Chris Stratton wird auch im LUFA-Framework über EVENT_USB_Device_StartOfFrame() unterstützt, das alle 1 ms empfangen wird, und kann verwendet werden, um eine gültige Verbindung auf Protokollebene zu erkennen. Setzen Sie einfach jedes Mal einen Timer zurück, wenn das Ereignis ausgelöst wird, und überprüfen Sie, ob der Timer jemals überläuft – wenn ja, dann ist Ihr Gerät physisch verbunden, kommuniziert aber nicht.

Mehr über diese Veranstaltungen in der LUFA erfahren Sie über die Dokumentation hier: LUFA USB Events

Wenn Sie Ihre eigene Implementierung durchführen, können Sie viel aus dem LUFA-Quellcode und den Beispielen für AVR lernen.

Ein nicht USB-spezifischer Weg wäre, dass der Controller gelegentlich den PC abfragt und eine Bestätigung erwartet. Nach N Abfragen ohne Quittierung kann die Steuerung davon ausgehen, dass die Kommunikation verloren gegangen ist.

Können Sie mir eine klarere Vorstellung davon geben, wie das geht, bedeutet nicht USB-spezifischer Weg, denke ich, ohne USB-Verbindungsprüfung. Wie das geht, können Sie ein Beispiel geben.
@verendra, dies ist die Lösung, die ich verwenden würde - einige PCs lassen beim Herunterfahren Strom an und dies überprüft auch, ob Ihre Software funktioniert. Er meint nur, abgesehen von den Befehlen, die Sie bereits haben, fügen Sie einen neuen hinzu, den Sie OK?an den PC senden, und Ihre App antwortet YES. Wenn Sie für eine Weile keine Antwort erhalten, wissen Sie, dass etwas nicht stimmt (oder der PC heruntergefahren ist) und Sie können die Ausgabe nach einer Weile ausschalten.
@PeterJ Hier sende ich Befehle vom PC (c#-Schnittstelle) an den Controller und der Controller antwortet auf diese Befehle. Aus Ihrer Sicht muss ich Befehle vom Controller senden? nicht vom PC? nicht wahr?
@verendra, ja das stimmt. Die Antwort, die Chris Stratton gerade gepostet hat, ist eine weitere gute, auch wenn Sie nicht überprüfen müssen, ob Ihre Software auch in Ordnung ist.
@verendra: Mit "nicht USB-spezifisch" meinte ich, dass die Technik keine besonderen Merkmale des USB-Protokolls oder der USB-Hardware erfordert. Es könnte mit jeder Art von Kommunikationskanal funktionieren - RS-232, Ethernet, WiFi; Sie müssten es nicht wissen oder sich darum kümmern. Ist das nicht genau das, was wir verbal machen, wenn wir eine schlechte Handyverbindung haben? Und ja, in diesem Fall würde der Controller fragen und der PC antworten.
@JRobert Ich habe noch einen Zweifel. Wenn ich die USB-Verbindung verloren habe, funktioniert der Mikrocontroller nicht mehr oder funktioniert weiter, bis der Strom ohne Abhängigkeit von der USB-Verbindung ausfällt.
Ja, wenn es möglich ist, dass die Stromversorgung des Controllers unterbrochen wird, kann er Ihr Gerät nicht ausschalten. Wenn dies ein Problem darstellt, benötigen Sie ein Backup oder eine unterbrechungsfreie Stromversorgung, die den Controller zumindest lange genug laufen lässt, um das Abschalten durchzuführen.
@JRobert Wenn ich den Controller unterbrechungsfrei mit Strom versorgen kann, auch wenn ich die USB-Verbindung verloren habe, kann ich dann mein Gerät ausschalten? Weil ich mein Gerät über SPI-Kommunikation ausschalten muss.
Vermutlich ja, wenn man noch genug Strom hat, um es auszuschalten. Dies ist jedoch relativ einfach in Hardware zu bewerkstelligen.