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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bauteiltöter (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.