Warum kann der USB-zu-Seriell-Port-Konverter den AVR-Mikrocontroller nicht programmieren?

Mit einer seriellen Schnittstelle oder einer parallelen Schnittstelle in der PC-Programmierung ist ein avr-Mikrocontroller sehr einfach und billig. Das Problem ist, dass kein moderner Computer mit einem seriellen oder parallelen Anschluss ausgestattet ist. Also, USB zu Seriell Konverter sollte die Lösung sein, aber leider nicht.

Es muss einen Unterschied zwischen der tatsächlichen seriellen Schnittstelle und der konvertierten seriellen Schnittstelle geben. Was ist es?

Eine andere verwandte Frage wäre, wie USBasp fast direkt mit dem PC kommuniziert? Ich dachte, die meisten oder alle Mikrocontroller der ATmega-Serie sind ohne USB-Unterstützung.

Ich habe diesen Link überprüft - AVR-Programmierer mit Seriell-zu-USB-Konverter

Ich weiß, dass es mehrere solcher Fragen gibt, aber da ich neu in der Embedded-Programmierung bin, brauche ich eine einfache Erklärung, um das Konzept zu verstehen. Danke.

Bearbeiten: Ich möchte eine Schaltung wie unten mit der konvertierten seriellen Schnittstelle (möglicherweise RS232) verwenden. Diese Schaltung ist für die tatsächliche serielle Schnittstelle ausgelegt. Mit einer konvertierten seriellen Schnittstelle kann ich möglicherweise eine gewisse Komplexität der Schaltung reduzieren.Schema des seriellen Programmierers

Die Details finden Sie unter Simple Serial Programmer for AVR

Viele können, wenn auch weniger als ideal. Siehe zum Beispiel arduino.stackexchange.com/questions/3361/…
Der USBasp implementiert "ungefähr" den USB-Schnittstellenstandard mit der niedrigsten Geschwindigkeit mit einem Netzwerk, das die Signale "irgendwie" zu und von GPIO-Pins koppelt, und einer übermäßig cleveren Software, die die Pin-Zustände ungefähr zum richtigen Zeitpunkt liest oder schreibt.

Antworten (3)

Der von Ihnen verwendete serielle Programmierer verwendet eine serielle Schnittstelle, um eine Verbindung zum Computer herzustellen, jedoch nicht das Standard-RS232-Protokoll! Schauen Sie sich den Schaltplan genauer an:

  • Pin 4 (DTR) ist MOSI zugeordnet. Auf einem echten seriellen Motherboard-Port kann dieser Pin hoch und niedrig umgeschaltet werden, wodurch ein Bitbang-Modus emuliert wird
  • Pin 6 (DSR) und 7 (RTS) sind SCK zugeordnet. Als DTR kann RTS entweder hoch oder niedrig eingestellt werden, wodurch zusammen mit DTR die Softwareimplementierung von benutzerdefinierten synchronen seriellen Protokollen ermöglicht wird
  • Pin 8 (CTS) ist ein MOSI zugewiesener Eingangspin. Sein Wert wird beim SCK-Toggle gelesen.

DTR und RTS sind die einzigen Pins der seriellen Schnittstelle, die bitbanged werden können. Aber es besteht die Notwendigkeit für ein Reset-Signal. Der Designer dieses Adapters bedient sich eines Tricks. Er sendet ein 0x00-Zeichen ohne Stoppbits über Standard-RS232-TX und erzeugt so einen kurzen Reset-Impuls (der für einige MCUs invertiert werden muss).

Die eigentlichen Daten einer standardmäßigen seriellen RS232-Kommunikation werden tatsächlich nur über Rx/Tx-Leitungen gesendet. Alle anderen sind Hilfsleitungen, die von Geräten verwendet werden, um verschiedene Betriebszustände oder die Verfügbarkeit von Daten oder die Beendigung der Übertragung zu signalisieren.

Das ist das Problem bei USB-Seriell-Adaptern. Die meisten von ihnen können nur Rx/Tx-Leitungen und natürlich nur das serielle RS232-Protokoll (asynchron) verwenden, das auf keinen Fall mit dem AVR-Programmierprotokoll (SPI, synchron) kompatibel ist. Die einzige Möglichkeit, über die serielle Schnittstelle von SPI zu kommunizieren, besteht also darin, alternative Leitungen zu verwenden und das Protokoll in Software zu emulieren.

Sie können in diesem Forum sehen , dass es in einigen Fällen mit USB-Seriell-Adaptern funktioniert, aber in den meisten Situationen nicht.

Ich dachte, die meisten oder alle Mikrocontroller der ATmega-Serie sind ohne USB-Unterstützung.

Was sagen Sie zu: ATmega 8U2, 16U2, 16U4, 32U2, AT90USB1286, AT90USB1287, AT90USB162, AT90USB646, AT90USB647, AT90USB82. Vollständige Liste von hier .

Aber USBasp verwendet keine dieser MCUs! Wenn wir uns das Schema ansehen, können wir sehen, dass es einen Pull-up-Widerstand auf der D-Leitung verwendet, was bedeutet, dass es dem PC signalisiert, dass es sich um ein Gerät mit niedriger Geschwindigkeit (1,5 Mb/s) handelt. Und die Software emuliert den USB-Bus über einen I/O-Port für allgemeine Verwendung (kann in der AVR-Firmware-Quellcodedatei eingesehen werden usbconfig.h):

#define USB_CFG_IOPORTNAME      B
/* This is the port where the USB bus is connected. When you configure it to
 * "B", the registers PORTB, PINB and DDRB will be used.
 */
#define USB_CFG_DMINUS_BIT      0
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */
#define USB_CFG_DPLUS_BIT       1
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 * This may be any bit in the port. Please note that D+ must also be connected
 * to interrupt pin INT0!
 */
#define USB_CFG_CLOCK_KHZ 12000
/* Clock rate of the AVR in MHz. Legal values are 12000, 16000 or 16500.
 * The 16.5 MHz version of the code requires no crystal, it tolerates +/- 1%
 * deviation from the nominal frequency. All other rates require a precision
 * of 2000 ppm and thus a crystal!
 * Default if not specified: 12 MHz
 */
Hey Mann, du kannst deinen Kommentar löschen, da du die Antwort aktualisiert hast und es richtig ist. Ich werde meine in Kürze löschen, da die Kommentare dazu jetzt irrelevant sind
@Cornelius Ich bin nur neugierig; Ich verwende einen Teensy mit der "Benito" -Skizze und er erstellt eine serielle Verbindung über USB und verbindet dann seinen UART-Port, der einfach Hardware-seriell auf TTL-Ebene ist. Also verwende ich RS232 auch nicht (der Teensy hat es nicht an Bord). Also dachte ich, ich sollte stattdessen ein serielles USB-Kabel verwenden können und bin über diesen Thread gestolpert. Kannst du das bitte klären? Danke!
@JulianF.Weinert Sie können USB-zu-Seriell-Konverter für das Standard-RS232-UART-Protokoll verwenden. Es sollte keine Rolle spielen, ob das serielle Gerät einen hardware- oder softwareemulierten Port verwendet, solange es das Standardprotokoll unterstützt.
@ Cornelius sicher. Vielleicht habe ich mich hier etwas unklar ausgedrückt. Die Implementierung verschiebt tatsächlich nur jedes empfangene Bit aus der seriellen Schnittstelle. Ich sehe keinen Hinweis auf RS232. Was genau würde mir sagen, ob ich "echte RS232" oder eine beliebige Serie mache?

Ein paar spontane Gedanken aus bitterer Erfahrung:

  • Verwenden Sie nur FTDI USB-Seriell-Konverter, sie sind bei weitem die zuverlässigsten und am besten konfigurierbaren und am besten unterstützten. Andere können gut funktionieren, aber es ist eine Lotterie und das Leben ist zu kurz für fehlerhafte Hardware.

  • Überprüfen Sie, ob die "serielle" Ausgabe des Chips tatsächlich das ist, was Sie wirklich wollen; Konverter können je nach Konverter vollständige serielle RS232-, TTL- (0-5 V) oder serielle 0-3v3-Daten und manchmal RS485/RS422 ausgeben.

  • Wie bereits erwähnt, gibt es andere Einstellungen wie Start-/Stoppbits, Parität, Pufferung, Bit-Bang-Modi usw. usw., die Probleme verursachen können.

Das Puffern im USB-Seriell-Chip oder -Treiber kann insbesondere Probleme verursachen, wenn die Programmiersoftware versucht, bestimmte Zeitverzögerungen beim Programmieren auszuführen. Mit FTDI-Treibern können Sie all diese Dinge ändern.

Die Empfehlung für FTDI-Chips wäre richtig gewesen, als sie geschrieben wurde, aber seit FTDI damit begonnen hat, Treiber herauszubringen, die nicht originale Chips bauen, und viele Leute, die FTDI-Adapter kaufen, nicht wissen, ob ihr Chip echt ist, ist der Kauf von FTDI jetzt die riskantere Option. Ganz zu schweigen davon, dass einige dies als Grund sehen könnten, dieses Unternehmen nicht zu unterstützen.
@an Herrn. Das sind jetzt ziemlich alte Nachrichten, und FTDI hat so viel Gegenreaktion davon bekommen, dass sie es wahrscheinlich nicht noch einmal versuchen werden. Es ändert auch nichts an der zugrunde liegenden Wahrheit, dass ihre Geräte in Bezug auf Zuverlässigkeit und Kompatibilität immer noch die besten sind. Für kommerzielle Projekte ist es immer noch ein Kinderspiel, echte FTDI-Chips zu kaufen.
Zuletzt habe ich gehört, dass sie sich vom Bricking zurückgezogen haben, aber weiterhin die Treiber auf ihnen funktionsunfähig machen. Und sie haben das Mauern nie vollständig anerkannt. Wenn sich diese Situation geändert hat, wäre das gut.
Und noch einmal - für ein kommerzielles Produkt oder alles, was Ihnen wirklich wichtig ist, um richtig zu funktionieren, ist es kein Problem, wenn Sie echte FTDI-Chips von einem seriösen Anbieter kaufen.

Um solche Geräte programmieren zu können, muss der SERIAL-Port möglicherweise so konfiguriert werden, dass er im Bitbang-Modus arbeitet. Die meisten USB <-> Seriell-Konverter bieten diese Fähigkeit nicht.

Abhängig vom Typ des USB <-> SERIAL-Konverters können Sie ihn möglicherweise "konfigurieren", um einen solchen Modus zu ermöglichen.

www.ftdichip.com/Documents/AppNotes/AN232B-01_BitBang.pdf

Die FT232BM- und FT245BM-Chips können in einem speziellen Modus eingerichtet werden, in dem die normale Funktion der Chips ersetzt wird. Dieser Modus ändert die 8 Datenleitungen auf dem FT245BM oder die RS232-Daten- und Steuerleitungen des FT232BM auf einen bidirektionalen 8-Bit- Bus. Der Zweck dieses Modus war die Verwendung zum Programmieren von FPGA-Geräten. Es kann auch verwendet werden, um mit seriellen EEPPROMs zu kommunizieren oder einen Datenlatch zu laden.

Das macht keinen Sinn. Die meisten "echten" seriellen Ports haben keinen "Bitbang-Modus". Denkst du an Parallelports?
@DaveTweed - Die meisten echten seriellen Ports ermöglichen das Drehen der Steuerleitungen mit geringerer Latenz (und möglicherweise besserer Koordination mit dem Zustand der Datenleitungen) als USB-vermittelte. Viele serielle USB-Geräte können das wahrscheinlich, nur langsamer. Einige bieten jedoch spezielle Bitbang/GPIO-Modi (sie sind schließlich typischerweise Mikrocontroller mit spezieller Firmware).
@Dave Tweed Die FT232BM- und FT245BM-Chips können in einem speziellen Modus eingerichtet werden, in dem die normale Funktion der Chips ersetzt wird. Dieser Modus ändert die 8 Datenleitungen auf dem FT245BM oder die RS232-Daten- und Steuerleitungen des FT232BM auf einen bidirektionalen 8-Bit-Bus. Der Zweck dieses Modus war die Verwendung zum Programmieren von FPGA-Geräten. Es kann auch verwendet werden, um mit seriellen EEPPROMs zu kommunizieren oder einen Datenlatch zu laden. AUCH. bitwizard.nl/wiki/index.php/FTDI_ATmega Bitte vor dem Downvoting prüfen.
@Naib: Du hast die Frage falsch verstanden. Das OP fragt, warum die Programmierung mit "echten" seriellen Schnittstellen funktioniert, aber NICHT mit USB-zu-Seriell-Konvertern. Ich bin mir bewusst, dass einige USB-zu-Seriell-Konverter einen Hochgeschwindigkeits-Präzisions-„Bit-Bang“-Betriebsmodus unterstützen.
@Cornelius: Das habe ich nicht gesagt. Ich sagte, dass "echte" serielle Ports die Tx- und Rx-Datenleitungen nicht wie einige USB-zu-seriell-Konverter mit Big-Bang schlagen können.
@DaveTweed - tatsächlich sieht es so aus, als ob man einen 16450/16550 SOUT-Pin steuern kann, indem man keine UART-Daten sendet, sondern das BREAK-Bit für ein SPACE und das Loopback-Modus-Bit für eine MARK verwendet. Das zusammen mit zwei Schreibstatuszeilen und einer Lesestatuszeile würde es tun. Auf jeden Fall ist bekannt, dass Leute ATmega ISP mit "echten" seriellen Ports gemacht haben. Und mit einigen USB-Seriell-Konvertern ist es auch auf andere Weise möglich . Unklar bleibt, ob es möglich ist, sie langsam zu manipulieren, indem man serielle APIs anstelle von speziellen Modi verwendet.
@DaveTweed "echte" serielle Ports können nahe kommen: vivara.net/blog/?p=24
@markrages - das ist süß, aber nicht besonders relevant. Das Senden von PWM-Daten basierend auf der Anzahl aktiver Bits in einem Wort bedeutet in keiner Weise, dass man die perfekt geordnete Sequenzierung mehrerer Signale erfüllen kann, die von einem synchronen seriellen Peripheriegerät benötigt wird. Was stattdessen benötigt wird, ist eine Möglichkeit, den Zustand eines Signals festzulegen und ihn zu verlassen , während ein anderes manipuliert wird, und ein UART bietet dies nicht, wenn er im Standardmodus arbeitet . Viele Teile können jedoch im Alternativ-/Testmodus sein.