mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Betreiben über USB - Erkennung/Freischaltung High Power, Geräteklasse


Autor: Sören K. (burnersk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte über eine USB-B Buchse meinen MSP430FR6989 und Peripherie auf 
dem PCB betreiben.

Habe mich auch bereits ein wenig über USB schlau gemacht...

USB Power Spezifikation besagt für

* USB 1.0 (Low Powered Device) bringt zwischen 4,4 - 5,5 V bei maximal 
100  mA,
* USB 2.0 (High Powered Device) bringt zwischen 4,75 - 5,5 V bei maximal 
500 mA,
* USB 3.0 bringt zwischen 4,45 - 5,5 V bei maximal 900 mA.

Standardmäßig wird nur 100 mA (Low Power) geliefert. Höhere Ströme 
müssen vom USB Host Controller freigegeben werden.

USB Ladegeräte sind so designed, dass sie

* bei maximal 100 mA einen Widerstand zwischen D+ und D- von gleich oder 
größer 200 Ohm haben,
* bei mindestens 500 mA einen Widerstand zwischen D+ und D- von kleiner 
als 200 Ohm haben oder direkt kurzgeschlossen sind.

Soweit was ich zusammen getragen habe. Nun zu den Fragen...

* Wie sage ich dem USB Host Controller, dass ich ein High Powered Device 
(500 mA) bin?
* Welche Geräteklasse sollte ich bei der Freigabeanforderung gegenüber 
dem Host Controller verwenden? Die Datenleitungen werden nicht verwendet 
von der Applikation.
* Oder erfolgt das genau so wie bei den USB Ladegeräten und ich muss D+ 
und D- nur äquivalent mit Widerständen bestücken?

Autor: Boris O. (bohnsorg) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Das wird beim Enumerieren festgelegt und folglich musst du ein bisschen 
USB-Protokoll sprechen (so dass du die Geräteklasse angeben kannst). 
Einige USB-Bibliotheken (für Mikrocontroller) haben dafür Header-Dateien 
o.ä., um soetwas kompakt anzugeben. Schaust du mal V-USB o.ä. zur 
Inspiration.

Autor: Nop (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Das USB-Ladegerät ist logisch gesehen ein Host für Dein Device, weil es 
den PC "ersetzt". Eben weil man nicht nur für die Freischaltung einen 
USB-Controller in ein Ladegerät setzen will, macht man das mit dem 
Kurzschließen der Datenleitungen.

Es ist das Endgerät, was hier die Intelligenz haben soll, um zu 
ermitteln, daß es an einem USB-Ladegerät mit low/high power hängt.

Was Du jetzt willst, ist ein völlig anderer Film, weil Dein Gerät kein 
Host ist, sondern ein Device. Dementsprechend, wenn Du es richtig machen 
willst, mußt Du über USB Dich erstmal als 100mA-Gerät dranklemmen, damit 
Du überhaupt Power bekommst. Dann muß die sog. "Enumeration" (das ist 
das Google-Stichwort) abgehen, also per USB-Protokoll sagen:

"hi Host, schön daß ich 100mA schonmal kriege, aber es darf auch ein 
bißchen mehr sein. Geht das klar?"

Der Host kann dann sagen "nee laß mal, ich habe auch so schon genug 
Verbraucher zu treiben." Oder er kann sagen: "Ja, hier hast Du."

Die Crux ist, daß dieses Protokoll natürlich über die Datenleitungen 
abgeht, die Du bislang nicht verwendest. Die müßtest Du, wenn Du es 
sauber machen willst, mitsamt dem USB-Stack nur für die Enumeration 
einbauen.

In der Praxis schert sich so gut wie kein Mainboard darum, sondern so 
gut wie alle liefern auch ohne Enumeraton gleich die 500mA. Die 
Hersteller ersparen sich damit nämlich die Implementierung. Du mußt halt 
dann darauf achten, daß Du in Summe das Mainboard nicht überlastest.

Aber garantiert ist das halt nicht. Ein Ausweg ist es, das Gerät zu 
spezifizieren für den Anschluß an einen Netzadapter von 220V auf USB, 
der 500mA liefert. Der Betrieb an einem Rechner wird gar nicht erst 
garantiert.

Autor: Sören K. (burnersk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Infos ihr beiden!

Bleibt nur noch die Frage welche Geräteklasse ich angeben soll... Gibt 
es da eine, welche meinen Anwendungsfall beschreibt?

Also "ich möchte nur Strom von dir, werde sonst nicht mit dir reden" :D

Ich möchte es gerne perfekt (sauber/ordentlich/richtig) haben. Oder kann 
es Komplikationen geben, wenn ich eine Enumeration bei einem Mainboard 
absetze, welches das "scheiß egal" ist?

Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören K. schrieb:
> Bleibt nur noch die Frage welche Geräteklasse ich angeben soll... Gibt
> es da eine, welche meinen Anwendungsfall beschreibt?

0xFF = vendor specific

Autor: Sören K. (burnersk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Kann ich mich nach der Enumeration "dumm" stellen, also nicht mehr 
reagieren/interrupts behandeln, oder fliege ich dann wieder auf 100 mA 
zurück?

Autor: Clemens L. (c_l)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Abschnitt 7.1.7.6 der USB-2.0-Spezifikation sagt:
> All devices must support the Suspend state. Devices can go into the
> Suspend state from any powered state. They begin the transition to the
> Suspend state after they see a constant Idle state on their upstream
> facing bus lines for more than 3.0 ms. The device must actually be
> suspended, drawing only suspend current from the bus

Und das sind maximal 250 µA.

Wenn du es wirklich perfekt haben willst.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Clemens L. schrieb:
>> suspended, drawing only suspend current from the bus
>
> Und das sind maximal 250 µA.

Nix. Es sind 2.5 mA erlaubt, damit man z.B. eine (low current) LED 
treiben kann.

Das steht zugegeben nicht in den USB 2.0 Specs, sondern in einer ECN 
(Suspend Current ECN).

Autor: TheBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Tabelle ist falsch, USB 1.x hat bereits 100 und 500 mA erlaubt, erst 
mit USB 3.0 kam eine Änderung.

USB Ladegeräte sind ganz selten Hosts. Die meisten haben nur Widerstände 
drin mit denen das Gerät erkennen kann wie viel Strom es bekommt. 
Dummerweise gibt es dafür neben dem USB "Battery charging standard" auch 
noch ein paar inkompatible Methoden.

Das Strom-zapfende Gerät muss auch den Suspend Mode unterstützen (wie 
korrekt angemerkt wurde 2,5 mA max. seit USB 2.0). Kann anderfalls beim 
Anschluss an mobile Geräte unangenehm werden wenn das USB Teil den Akku 
leer säuft.

Wir haben dafür mal einen Chip gemacht, der speziell die 
Stromversorgungszustände signalisiert, den IO-Warrior24PV:
http://www.codemercs.com/de/io/low-speed

Autor: Jürgen Wissenwasser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte Dir dringend raten, die Enumeration mit einem FTDI-Chip 
vornehmen zu lassen, am besten das Modell FT201X 
(http://www.ftdichip.com/Support/Documents/DataShee...). 
Der kann via I2C mit deinem µC kommunizieren und hat 6 frei 
konfigurierbare Ausgänge, die Dir sofort mitteilen, ob
*) der USB-Anschluß im Suspend-Modus ist (#SLEEP)
*) der Anschluß ein Dedicated Charging Port ist (#BCD Charger)
*) der USB-Anschluß enumeriert ist (#PWREN)
*) überhaupt Spannung am USB-Anschluß ist (VBUS Sense)

FTDI hat ein eigenes kleines Programm: Man verbindet sein Gerät mit USB 
und kann mit diesem Programm den Chip konfigurieren, d.h. wie die 6 
I/O-Pins verwendet werden, außerdem die Einstellungen für den Strom, 
etc.

Praktisch alle USB-RS232-Adapter haben einen Chip von FTDI drin.

Wichtig zu erwähnen: USB hat 10ms (oder mal mehr) Latenz. Wenn also 
deine MCU nur stur Daten sendet, diese aber nicht von Deinem Programm 
abgeholt werden, gibt's einen Pufferüberlauf im FTDI-Chip.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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