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
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?