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.
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:
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.
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.
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.
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.
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.
verendra
Wallace
verendra
Wallace
Wallace
verendra
Wallace
Ale..chenski