UART-Signal ist "gerundet"

Ich versuche, einen UART-Treiber für den STM32F405 zu debuggen. Ab einer bestimmten Baudrate (ca. 50 kBd) funktioniert es nicht. Ich habe es an einen Logikanalysator mit Analogfunktion angeschlossen und gesehen, dass das Signal gerundet ist; Es dauert einige Zeit, bis das Signal ansteigt. Es scheint, dass das Signal bei höheren Baudraten nicht hoch genug ansteigt, um gelesen zu werden.

Wie kann ich zulassen, dass der UART mit höheren Geschwindigkeiten funktioniert? Ich bin mir nicht sicher, ob dies ein Hardwareproblem ist oder ob es in der Software behoben werden kann.

Screenshot des Logikanalysators, MCU, der mit 38400 Baud sendet.Ein Screenshot des Saleae Logic-Programms, das zeigt, dass das serielle Signal langsam ansteigt und nicht ganz den gleichen Pegel wie längere Signale erreicht

Screenshot des Logikanalysators, MCU sendet mit 115200 Baud.Ein Screenshot des Saleae Logic-Programms, das zeigt, dass das serielle Signal langsam ansteigt, wobei die Spitzen nicht annähernd so hoch wie der volle Signalpegel sind.

Mehr Details:

  • Ich lese die serielle Verbindung mit einem FTDI-Chip, der mit meinem Desktop verbunden ist.
  • Ich habe diese Verbindung mit einem Saleae Logic 8 geschnüffelt, das an die gleichen Leitungen wie der FTDI angeschlossen ist.
  • In den gezeigten Screenshots sendet das Board "testing" über die Seriennummer.
  • Die MCU ist Teil eines OpenPilot Revolution Flight Controllers.
Handelt es sich um einen Open-Drain-Ausgang? Es sieht so aus, mit zu hohem (oder fehlendem) Pullup-Widerstand
@BrianDrummond Bedeuten Sie, dass das OP sein IO falsch konfiguriert hat?
@DKNguyen Ja, da er von einem nicht näher bezeichneten "Treiber" (Leitungstreiber?) spricht, nicht vom STM selbst. Natürlich könnte er über einen Gerätetreiber (Software) sprechen, in diesem Fall haben Sie Recht. Selbst dann ist es möglich, dass der Pin Open-Drain wird, zB durch ESD, wenn nicht durch Fehlkonfiguration.
@BrianDrummond. Der Treiber, auf den ich mich beziehe, ist die Software auf dem Mikrocontroller zur Steuerung des UART für die zu verwendende Anwendung. Ich weiß nicht, ob der Pin Open Drain ist, aber er ist Teil einer Platine (OpenPilot Revo, in der Bearbeitung erwähnt), die ohne externe Widerstände direkt mit Peripheriegeräten verbunden werden soll.

Antworten (3)

Überprüfen Sie, ob der GPIO-Pin für UART TX für den alternativen Ausgangs-Push-Pull-Modus konfiguriert ist. Es sieht so aus, als wäre es für einen alternativen Open-Drain-Ausgang konfiguriert.

Der GPIO wurde als Open Drain konfiguriert. Nachdem ich es umgestellt hatte, konnte ich 3 MBd genau übertragen.
Neugierig zu wissen, ob es sich um einen legitimen FTDI-Chip oder ein Bootleg handelt.
Dies hat nichts mit dem FTDI-Chip zu tun, dieses Signal wird vom Mikrocontroller ausgegeben.
@J.Hirsch Neugierig zu wissen, was einen Chip von FTDI irgendwie "legitimer" macht als einen Chip eines anderen Unternehmens.
@MatthewNajmon, es gibt eine Geschichte mit FTDI und Fälschungen . Außerdem wäre eine Fälschung natürlich weniger legitim als ein Markenname und könnte offensichtlich mehr Probleme haben.
@ JPhi1618 Ah. Ja, wenn der Nicht-FTDI-Chip fälschlicherweise als FTDI-Chip dargestellt wird, dann ist das ein Legitimitätsproblem. J. Hirschs Kommentar ließ es zumindest für mich so klingen, als ob es irgendwie unzulässig wäre, nur ein austauschbarer Chip von einer anderen Firma zu sein; Ich habe keine Implikationen festgestellt, die eine tatsächliche Fälschung angeben.
@MatthewNajmon Die FTDI-Kontroverse ist lang und läuft darauf hinaus, dass Hersteller ihre Produkte erkennen und herabsetzen. FTDI hat Treiber-Patches veröffentlicht, die Chips gemauert haben. Fälscher haben es weggeflickt. Die Ergebnisse, die Sie auf dem Logikanalysator anzeigen, können beeinträchtigt werden, wenn sie gefälscht sind. Der gefälschte Chip ist möglicherweise nicht mehr spezifikationsgerecht, hat möglicherweise eine schlechte kapazitive Kopplung, die die Signalanalyse verschlechtert usw. Er sollte Ihre Nackenhaare nicht auf Trab bringen, und Fälschungen sind billiger. Lieferkettenangelegenheiten. Das Fälschungsproblem hat mich selbst mit einer sicheren Lieferkette im Wert von 2.000 US-Dollar an verschrotteter Ausrüstung verbrannt
@ JPhi1618 Genau - der Begriff "FTDI-Chip" ist ziemlich synonym und wird wie "Kleenex" verwendet. Leider waren bei der letzten Suche, die ich durchgeführt habe, etwa 80 % der von mir gekauften Geräte, die behaupteten, einen FTDI-Chip (und Papierkram) zu haben, Schrott. Es ist besser geworden, aber immer noch ... die Schrottchips, die behaupten, gut zu sein, haben endlose Probleme mit dem Zeug für die serielle Kommunikation verursacht, an dem ich gearbeitet habe.

Hast du einen Schaltplan für deine Schaltung?

Neben dem falsch konfigurierten GPIO-Pin besteht eine weitere Möglichkeit darin, dass Sie einen Kondensator in Ihrer UART-Leitung haben, der als Tiefpassfilter fungiert und verhindert, dass das Signal schnell ansteigt.

Der fragliche Port ist der "Haupt"-Port auf der linken Seite, Abschnitt C1. Die andere Seite ist direkt mit dem FTDI und dem Logikanalysator verbunden.
Normalerweise würde ein Tiefpassfilter sowohl die Abfallrate als auch die Anstiegrate begrenzen. Warum könnte das hier nicht der Fall sein?

Wie oben erwähnt, löst das Einstellen des Push-Pull-Ausgangsmodus das Problem, aber Sie können auch überprüfen, ob die "Maximale Ausgabegeschwindigkeit" auf "sehr hoch" eingestellt ist, und wenn Ihr System dies toleriert, fügen Sie den internen Pull hinzu. Up-Widerstände; Ich weiß, dass es verschiedene Denkschulen gibt, ob USART Klimmzüge haben sollte oder nicht, also probieren Sie es aus und sehen Sie, ob es das tut, was Sie wollen / brauchen / Projekt ermöglicht.

Wenn Sie STM32CubeMX für Ihre Initialisierung/Konfigurationen verwenden, finden Sie diese Einstellungen alle unter Pinbelegung und Konfiguration > USARTx (oder UARTx, welchen Kanal Sie für Ihr Projekt verwenden) > GPIO-Einstellungen.

Wenn Sie die Vorlagendatei nur von Hand ändern (und davon ausgehen, dass Sie die HAL-Bibliotheken verwenden), sollten sich die Pin-Einstellungen im src-Ordner Ihres Projekts befinden, in der Datei mit dem Namen stm32F4xx_HAL_MSP.c (oder welcher Chip Sie auch sind verwenden)

Sie suchen nach diesen Zeilen;

GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Stellen Sie sicher, dass GPIO.InitStruct.Speet auf sehr hoch eingestellt ist (wie oben) und setzen Sie InitStruct.Pull auf: GPIO_InitStruct.Pull = GPIO_PULLUP;

Ich habe es geschafft, den UART auf einem STM32F4 vollständig zu missbrauchen und ihn mit 15 MB/s zum Laufen zu bringen, ohne Bits zu verlieren, was die schnellste Geschwindigkeit war, mit der mein FTDI-zu-USB-Konverter arbeiten würde. Ich sehe jedoch in den CubeMX-Einstellungen, dass es unter 1 MB/s bleiben soll.

Ja, gpio ist auf maximale Geschwindigkeit eingestellt.