Forum: Mikrocontroller und Digitale Elektronik ATMega32U4 USB: VBUS-Erkennung funktioniert nicht


von Bauteiltöter (Gast)


Angehängte Dateien:

Lesenswert?

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
(UDCON   &= ~(1<<DETACH))
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?

von Bauteiltöter (Gast)


Lesenswert?

Ich hab die Lösung: Der VBus-Pin braucht einen Widerstand nach Masse. 
Ich hab 2.2k genommen, jetzt funktioniert die Erkennung sauber.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.