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


von Sören K. (burnersk)


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?

von Boris O. (bohnsorg) Benutzerseite


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.

von Nop (Gast)


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.

von Sören K. (burnersk)


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?

von Clemens L. (c_l)


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

von Sören K. (burnersk)


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?

von Clemens L. (c_l)


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.

von Jim M. (turboj)


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).

von TheBug (Gast)


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

von Jürgen Wissenwasser (Gast)


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/DataSheets/ICs/DS_FT201X.pdf). 
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.

von Martin F. (martin_f23)


Lesenswert?

Sören K. schrieb:
> 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.

Wenn man ein USB-2.0 Gerät ist und HighPower Bedarf meldet, kann ein 
USB3.0 Port dann entsprechend seiner Spezifikation 900mA liefern oder 
wird der Strom dennoch auf 500mA begrenzt?

von Thomas Z. (usbman)


Lesenswert?

Martin F. schrieb:
> Wenn man ein USB-2.0 Gerät ist und HighPower Bedarf meldet, kann ein
> USB3.0 Port dann entsprechend seiner Spezifikation 900mA liefern oder
> wird der Strom dennoch auf 500mA begrenzt?

Ein USB2 Gerät kann per Definition nur max 500mA ziehen, sonst ist es 
nicht spec konform. Der Strom wird im Device Descriptor in 2mA Schritten 
eingestellt.
Hat der Host nicht genügend Strom zur Verfügung verweigert er die Enum 
und stellt damit automatisch nur noch 100mA bereit. Sowas könnte z.B. 
bei einem buspowered Hub passieren.
Fast alles was man so kaufen kann kümmert sich darum aber nicht (*). Die 
Chance ist gross das  du die vollen 900mA ziehen kannst ohne dass eine 
Fehlermeldung kommt.

Die alten Apple Tastaturen mit dem eingebauten Hub sind da eine 
Ausnahme.

von Εrnst B. (ernst)


Lesenswert?

Thomas Z. schrieb:
> Der Strom wird im Device Descriptor in 2mA Schritten
> eingestellt.

Bei den USB3-Deskriptoren m.W. in 8mA-Schritten, damit dort das eine 
Byte auch ausreicht.

Thomas Z. schrieb:
> Hat der Host nicht genügend Strom zur Verfügung verweigert er die Enum
> und stellt damit automatisch nur noch 100mA bereit.

Alternativ: Der Geräte-Descriptor könnte mehrere Configurations 
enthalten, die unterschiedlichen Stromverbrauch angeben. Der Host kann 
dann eine passende auswählen.

Thomas Z. schrieb:
> Die
> Chance ist gross das  du die vollen 900mA ziehen kannst ohne dass eine
> Fehlermeldung kommt.

das stimmt. Hubs mit Stromüberwachung oder "perPortPowerSwitching", also 
per Software an- und abschaltbaren Downstream-Ports sind schwer zu 
finden. Und das obwohl es da eigentlich schöne all-in-one ICs 'für 
gäbe...

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.