Können Sie einen Mikrocontroller so programmieren, dass er eine Uart-zu-USB-Brücke ist?

So wie es scheint, sind uart und USB nur zwei verschiedene Arten der digitalen Kommunikation. Wenn Sie also einen Mikrocontroller so programmieren, dass er uart über ein paar io-Pins akzeptiert und USB an ein paar anderen Pins ausgibt, könnten Sie einen uart erstellen zu usb bridge ohne etwas zu kaufen. So ähnlich wie das Übersetzen von Sprachen. So funktioniert es? Übersehe ich etwas? Ich verwende ein pic16f84a.

Ja, aber nicht, wenn Ihr Mikrocontroller ein PIC16 ist. Es hat nicht die richtige Hardware für USB.
Das ist so, als würde man sagen, weil ein Skateboard Räder hat und ein Abschleppwagen Räder hat, kann ich mit meinem Skateboard ein Auto ziehen. Der uart und der USB sind dedizierte Logikblöcke innerhalb des Chips, die Pins sind nur Möglichkeiten, von außen zu ihnen zu gelangen, es ist keine generische E / A, mit der Sie alles machen können. Entweder hat Ihr Chip die Hardware oder nicht. mcus mit usb haben oft einen separaten uart an separaten Pins, und Sie können diesen Chip als USB-zu-uart-Brücke mit der richtigen Software verwenden und die Geschwindigkeitsbegrenzungen des uart beim Verschieben von Daten verstehen
Sie stellen ständig USB-Fragen für einen Chip, der USB nicht unterstützt, besorgen Sie sich einfach einen anderen Chip, es gibt Tausende von Optionen für einen oder fünf Dollar ... Sie müssen dieses tote Pferd nicht weiter schlagen, indem Sie dieselben Fragen stellen und immer wieder.
Die Fragen sind eigentlich alle etwas anders. Ich versuche, genau zu sein, und ich hatte andere Ideen, wie man es machen könnte, die in den anderen Fragen nicht behandelt wurden. Außerdem habe ich buchstäblich nicht das Geld, um einen anderen Chip zu kaufen.

Antworten (2)

Jeder USB-zu-UART-Brücken-IC, den Sie auf dem Markt sehen, ist bereits eine MCU mit dauerhaft festgeschriebener Firmware (möglicherweise in Flash oder ROM). Diese haben typischerweise auch einen dedizierten UART- und USB-Peripherieblock auf dem Chip. Die Verwendung reiner Software zur Implementierung von UARTs und des USB-Line-Level-Protokolls schränkt die Geschwindigkeitsmöglichkeiten stark ein und wäre im Allgemeinen nicht praktikabel.

Viele der moderneren MCUs, die USB-Controller-Peripheriegeräte an Bord haben, verfügen über verfügbare App-Hinweise und Referenzcodes, die zeigen, wie eine USB-UART-Brücke aufgebaut wird. In einigen Fällen wird dies einfach Teil einer viel größeren Anwendung, die auf der MCU ausgeführt wird. Insbesondere wenn Sie über eine 200-MHz-32-Bit-MCU verfügen, ist dies sehr praktisch, um zusätzlich zur Bridge-Funktionalität sogar ein RTOS und die Aufgabenverarbeitung für eine Anwendung zu unterstützen.

Hinweis: Eine MCU, die auf diese Weise als Brücke arbeitet, wird als Gerät der USB-CDC-Klasse bezeichnet.

Wäre es immer noch langsam, wenn ich den gesamten Mikrocontroller der Konvertierung von uart in USB widmen würde und einen zweiten Mikrocontroller hätte, um meine andere Programmierung auszuführen?
@ user11937382 Ein dedizierter PIC16 IST nicht genug, wenn Sie danach fragen. Heimwerken ist ein schwierigeres Projekt als das, was Ihr eigentliches Projekt ist. Selbst die leistungsstärksten Mikrocontroller versuchen nicht, natives USB zu bitbangen. Sie verwenden ihr USB-Peripheriegerät.
Ist pic16 nicht schnell genug? Oder hat es nicht genug Speicher, um das Ganze zu halten?
@ user11937382 - Ich weiß nicht, wie schnell Ihr PIC16 ist, aber meiner Erfahrung nach, wenn Sie versuchen, ein bisschen UART-Senden und -Empfangen in Software zu machen, indem Sie nur GPIO-Pins verwenden, wenn Sie mit einer Frequenz von beispielsweise 16 -> 25 MHz laufen, werden Sie feststellen, dass die Baudrate begrenzt ist bei etwa 1200 Baud oder so. USB ist um ein Vielfaches schneller, also überhaupt nicht praktisch, selbst wenn Sie versuchen, sich auf die alte USB1.1-Geschwindigkeitsspezifikation zu beschränken.
@ user11937382 Viel, viel, viel leistungsstärkere Prozessoren sind dafür nicht schnell genug. Sie haben möglicherweise genug Speicher, aber nicht genug Geschwindigkeit. Dem PIC16 fehlt es hoffnungslos, beklagenswert, völlig an Geschwindigkeit und Speicher für diese Aufgabe. USB ist überall, aber das bedeutet nicht, dass es einfach ist. Es ist sehr, sehr kompliziert. Sie könnten ein Profi sein und immer noch nicht annähernd genug wissen, um zu versuchen, das zu versuchen, was Sie vorschlagen.
Gibt es eine andere Möglichkeit für einen Mikrocontroller, mit einem Computer zu kommunizieren? Ich habe ein v-usb-Programm gesehen, aber das funktioniert anscheinend nicht mit pic.
Gibt es eine Möglichkeit, USB-Protokolle zu deaktivieren und den USB-Anschluss als normalen seriellen Anschluss zu verwenden?
Ich würde definitiv nicht zustimmen, dass JEDE Brücke eine MCU ist, ich würde zustimmen, dass mcus mit USB- und UART-Fähigkeiten möglicherweise wie eine Brücke fungieren kann, aber es gibt keinen Grund, Logik zu verschwenden, um eine vollwertige MCU für eine dedizierte USB-zu-UART-Brücke herzustellen .

Wenn Sie einfach einen Mikrocontroller so programmieren, dass er UART über ein paar IO-Pins akzeptiert und USB in ein paar anderen Pins ausgibt, können Sie eine UART-zu-USB-Brücke erstellen, ohne etwas zu kaufen. So ähnlich wie das Übersetzen von Sprachen. So funktioniert es?

Nicht wirklich. Aus hochtheoretischer Informatiksicht, aus einer Sicht von 20.000 Fuß, mag es so aussehen. In Wirklichkeit ist es jedoch ganz anders.

Der UART ist ein primitives serielles Übertragungsprotokoll, START+Acht-Bit-Umschalten+STOP, keine Strukturen, Adressen, Datenkorrektur oder Bestätigung. Gesendet und hoffen, dass andere Empfänger es abfangen. Es wird höchstens ein LF zurückerwartet. Aber man kann es ein "UART-Paket" nennen.

Der Basis-USB muss einem strengen Protokoll für den Austausch hochstrukturierter Daten folgen, die in "Paketen" angeordnet sind. USB-Pakete haben SYNC, Packet ID, DATA, CRC und EOP. Die PID-DATA+CRC sind auf spezielle Weise codiert, um ein ausgeglichenes +-Signal aufrechtzuerhalten und zu vermeiden, dass die Datenleitungen im Gegensatz zu UART zu lange in einem Zustand bleiben. Classic USB verwendet NRZI-Codierung mit "Bit Stuffing".

Der Paketaustausch erfordert eine bestimmte Reihenfolge, die als "Transaktion" bezeichnet wird, die normalerweise die SETUP-Phase mit ADDRESS und DATA-Phase umfasst, und das USB-Gerät muss mit einem Paket antworten, das die Korrektheit der empfangenen Daten bestätigt. Typischerweise sind also drei einzelne Pakete für eine "Transaktion" erforderlich.

Dann werden die USB-Transaktionen in "Übertragungen" angeordnet, die SETUP, DATA (möglicherweise viele DATEN-Pakete) und Bestätigungspakete für jede DATEN in beide Richtungen umfassen. Es gibt auch CONTROL-Übertragungen, die eine SETUP-Phase, eine DATA-Phase und eine STATUS-Phase aufweisen, sodass eine typische Steuerungsübertragung (um einige Parameter vom Gerät einzustellen oder abzurufen) 9 einzelne USB-Pakete mit jeweils einer SYNC-PID/ADDRESS-CRC_EOP-Struktur benötigt.

Darüber hinaus sind Antworten auf eingehende Pakete zeitlich auf weniger als 1,7 us Antwortzeit begrenzt, sodass nicht viele MCUs in der Lage sind, ein Paket zu decodieren, seine Prüfsumme zu überprüfen und unter 2 Mikrosekunden zurückzuantworten. Daher ist die Unterstützung des USB-Protokolls in der Regel in Hardware implementiert, zumindest die zeitkritischen Teile. Dies wird als USB SIE - Serial Interface Engine bezeichnet. Während die Reihenfolge und Generierung von Übertragungen in der Verantwortung von USB HOST liegt und nicht Ihre Angelegenheit ist, müssen Geräte die SIE-Regeln befolgen, alle Pakete dekodieren und rechtzeitig richtig reagieren.

Ein USB-Gerät wird nach einem als „Enumeration“ bezeichneten Prozess funktionsfähig, der das Lesen von Gerätefunktionen und Funktionszwecken (auch als „Gerätedeskriptoren“ bezeichnet), das Empfangen einer individuellen USB-Adresse und das Auswählen/Initialisieren der „Gerätekonfiguration“ umfasst. Diese Aufzählung erfordert normalerweise ein Dutzend Steuerübertragungen und muss erfolgen, bevor eine Brücke zwischen USB-DATEN und UART-DATEN hergestellt werden kann.

Angesichts dieses kurzen "Crush" -Kurses in USB entscheiden Sie nun, ob Sie dieses SIE ("usb in ein paar andere Pins ausgeben") in Ihrem PIC16-Mikrocontroller implementieren können.