Die Programmierung des USB Ports
Programmierung des USB-Busses und Basteleien dafür


Einleitung

USB ist die Abkürzung für Universal Serial Bus, und wie der Name schon sagt ist es wirklich ein universeller serieller Bus.
Er ist der Nachfolger für die meisten Schnittstellen des PCs, beispielsweise für die serielle Schnittstelle (RS-232) und den Parallelport sowie PS/2 (Maus- u. Tastatur-Anschluss).
Für den Hobby-Elektroniker ist der USB-Bus attraktiv, da er den Bus auch zur Stromversorgung nutzen kann und sich um das Protokoll und Parameter wie die Geschwindigkeit wenig Gedanken machen muss.

USB im Detail

Von dem USB-Stardard wird USB mechanisch, elektrisch und logisch spezifiziert. Im Gegensatz zum Parallelport sind daher die Datenprotokolle hier schon im Standard spezifiziert. USB ist auch interruptfähig, d. h. ein Peripheriegerät kann über den Bus einen Interrupt auslösen.
Wie auch Firewire hat USB eine Stromversorgungs- und eine Massen-Ader, mit der die Peripheriegeräte mit 5 V Versorgungsspannung mit bis zu 500 mA versorgt werden können.
Eine gute Übersicht über die Pins und Modi des USB findet man unter http://de.wikipedia.org/wiki/USB
. Auf diesem in der Mitte der 90er entwickelten Bus werden die Daten differentiell über ein Aderpaar übertragen. Hierdurch können die Daten, im Gegensatz zu Firewire, das (mindestens) zwei Adernpaare verwendet, nicht gleichzeitig gesendet und empfangen werden. Dadurch verwendet USB weniger Hardware und ist entsprechend auch bei den Kabeln billiger als Alternativen wie Firewire. Dies hat, im Vergleich zu Firewire, einige Nachteile, wie sich beispielsweise an externen Festplatten sowohl bei der Performance (Latenzzeit u. Transferrate) als auch der CPU-Last zeigt. Ein weiterer Nachteil ist, dass es an einem USB-Bus nur einen Controller gibt, der den Bus verwaltet. Hierdurch können USB-Peripherie-Geräte über einen Bus nicht direkt miteinander kommunizieren und auch PCs können nicht direkt verbunden werden, während dies mit Firewire geht.
USB kann die anderen Schnittstellen (Parallelport, PS/2 usw.) auch nicht immer vollständig ersetzen, denn es dauert noch einige Zeit bis Features wie Remote Controll beim BIOS auch in USB (statt über serielle Schnittstelle) auf praktisch jedem aktuellen Mainboard realisiert sind und die Hardware ist mit USB nicht direkt ansteuerbar, sondern nur über den USB-Treiber. Hierdurch ist es beispielsweise meistens nicht oder nur eingeschränkt und mit viel Aufwand möglich die auf einem Onboard-Parallelport oder einer PCI-Parallelport-Karte laufende Software auf einen USB-Parallelport-Adapter zu portieren. Hinzu kommt die Latenzzeit, denn über einen gewöhnlichen Parallelport können die Pins mit bis zu 400 kHz geschaltet werden und Interrupts ebenso schnell eingelesen werden, aber USB ist hierbei viel langsamer und daher für harte Echtzeit weniger geeignet.
Da zum Ansteuern der USB-Hardware spezifische Treiber benötigt werden, greift die Software für die am USB angeschlossene Hardware praktisch nie direkt auf die Hardware zu, sondern verwendet die Schnittstellen zum USB-Treiber. Aus diesem Grund wird hier nur die indirekte Ansteuerung des USB behandelt.

In der Praxis gibt es mit dem USB-Bus einige Probleme, weil sich die Hersteller nicht immer an die Standards halten. Als Folge hiervon funktioniert nicht jedes USB-Gerät an jedem PC; einige Kombinationen sind einfach unverträglich. Dies Phänomen ist aber auch von anderer Hardware bekannt, beispielsweise PCI-Karten.
Ein weiteres Problem ist, dass der USB nicht sehr stabil ist und beispielsweise Kartenleser nach einigen Tagen am USB-Bus Fehler produzieren, die durch ein Reset in Form eines kurzen Absteckens und wieder Ansteckens behoben werden. Diese Fehler zeigen sind beispielsweise Schreib-Lese-Fehler und die Meldung, dass das Speichermedium nur lesbar ist, auch wenn kein Schreibschutz aktiv ist.

Ansteuerung des USB mit Software

Die USB-Hardware wird über die nötigen low-Level-Treiber angesteuert, also beispielsweise über den Treiber zum FT232BM ( http://www.ftdichip.com/Products/FT232BM.htm ), wenn dieser IC angesteuert werden soll. Hierzu stellen diese Treiber eigene Schnittstellen bereit, also beispielsweise eine virtuelle serielle Schnittstelle zum FT232BM, die ebenso angesteuert wird, wie eine reale serielle Schnittstelle, nur eben über treiber-eigenen Schnittstellen. Diese virtuelle serielle Schnittstelle findet man unter MS-Win unter COM3 oder höheren COM-Ports und unter Linux ab /dev/ttyUSB0. Für diese serielle Schnittstellen wird das benachbarte Tutorial zur seriellen Schnittstelle empfohlen.

Schnittstellen-Parameter

Weil wie beschrieben nur der low-Level-Treiber die Hardware direkt ansteuert, sind in der Regel keine USB-Schnittstellen-Parameter nötig.
Da zudem die möglichen Schnittstellen-Parameter stark von der jeweiligen USB-Hardware abhängen, wird hier auf die Dokumentation der Hardware und deren Treiber verwiesen.

Daten-Protokolle

Obwohl der Standard die Schnittstelle logisch beschreibt, muss man sich auch ein paar Gedanken um das Protokoll machen, da es meist nicht reicht, Bytes zu senden und zu empfangen. Hierzu wird auf das benachbarte Tutorial zur seriellen Schnittstelle verwiesen und auch auf Protokolle wie TCP/IP und UDP.

Strom vom USB

USB hat eine 5 V-Ader, die mit bis zu 500 mA belastet werden darf. Genau genommen sollte zwar ein Gerät nach dem Standard angeben, wieviel Strom es maximal benötigt und für viele ICs wie den FT232BM gibt es auch Programme, mit denen man diesen Wert einstellen kann, aber in der Praxis werden viele Geräte verwendet, die gar keinen IC haben, also USB nur zur Stromversorgung verwenden. Dies ist normalerweise kein Problem, da auf dem USB meist nur die 5 V aus dem Netzteil gegeben werden.
Der Hobby-Elektroniker sollte daher die USB-Kabel ausgedienter Geräte nicht einfach wegzuwerfen, sondern die gut erhaltenen noch zur Stromversorgung aufheben. Beispielsweise kann man über so ein Kabel ein Digitalmultimeter (kurz DMM) VC 820 oder VC 840 von Conrad problemlos versorgen, da das DMM nur ein paar Milliampere verbraucht und erst bei weniger als 4 V die LowBatt-Anzeige erscheint.
Hier ein Beispiel, bei dem zwei Schnellverbinder an ein USB-Kabel angeschlossen sind, isoliert mit Tesa und fixiert mit Kabelbindern:
Stromversorgung vom USB
Dabei muss man natürlich beachten, dass die DMM-Eingänge dann nicht mehr ganz frei verwendbar sind, weil sie über die Versorungsspannung an den Nullleiter gekoppelt sind.
Ausserdem sollte man einen Kurzschluss dieser Versorgungsspannung vermeiden, da hierdurch eine Leiterbahn oder eine auf das Mainboard gelötete Sicherung durchbrennen könnte.
Bei modernen USBs sollte dies nicht passieren, da sie die Verbrauchsströme messen und notfalls elektronisch abschalten, aber darauf sollte man sich nicht verlassen.
Zum Stromsparen, insbesondere bei Notebooks hat der USB auch die Möglichkeit den Strom abzuschalten.

Anbindung eigener Hardware an USB

Nach der Stromversorgung über USB kommt nun auch die datenmässige Anbindung eigener Hardware an USB. Hierfür eignet sich wohl am besten der FT232BM, denn dieser IC ist ein USB-UART-Umsetzer. Hierdurch kann man einen Mikrocontroller an den FT232BM anschliessen und mit ihm über USB kommunizieren, so wie über eine serielle Schnittstelle und einen Pegel-Wandler. Der USB-Treiber zu diesem IC ist im Linux-Kernel integriert und wird automatisch geladen. Unter MS-Win ist der Treiber mit ein paar Klicks installiert.
Durch den Treiber kann man mit dem Mikrocontroller einfach über eine serielle Schnittstelle kommunizieren, die man unter Linux ab /dev/ttyUSB0 findet und unter MS-Win ab COM3. Datenraten bis 3 MBaud sind dabei erfahrungsgemäss kein Problem, auch bei 3,3 V-Mikrocontrollern wie dem MSP430.
Allerdings ist der FT232BM ein SMD-IC, also nicht ganz so leicht verwendbar wie ein DIL-IC, aber für den geübten Hobby-Elektroniker ist das kein Problem.

Beispiel 1: Der FTDI FT232BM von www.ftdichip.com

Der FT232BM, von dem es auch die bleifreien Versionen FT232Q und FT232BL gibt, ist ein USB-UART-Umsetzer. Bis auf die Logik-Pegel, für die man (für RS232) einen Pegelwandler benötigt, ist dieser IC ein vollvertiger RS232-USB-Konverter, der aber auch allein mit RxD und TxD gut funktioniert. Hierdurch braucht man nur RxD und TxD eines Mikrocontrollers anzuschliessen, um mit ihm über USB zu kommunizieren.
Der Treiber zum FT232BM stellt eine virtuelle serielle Schnittstelle bereit, die einfach so wie eine reale angesprochen wird. Mehr dazu steht im benachbarten Tutorial zur seriellen Schnittstelle. Dort steht auch, wie man einen USB-RS232-Adapter so umbauen kann, dass man ihn direkt an einen Mikrocontroller anschliessen kann.

Wie der FT232BM genau anzuschliessen ist, hängt von der geplanten Verwendung ab. Beispielsweise ist zum Abspeichern von geänderten USB-Parametern wie der nominellen Stromaufnahme ein EEPROM nötig und bei 3,3-V-Mikrokontrollern ist eine zweite Versorgungsspannung anzuschliessen (obwohl es erfahrungsgemäss auch mit 5 V funktioniert). Deshalb wird für die Details auf die Herstellerseite verwiesen, auf der es neben dem Manual auch einen Designer Guide gibt. Zudem findet man online viele Schaltpläne mit dem FT232BM, beispielsweise bei www.olimex.com.
Trotdem hier ein Bild von einer Schaltung mit diesem IC, wobei der FT232BM in der linken Hälfte in der Mitte ist und das EEPROM etwas rechts unten, neben dem Quarz:
par_prototyp
Bild 1: Schaltung mit dem FT232BM.

Für diese SMD-Bauteile wurde eine übliche SMD-Laborkarte verwendet, aus der zwar für das EEPROM ein passendes Stück gesägt werden konnte, für den FT232BM aber 4 Stücke ausgesägt und aufgeklebt werden mussten.
Über den Spannungsregler oben rechts werden auch die 3,6 V für den MSP430 auf dem Evaluation Board rechts erzeugt.
Das Auflöten der SMD-ICs erfolgt einfach durch leichten Druck auf den IC und das vorsichtige Drücken der sauberen Lötspitze auf die Beinchen des ICs, denn das Lötzinn auf der Karte reicht zum Verbinden aus.
Mehr zum Löten von SMD-ICs findet man unter http://www.mikrocontroller.net/articles/SMD_L%f6ten.
Das Programm, mit dem man die Daten im EEPROM auslesen und ändern kann, beispielsweise die nominelle Stromaufnahme, gibt es kostenlos bei FTDI (erster Link).

Links

FTDI:
http://www.ftdichip.com/FTProducts.htm#FT232BM

Mikrocontroller allgemein:
http://www.mikrocontroller.net/articles/SMD_L%f6ten

Günstiger Hersteller von Mikrocontroller-Entwicklunsboards, bei dem es die Schalpläne und Software dazu online gibt: www.olimex.com ANSI/ISO-C:
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+9899%2D1999

Serial Programming HOWTO:
http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html

Serial Programming Guide for POSIX Operating Systems:
http://www.easysw.com/~mike/serial/serial.html

Buch "Linux-Treiber entwickeln, Eine systematische Einführung in Gerätetreiber für den Kernel 2.6, kostenlos und komplett online:
http://ezs.kr.hsnr.de/index.php?id=35&type=1

Harte Echtzeit-Erweiterung RTAI für den Linux-Kernel:
http://www.rtai.org/

Buch "I/O-Projekte für den PC", ISBN 3-89576-129-X, mit einfachen DOS/MS-Win-Treibern für viele Schnittstellen am PC.

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1158875