Gast
#6508280
Guten Abend, ich entwickle gerade ein kleines Board mit einem ATmega32U4. Der ATmega32U4 ist nach Datenblatt in der "Self powered"-Konfiguration beschaltet (siehe Datenblattauszug im Anhang), der AVR läuft im Moment mit ~4V. Ich implementiere die CDC-Klasse als virtuellen Comport, zu meiner Überraschung hat das auch ohne größere Probleme funktioniert. Das Gerät meldet sich als /dev/ttyACM0 und die Kommunikation funktioniert in beide Richtungen. Leider bin ich jetzt etwas unerwartet bei einer eigentlich simplen Aufgabe auf Probleme gestoßen. Ich will das Bit "VBUS" im Register USBSTA benutzen um zu erkennen ob ein USB-Host an mein Gerät angeschlossen ist. Das Datenblatt sagt dazu: >The control logic of the VBUS pad outputs a signal regarding the VBUS voltage level: > * The “Session_valid” signal is active high when the voltage on the VBUS pad is higher or equal to 1.4V. If lower than 1.4V, the signal is not active > * The VBUS status bit is set when “Session_valid” signal is active (VBUS > 1.4V) > * The VBUSTI flag is set each time the VBUS state changes > * The USB peripheral cannot attach to the bus while VBUS bit is not set > ... > Bit 0 – VBUS: VBus FlagThe value read from this bit indicates the state of the VBUS pin. This bit can be used in device mode to monitor the USB bus connection state of the application Damit das ganze Funktioniert muss noch das Bit OTGPADE im Register USBCON gesetzt werden: > Bit 4 – OTGPADE: VBUS Pad EnableSet to enable the VBUS pad. Clear to disable the VBUS pad.Note that this bit can be set/cleared even if USBE=0. That allows the VBUS detection even if the USB macro is disable. Zuerst habe ich den ganzen USB-Stack weggelassen und nur mit diesem beiden Bits gespielt, damit funktioniert die "5V vom Host liegen an"-Erkennung. Stecker ran -> der AVR macht eine LED (GPIO) an. Stecker ab -> der AVR macht die LED mit etwas Verzögerung wieder aus. Hier messe ich auch am VBUS-Pin des AVRs 5V (Host connected) oder 0V (kein Host da) Jetzt kommt das Problem: Das ganze Funktioniert nicht wenn ich den USB-Stack aktiviere. Der AVR erkennt zwar noch wenn ich den Host verbinde (VBus springt auf 5V). Dann initialisiert meine Software den USB-Stack und baut die Kommunikation auf. Trenne ich jetzt jedoch die Verbindung zum Host bleibt das VBUS-Bit in USBSTA auf 1. Jetzt kann ich am VBus-Pin auch 2.5V messen. Die 2.5V liegen natürlich über den 1.4V die das Datenblatt als "high"-Wert betrachtet (siehe Zitat oben). Jetzt frag ich mich: Wo kommen diese 2.5V her? Ich hab das ganze bis zur Zeile
1 | |
verfolgt. Kommentiere ich diese Zeile aus, dann funktioniert die Erkennung (aber natürlich USB selber nicht mehr) Laut Datenblatt schaltet das die Pullups auf D+ / D- an, das sollte ja eigentlich keinen Unterschied für meinen VBus-Pin machen? Im Anhang findet sich noch die Innenbeschaltung des VBus-Pins. Da erkennt man, dass sich ein Spannungsteiler zwischen VCC und GND befindet. Der könnte natürlich diese 2.5V erzeugen, aber wie soll die Erkennung dann jemals funktionieren? Mein Weg das VBUS-Bit zu lesen kann auch nicht so falsch sein, ich habe im Atmel-Beispiel das gleiche Vorgehen gefunden. Hat jemand diese Erkennung schonmal erfolgreich in Betrieb genommen?

