Arduino und USB, wie funktioniert es?

Nach dem Kauf eines Arduino-Boards (UNO) entschied ich mich, die Arduino IDE nicht zu verwenden, da ihr einige Funktionen fehlten und alle Bibliotheken in C++ geschrieben sind. Ich codiere mit C. Eine Sache, die ich wirklich vermisse, ist eine serielle Schnittstelle, die es meinem Arduino ermöglicht, mit dem PC zu kommunizieren, an den es angeschlossen ist.

Bisher bin ich mit dem SPI-Protokoll vertraut und dachte daran, USB-SPI-Konverter-Chips zu verwenden, aber da ich USB bereits auf der Platine implementiert habe, entschied ich mich, Informationen darüber zu suchen, wie es gemacht wird und woraus USB besteht.

Bisher habe ich festgestellt, dass es UART ist, der mit einem Chip auf der Arduino-Platine spricht, und dieser Chip ist für die Kommunikation mit dem PC verantwortlich.

Aber kann mir jemand erklären, was eigentlich auf diesem Board passiert? Und weisen Sie mich bitte in die richtige Richtung.

Antworten (2)

Auf "normalen" Arduino-Boards wie dem Uno wird der serielle UART des AVR-Mikrocontrollers zur Kommunikation mit einem PC verwendet.

Da moderne PCs in der Regel keine seriellen Anschlüsse mehr haben, wurden der 9-polige serielle Anschluss und die Pegelumsetzer, die auf den frühesten Arduino-Boards zu finden sind, schon lange durch einen integrierten USB<>Serial-Bridge-Chip ersetzt. Ursprünglich war dies ein FT232R, aber vom Uno war es eine andere Atmel-MCU wie der ATmega8u2 oder 16u2, auf der eine Firmware mit ähnlicher Funktionalität ausgeführt wird.

Im Wesentlichen muss der Hardware-UART des Arduino-Hauptprozessors so konfiguriert sein, dass er Debug-Meldungen ausgibt oder Daten mit einer gewählten Baudrate programmiert, wobei eine asynchrone serielle Signalisierung auf Logikebene verwendet wird. Wenn der USB-Anschluss mit einem Computer verbunden ist, auf dem entsprechende CDC-ACM-Treiber ausgeführt werden, wird der USB-Bridge-Chip angewiesen, die empfangenen Daten zu stapeln und an den Host-Computer weiterzuleiten, wo sie von seriellen APIs beansprucht werden können, als ob sie von einem kämen traditionelle serielle Schnittstelle.

Um in die andere Richtung zu kommunizieren, sendet ein Programm auf dem PC Daten über serielle APIs, diese werden in USB-Pakete zusammengefasst und an den Bridge-Chip gesendet, der sie in asynchrone serielle Daten umwandelt und sie an die Haupt-MCU sendet. Ein Programm, das auf dem Arduino selbst läuft, müsste geschrieben werden, um diese Daten vom UART zu sammeln, typischerweise unter Verwendung von Interrupts (oder optional häufigem Abfragen) und dann zu interpretieren.

Der auf dem Arduino verwendete Bootloader führt diese beiden Operationen in seinem eigenen Namen aus, während er läuft – kurz nach jedem Zurücksetzen, länger, wenn er Datenverkehr sieht, der mit einem Bootloader zusammenhängt. Diese Fähigkeit ist jedoch für das Hauptprogramm (auch bekannt als "Skizze") irrelevant, das die Logik neu implementieren muss, um mit dem UART selbst zu interagieren. Beachten Sie, dass Sie den Arduino-Bootloader verwenden können, ohne die IDE zu verwenden oder Programme im Arduino-Stil zu schreiben.

Wenn Sie sich online umsehen, finden Sie wahrscheinlich viele Codebeispiele für die Verwendung des ATmega UART in einem C-Programm im Vergleich zu einem C++- oder Arduino-Programm.

Einige andere Arduino-Boards funktionieren anders; Zum Beispiel verwendet der Leonardo einen ATmega32u4-Chip als Hauptprozessor, der direkt USB sprechen kann. In diesem Fall ist keine zusätzliche Brücke erforderlich. Aber anstelle einer einfachen UART-Konfiguration muss das Programm auf der Haupt-MCU jetzt eine viel komplexere Logik für den Umgang mit der USB-Hardware selbst enthalten, einschließlich Interrupts, die ziemlich häufig ausgeführt werden müssen. Dies ist in einem Projekt von Grund auf viel schwieriger zu implementieren, bedeutet jedoch eine geringere Anzahl von Teilen und etwas mehr Flexibilität, da der USB-Anschluss für Zwecke verwendet werden kann, die über das Kanalisieren eines virtuellen seriellen Streams hinausgehen.

Nicht FT2232, sondern FT232R.
In der Tat, das war ein Gehirn-Finger-Fehler meinerseits. Ich glaube, dass der ft232rl verwendet wurde, während der ft2232 der ausgefallene Chip ist, der sowohl für Dinge wie jtag als auch für seriell geeignet ist.
Einige Klone haben CH430 für den Schnittstellenchip.

Wie in einer anderen Antwort erwähnt , wird auf dem UNO-Board eine USB-zu-Seriell-Port-Konvertierung durchgeführt.

Auf dem Mikrocontroller ist auch ein Bootloader- Programm installiert. Die Möglichkeit, den UNO-Mikrocontroller über die serielle Schnittstelle zu programmieren, hängt zu 100 % von einem Bootloader ab. Wenn während der Programmierentwicklung etwas mit diesem Bootloader passiert, müssen Sie den Bootloader neu auf den Chip laden. Dies erfolgt mit einem seriellen In-Circuit-Programmierer (ICSP), der an einen der 0,1-Zoll-Header-Anschlüsse des UNO angeschlossen wird.

Wenn Sie auf die von Ihnen beschriebene Weise entwickeln möchten, würde ich empfehlen, einen ICSP zum Programmieren zu kaufen und zu verwenden und nur die Kommunikation über die serielle Schnittstelle direkt zu programmieren. Die Seriell-zu-USB-Konvertierung wird transparent von der integrierten Hardware gehandhabt.

Ihr Vorschlag lautet also: Um das Bootloader-Programm auf Arduino nicht zu beschädigen, verwende ich besser ein anderes Gerät (auch bekannt als Programmierer), um meine seriellen Sachen zu erledigen?
Fast das Gegenteil. Wenn der Bootloader korrekt installiert ist, verhindert er, dass er sich während des Flashens des Hauptprogramms selbst beschädigt. Aber wenn Sie ISP verwenden, um etwas neu zu laden, wird der Bootloader zu 100% garantiert gelöscht, da ISP nur den gesamten Chip löschen kann. Sobald Sie ISP verwenden, müssen Sie ihn erneut verwenden, um den Bootloader wiederherzustellen, wenn Sie ihn jemals verwenden möchten. Beachten Sie, dass Sie einen anderen Arduino verwenden können, auf dem die ISP-Skizze als ISP-Adapter ausgeführt wird, falls Sie vorübergehend einen benötigen. Der Bootloader ist für Bare-Metal-C ebenso geeignet wie für Arduino-Sketches.
Für den Zugriff auf den Bootload-Bereich des Flashs wird ein Programmer benötigt. Ihre Skizze in C oder C++ hat keinen Zugriff auf die Aufrufe zum Überschreiben des Bootload-Bereichs. Sie benötigen einen speziellen Bootloader, der die erforderlichen Aufrufe als Funktion im Bootload-Bereich eingerichtet hat, die der Sketch aufrufen kann, damit von der seriellen Schnittstelle eingehende Daten in den Bootload-Bereich geschrieben werden können.
So schlecht die Arduino IDE auch ist, wenn Sie ein oder zwei Stunden mit Mikrocontrollern verbringen und einige ihrer seriellen Beispiele aus dem Dropdown-Menü ausprobieren, könnte Ihnen das einen ersten Eindruck davon vermitteln, was die Hardware leisten kann, bevor Sie zu Bare-Metal-C wechseln Programme und Serial.begin (9600); serial.println ("Hallo Welt"); wird zu ein paar Dutzend Zeilen hardwareorientierten Codes.
@ChrisStratton Ich habe UART und SPI bereits implementiert und bisher funktioniert es. aber eine sehr einfache Implementierung. Ich möchte den Bootloader loswerden, da es nicht mein Code ist, der auf meinem Gerät läuft. Eine andere Frage, die sich im Moment stellt, ist der Code innerhalb von Atmega8, der die USB-Verbindung handhabt. warum es als COM-Port auf meinem PC angezeigt wird. Ist es möglich, diesen Chip zu ICPS?