 |
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:
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:
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.
Anzeigen:
|