Kommunikation zwischen einem USB/seriellen Gerät und einem AVR (Atmega/Arduino) Mikrocontroller

Ich habe ein Gerät, das einen USB-Anschluss bietet. Wenn ich es an einen Windows-PC anschließe, wird es als "CP2103 USB to UART Bridge Controller" erkannt. Laut Gerätedokumentation sollte es im seriellen Format mit 38400 bps kommunizieren.

Ich muss mit diesem Gerät mit einem Atmega-Mikrocontroller sprechen.

Da sich die USB-Pinbelegung von der seriellen UART des uC unterscheidet, dachte ich zuerst, ich bräuchte eine Schaltung, um die Signale umzuwandeln. Ich habe das AVR-CDC-Projekt gefunden und einen CDC-232 angelegt , um USB ( GND, D+, D-, VCC) in RS232 ( TX, RX, GND) zu konvertieren:

Geben Sie hier die Bildbeschreibung ein

Um es zu machen, habe ich einen anderen atmega328 als uC verwendet, der mit dem spezifischen Hex geflasht wurde, mit einem 16-MHz-Kristall anstelle des im Diagramm angegebenen 12-MHz-Kristalls.

Dann baute ich ein weiteres Stück Schaltung, um das RS232-Signal in TTL umzuwandeln:Geben Sie hier die Bildbeschreibung ein

Die Signalwandlung sollte also USB -> RS232 -> TTL sein.

Ich habe meinen uC so programmiert, dass er einige Daten an das Gerät sendet, und ich kann das Signal mit dem Oszilloskop verfolgen, bis es in den CDC-232 eintritt, dann verliere ich es. Ich habe keinen Ausgang an den Pins 4 und 5 des CDC-232 uC, wo ich ein USB-Signal haben sollte.

Ist mein Gesamtansatz richtig? Soll ich mit dem Debuggen des CDC-232-Teils fortfahren oder ist an anderer Stelle etwas falsch?

könnten Sie ein Foto Ihres CP2103-Geräts posten?
Ich bin mir nicht 100% sicher, ob ich die Frage verstehe, aber der CP2103 ist ein USB-Gerät, das eine Verbindung zu einem USB-Host wie einem PC herstellen soll, und die Verbindung scheint zu einem AVR-Projekt zu sein, das auch als Gerät fungiert . Ich bin mir ziemlich sicher, dass ein AVR nicht als Hostgerät fungieren wird, es sei denn, ich habe etwas mit dem übersehen, was Sie erreichen möchten.

Antworten (3)

Wenn Ihr Gerät als CP2013 angezeigt wird, wenn Sie das Gerät an den USB-Anschluss eines Computers anschließen, und Sie Ihren Computer durch einen Arduino ersetzen möchten, ist dies nicht wirklich einfach oder im Allgemeinen möglich. Die Methoden, die Sie in der Frage erwähnen, müssen damit zu tun haben, dass der AVR / Arduino das Gerät ist, nicht der Host.

Das Gerät hat bereits einen integrierten USB-UART-Konverter und zeigt Ihnen nur die USB-Seite davon. Das bedeutet, dass Ihr Arduino als USB- Host fungieren muss . Die Funktion als USB-Host ist nicht einfach. Sie müssen einen USB-Host/Hub-Controller einrichten und herausfinden, wie Sie mit genügend USB-Protokollstapel umgehen, um mit dem CDC-kompatiblen USB-UART-Gerät zu kommunizieren. Die Verwendung eines USB-OTG-Host-Controllers mag geringfügig einfacher sein, ist aber noch lange nicht trivial einfach. Am besten prüfen Sie, ob Sie den CP2013 auf dem Gerät umgehen und direkt auf die UART-Leitungen zugreifen können. Dies ist möglicherweise nicht immer möglich. Wenn der CP2013 tatsächlich eine andere Hardware oder Firmware ist, die sich als CP2013 ausgibt, dann haben Sie Pech gehabt.

+1 Darauf wollte ich mit meinem Kommentar hinaus, aber das ist eine gute, klare Erklärung.
Danke, ich hatte befürchtet, dass es nicht so einfach ist. Gute Hinweise aber.
Ich markiere Ihre Antwort als richtig, obwohl die Sache nicht gelöst ist. Ich denke, ich werde einen MAX3421E oder einen FTDI VNC1L verwenden, um einen USB-Host zu implementieren, der vom avr verwaltet wird.
Vergleichen Sie die Preise des Geräts und dieser Adapter - wenn das Gerät nicht Hunderte von Dollar wert ist, würde ich hineinschauen. Wenn Sie Glück haben, gehen die Signale zum CP2103 durch oberflächenmontierte Widerstände, wodurch sie leicht abgegriffen werden können. Wenn Sie den Embedded-USB-Host-Weg wählen, vergleichen Sie die Kosten modernerer Boards mit nativer USB-Host-Funktionalität mit denen eines ATMEGA + Host-Adapters.

CP2103 ist eine USB-zu-UART-Brücke, sie spricht in TTL-Pegeln, Sie brauchen nichts extra, um damit zu kommunizieren. Sie müssen die TX-, RX- und GND-Pins des Mikrocontrollers mit den RX-, TX- und GND-Pins der CP2103-Platine verbinden. Dein Setup sollte so ablaufen:

PC --usb-- CP2103 --rx/tx-- MIKROCONTROLLER

Richten Sie Ihren Mikrocontroller so ein, dass er etwas über UART ausgibt, und Sie können es in einem seriellen Kommunikationsterminalprogramm auf Ihrem PC sehen.

Anscheinend wollen sie ATmega -> CP2103, weil es so klingt, als ob das CP2103-Ende ein Peripheriegerät ist, über das sie keine Kontrolle haben und das sie von einem AVR aus steuern möchten.
Das Gerät, mit dem ich sprechen muss, hat nur einen Mini-USB-Anschluss, sodass ich kein RX/TX habe
@etuardu, das dachte ich mir. Sehen Sie, welche anderen Antworten Sie erhalten, aber ich denke, was Chintalagiri Shashank gesagt hat, ist richtig, und was Sie erreichen möchten, liegt irgendwo zwischen sehr schwierig und unmöglich mit einem AVR.
Dies ist keine Antwort auf die gestellte Frage.

Sie müssen zuerst die cdc-Vollklasse in Ihrem Mikrocontroller programmieren,,,, vor dem Aufruf sei(), der die usbinit() aufruft, und eine weitere USB-Konfigurationsfunktion.. versuchen Sie es erneut..!

Ich entferne dies nicht als keine Antwort, es scheint ein Versuch einer Antwort zu sein, wenn auch nicht sehr klar. @morteza, könnten Sie bitte erweitern, was Sie meinen, wenn Sie sich die obigen Antworten ansehen, scheint dies weit von der Basis entfernt zu sein.
Entschuldigung, Mortezza, aber dies kann keine Antwort sein, da die Tatsache übersehen wird, dass die erforderliche USB-Host-Schnittstellenhardware fehlt - etwas, das bereits durch die akzeptierte Antwort festgestellt wurde. Bitte löschen Sie es, bevor es weitere Downvotes sammelt.