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?
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.
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.
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?
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
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?
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.
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).
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
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.