Hier kann man sich (englisch) einlesen:
Für einen USB-Seriell-Umsetzer im Mikrocontroller und einstellbarer Baudrate muss man sich trotzdem tiefgründig mit USB beschäftigen. Fertige Chips nehmen diese Arbeit (gegen Geld) ab.
Serielles Plug&Play bedeutet, dass vom PC eine serielle Maus automatisch erkannt wird. Dieses Feature ist kaum bekannt. Es erfordert das Abhören des DTR-Zustandes und der Baudrate von 1200 Baud und 7 Datenbits. Daher ist so etwas recht komplex und niemals in Frameworks eingebaut. Wie man das Ganze dann am PC nutzbringend findet ist mir noch unbekannt.
Hingegen funktioniert das einfache Konzept bei Ultraschall-Recordern. Deswegen wurde das auch mal aufgebaut.
Undefiniert heißt, es kann alles zwischen erwartungsgemäßer Funktion und Feuer auf dem Chip passieren. Dazwischen liegen:
- Es wird 0x00 oder 0xFF gelesen
- Es wird irgendetwas geschrieben (auch beim Lesen!)
- Es wird eine Backdoor geöffnet
- Der Controller frisst eine ungewöhnliche Stromspitze
- Die CPU oder die Peripherie (bspw. der Taktgenerator!) friert ein (unmerklich kurzzeitig oder bis zum Reset)
- Die CPU springt zu einer wilden Adresse
- Flash-Speicher wird gelöscht
- Undokumentierte Fuses werden gesetzt, die zum Chipausfall führen
Möglicherweise lassen sich Daten im Dual-Port-RAM „live“ mitlesen aber das ist schlicht undokumentiert und kaum zu etwas nütze.Wenn Latenz eine Rolle spielt, müssen kleine Iso-Pakete gewählt werden, aber unter 1 ms geht (bei Full-Speed) nichts.
Das gilt prinzipiell auch für das Setup-Paket! Allerdings niemals mit NAK, schlimmstenfalls mit Schweigen (keine Antwort). Der Host probiert es dann noch zweimal und reagiert mit Fehler, wenn's dann immer noch nicht klappt, also ACK geantwortet wird. Es ist deshalb sehr wichtig, dass an Endpoint 0 immer eine OUT-FIFO im SIE-Besitz „hängt“.Bei allen anderen Endpoints darf der Zustand beliebig lange anhalten, hier hängt das Timeout-Verhalten vom Klassentreiber ab. Einige Mikrocontroller können für diesen Fall einen NAK-Interrupt generieren.
Einen Sonderfall nimmt NAK-IN ein: Mit NAK-IN (also Not-Acknowledge-Interrupt auf einer IN-Pipe) bekommt man mit, wenn der PC beginnt auf ein Gerät zu horchen. Das passiert bei Windows-USB-CDC dann, wenn die serielle Schnittstelle geöffnet wird, kann jedoch bei anderen Klassentreibern und Betriebssystemen anders gelöst sein. Bei USB-HID ist es hingegen egal ob ein Programm das Gerätetreiber-Handle hat oder nicht: Die Interrupt-Pipes werden immer abgefragt.
Beispiel: Kommen Daten byteweise tröpfelnd von einer seriellen Schnittstelle und man will sie in möglichst große USB-Happen packen, müsste man diese in die USB-FIFO stecken und (um Latenzzeiten zu vermeiden) sofort die FIFO der SIE übergeben. Kommt das nächte Byte, müsste man das nächste Byte anhängen und die Länge erhöhen. Das ist so nicht erlaubt! Obwohl es meistens funktioniert. Ganz böser Fehler! Lösungen:
Wichtig: Die USB-Geräte müssen am gleichen Host-Controller hängen. Um das sicher zu stellen, benutzt man einen USB-Hub. Bei verschiedenen Host-Controllern kann nicht sicher gesagt werden, dass die SOFs gleichzeitig kommen oder die gleiche Nummer haben. Was zu untersuchen wäre.
Achtung: Das ist aktueller Industriestandard! „Weil's koa USB hamm.“ Beim Beobachten von Crash-Tests mit mehreren Kameras und Sensoren sorgt ein Lichtblitz mit gemeinsamer Spannungsspitze auf den Dehnmessstreifen-A/D-Wandlern für die nachträgliche Synchronisierbarkeit aller High-Speed-Kameraaufnahmen mit den Messwerten. Willkommen im letzten Jahrtausend. Wenn die Pistole den Marathonlauf startet.
#define W(x) (BYTE)(x),(BYTE)((x)>>8)
L"string"
im Deskriptor,
muss man die Zeichen dennoch genau abzählen.
sizeof(char) == sizeof(int) == sizeof(wchar_t) == 1
!!
Beim ATmega32U4 kommen Resume-Interrupts ständig vorbei, solange USB aktiv ist! Daher ist es bei diesem wichtig, anhängige Interrupts zu löschen, bevor es in den Tiefschlaf geht.Da ein Mikrocontroller mit 300 µA maximaler Stromaufnahme (gemittelt) nicht allzu viel machen kann, ist das fast immer ein ruhender CPU-Taktoszillator und abgeschaltete Peripherie. Ggf. läuft nur eine Echtzeituhr weiter. Oder ein gepulster Funkempfänger, der auf einen Aufweckbefehl wartet.
Selbstversorgte Geräte sind ganz besonders dazu geeignet, Remote Wakeup zu generieren. Erlaubt ist dies jedoch nur bei vorhandenem UBUS.
Ein PC kann jedoch so konfiguriert sein (je nachdem was das BIOS kann), dass jegliches Anstecken eines USB-Gerätes (Übergang von SE0 nach J) zum Aufwecken führt. Da ist mir aber kein Exemplar bekannt.
Ein Kabel mit A-Stecker und A-Buchse, das zu einem USB-Gerät mitgeliefert wurde, ist nur zur Verwendung mit genau diesem Gerät bestimmt.
Möchte man das angewachsene, superkurze und dünne Kabel eines Hi-Speed-USB-Hubs verlängern, nimmt man dafür am besten geschirmtes CAT5+-Patchkabel und benutzt:
Ist das Kabel ungeschirmt, teilt man UBUS und Masse auf je 3 Adern auf. Damit ist der Spannungsabfall höher aber immer noch erträglich.