Frage:
UART, Minicom und ASCII
71GA
2016-01-04 23:42:05 UTC
view on stackexchange narkive permalink

Ich versuche, meinen Namen ( Ziga ) über die UART-Peripherie meines Mikrocontrollers an meinen PC zu senden. GND-, Tx- und Rx-Leitungen vom Mikrocontroller werden direkt an den UART-USB-Konverter CP2102 angeschlossen, der an meinen PC angeschlossen ist.

Auf meinem PC wird Linux ausgeführt, und ich bin es Verwenden Sie die Anwendung minicom, um nach übertragenen Informationen zu suchen. Während der Übertragung druckt mein Minicom-Terminal einige seltsame Symbole (zum Vergrößern klicken):

enter image description here

und wenn ich die HEX-Anzeige aktiviere "Option Ich erhalte diese Werte (zum Vergrößern anklicken):

enter image description here

Die Werte sind 0x5C = 92 ist in ASCII \ , dann 0xFC = 252 , das in altem ASCII kein Vorzeichen hat, also wird es zu ? Es gibt 0x40 = 64 gleich @ in ASCII und schließlich 0x81 = 129 , was wiederum in altem ASCII nicht definiert ist, sodass es zu ? .

während ich das richtige Bild auf meinem Oszilloskop erhalte (zum Vergrößern klicken):

enter image description here

Warum nicht? t Ich erhalte ZigaZigaZigaZiga ... in der Minicom-Konsole? Die Werte für einzelne Buchstaben sind gemäß der Tabelle ASCII korrekt.


ADD 1 :

Ich habe ein Oszilloskopbild aufgenommen des Buchstabens a von Ziga . Ich hoffe, dies kann helfen, festzustellen, ob die Baudrate des Mikrocontrollers korrekt ist.

enter image description here


ADD 2 :

Ich habe versucht, 2 Stoppbits sowohl auf dem Minicom als auch auf dem Mikrocontroller zu verwenden, und ich erhalte ein anderes Ergebnis, das noch schlimmer ist - es überträgt nur 3 statt vier Zeichen ( Ziga stark> hat vier). Schauen Sie sich Folgendes an:

enter image description here


ADD 3 :

Ich habe gefunden diese Info über externe Oszillatoren. Bedeutet dies, dass die im Benutzerhandbuch für Mikrocontroller erwähnte PCLK-Uhr 12 MHz ?

enter image description here

ist?

4 HINZUFÜGEN :

Also haben wir herausgefunden, dass es sich um ein Baudratenproblem handeln muss, also habe ich angefangen, das Benutzerhandbuch zu lesen und auf Seite 21 herausgefunden, dass mein PCLK = 3MHz standardmäßig ist. Dann habe ich auf Seite 509 einen Algorithmus ausgewählt, um Werte zu berechnen:

  DLL = 0DLM = 13DIVADDVAL = 1MULVAL = 2  

Diese Werte sollten mir eine Baudrate von 9600 geben zu der Gleichung (4) auf Seite 508. Nun, es gibt 9615.384615, was 0,16% genau sein sollte. Dann habe ich mit dem Programmieren begonnen und die obigen Werte wie folgt eingestellt:

  DLL & = ~ (0xFF); // erstes Byte auf 0 setzen (Divisor Latch Byte mit der geringsten Signifikanz) DLL | = 13; // erstes Byte auf 13 setzen (Divisor Latch Byte mit der geringsten Signifikanz) DLM & = ~ (0xFF); // erstes Byte auf 0 setzen (Divisor Latch das wichtigste Byte) - nicht wirklich benötigtDLM | = 0; // erstes Byte auf 0 setzen (Divisor Latch Byte mit der geringsten Signifikanz) - nicht wirklich benötigtFDR | = (1<<5); FDR & = ~ (1<<4); // Einstellwert MULVALFDR | = 0x1; // Einstellwert DIVADDVAL  

Aber ich bekomme immer noch nicht die richtige Baudrate ...

Falsche Baudrate?
Ich habe es 9600 8N1 auf beiden Seiten eingestellt.Dies bedeutet 9600 Baudrate, 8 Datenbits, keine Parität und 1 Stoppbit.
Haben Sie Ihren uC so programmiert, dass er alles zurückgibt, was Sie eingeben?Wenn Sie nicht haben, sollten Sie nichts sehen.Was soll dein uC zurückschicken?
Ich bin im Moment nicht so weit.Momentan versuche ich nur, einige Zeichenketten an meinen PC zu senden und sie abzufangen.Wie kann ich überprüfen, ob meine Baudraten übereinstimmen?Dies ist, was @Armandas vorgeschlagen hat.
Wie ist die Zeit- / Div-Einstellung in Ihrem Bereich?Wenn es 250uSec / div ist, dann sieht Ihre Baudrate richtig aus.
Welchen Mikrocontroller verwenden Sie?
@whatsisname Ich verwende LPC4088 (UART3-Schnittstelle): http://www.nxp.com/documents/user_manual/UM10562.pdf
@brhans Ich werde Ihnen ein zusätzliches Oszilloskopbild zusenden, und Sie können es vielleicht überprüfen.
Ist es beim CP2102 möglich, dass Tx und Rx vertauscht werden (Eingabe / Ausgabe)?Dies ist ein häufiger Fehler bei seriellen RS232-Verbindungen.Normalerweise benennen beide Geräte ihre Ausgänge als Tx, daher muss der Benutzer uc-Tx-out mit FT232-Rx-in verbinden ... Ich gehe davon aus, dass cp2102 der gleichen Konvention folgt.
Können Sie zum Vergleich ein Scope-Foto veröffentlichen, das einige von minicom übertragene Daten zeigt?Ich verstehe, dass Ihre Firmware die Daten ignoriert, aber es würde helfen, die Baudrate zu überprüfen und die Dateneinstellungen von Minicom werden erwartet.
Ich habe ein weiteres Bild hinzugefügt, anhand dessen Sie meine Baudrate überprüfen können.Ich bin mir nicht sicher, ob ich heiß weiß, um es richtig zu berechnen.
@MarkU Es ist nicht möglich, dass diese beiden geschaltet werden, da mein Oszilloskop direkt mit der MCU Tx verbunden ist, die an CP2102 Rx geht.CP2102 ist in keiner Weise so programmiert, dass etwas übertragen wird.Aber ich habe es doppelt überprüft und es ist in Ordnung.
Versuchen Sie, mit 2 Stoppbits zu arbeiten.Vielleicht ist es falsch synchronisiert.
Wenn Ihre Bitlänge 300 / 8usec = 40uSec beträgt, beträgt Ihre Baudrate 1 / 40uSec = 26,67k, nicht 9600
@Eugene Sh ist es also überhaupt möglich, etwas über die Leitung zu übertragen, wenn die Baudraten nicht übereinstimmen?
Sicher warum nicht?Vor allem, wenn es vom Mikrocontroller kommt .. Nur nicht zu empfangen.Drähte kümmern sich nicht darum, was sie übertragen sollen.
Jetzt muss ich wirklich überprüfen, wo ich es geschraubt habe.@Armandas hatte wahrscheinlich an erster Stelle Recht.=)
Es geht um den UART-Initialisierungsteil.Schau da..
Ihr UART-Init-Code wird unter der Annahme einer bestimmten Taktfrequenz geschrieben und sollte seine Annahmen enthalten.Laufen Sie mit dieser Taktrate?Wenn nicht, müssen Sie die Divider- und Prescaler-Werte an die neue Taktfrequenz anpassen.
Ich habe in der folgenden Dokumentation nach dem Standard-PCLK gesucht und konnte es nicht finden.Auf den Seiten 508 - 510 gibt es ein Verfahren zur Berechnung der Baudrate. Wenn ich jedoch in der Dokumentation keine Standarduhr-PCLK finde, bin ich geschraubt ... Hier ist die Dokumentation: http://www.nxp.com/documents/user_manual/UM10562.pdf Überprüfen Sie "ADD 3" - Ich habe festgestellt, dass mein eingebettetes System einen externen 12-MHz-Oszillator verwendet.Bedeutet dies "PCLK = 12MHz"?
Seite 21 beschreibt die Taktgenerierung.Es sieht so aus, als gäbe es einen Standardteiler durch 2.
Vielen Dank.Es sieht so aus, als ob dieser Mikrocontroller einen internen 12-MHz-Oszillator geteilt durch 4 verwendet, um 3-MHz-PCLK zu erzeugen.Und ich dachte es wäre 12MHz!=)
@71GA Sie sollten dies wahrscheinlich als Antwort posten, da sonst die Frage ungelöst erscheint.
Es ist noch nicht gelöst.Ich beschäftige mich immer noch mit der Lösung.Ich mache gerade einige Berechnungen.=)
Vier antworten:
bigjosh
2016-01-05 03:35:51 UTC
view on stackexchange narkive permalink

Ich denke, Sie haben eine Fehlanpassung der Baudrate.

Bei 9600 Baud sollte jedes Bit ~ 104us breit sein. Hier ist ein tatsächlicher ASCII 5 im Bereich mit einem einzelnen Bit, das auf 105us eingestellt ist ...

enter image description here

(Beachten Sie, dass ASCII 5 ein praktisches Zeichen zum Testen ist, da es abwechselnd Einsen und Nullen in Binärform enthält.)

Bei 9600 Baud sollte ein einzelnes Byte ~ 833us breit sein (8 Datenbits, Start und Stopp nicht gezählt) ....

enter image description here

Ihre Ablaufverfolgung zeigt dieselben 8 Bits Wenn Sie ~ 300us nehmen, ist Ihre serielle Uhr ungefähr 2,7x zu schnell.

Versuchen Sie, Ihre Baudrate in Minicom auf 26656 Baud einzustellen, und sehen Sie, was Sie erhalten. Wenn Sie Ziga sehen, können Sie nach dem Grund suchen, warum die serielle Uhr zu schnell ist.

Um Bits zu sehen, ist ASCII "U" sogar besser als "5". Es ist vom Startbit bis zum Stoppbit auf und ab.
Olin Lathrop
2016-01-05 04:02:21 UTC
view on stackexchange narkive permalink

Was Sie zeigen, sieht aus wie ein typischer Baud-Barf.

Eines Ihrer Diagramme zeigt, dass Sie 8 Bits in 300 µs senden, was 26,7 kBaud bedeutet. Das ist ein seltsamer Wert. Versuchen Sie eine Standard-Baudrate wie 9600 und stellen Sie sicher, dass Ihr PC darauf eingestellt ist. 9600 Baud bedeutet 104,2 µs pro Bitzeit, daher sollten 8 Bits 833 µs und ein volles 10-Bit-Zeichen (1 Startbit, 8 Datenbits, 1 Stoppbit) von 1,04 ms benötigen.

Bitte werfen Sie einen Blick auf ADD 4 in meiner Frage.Ich habe einige Erklärungen zur Baudratenberechnung hinzugefügt, wie in der Dokumentation beschrieben.Ich habe auch einige C-Programmierzeilen hinzugefügt, in denen ich diese Werte eingestellt habe.
@71GA: Ich kenne Ihren Prozessor nicht.Die meisten UARTs möchten eine Uhr, die das 16-fache der Baudrate beträgt.Wenn Sie 9600 Baud wollen, müssen Sie es mit 153,6 kHz speisen.Ab 3 MHz müsste dies durch 19,5 geteilt werden, was nicht funktionieren wird.4800 Baud müssten durch 39.06 geteilt werden, also sollte 39 funktionieren.Je nachdem, wie Ihre Hardware funktioniert, müssen Sie möglicherweise 38 in ein Register laden.
Der niedrigste Wert, den ich auf meinem PC beobachten kann, ist 9600.
@71GA: Also * setze * es auf 4800. Es wird nicht auf magische Weise von selbst passieren, damit du es beobachten kannst.
71GA
2016-01-07 14:36:27 UTC
view on stackexchange narkive permalink

Dieser Thread ist immer noch nicht gelöst, aber wir haben festgestellt, dass ich eine UART-Baudrate-Fehlanpassung hatte und dies bestätigen kann. Aber wo liegt das Problem? Wenn ich das LPC4088-Benutzerhandbuch lese, kann ich lesen, dass ein interner 12-MHz-Oszillator verwendet wird (S. 7). Dank Ihnen habe ich auch das Kapitel zur Taktgenerierung (S.21) mit diesem Schema gefunden:

enter image description here

Um dies vollständig zu verstehen, müssen wir dies tun Durchsuchen Sie die Dokumentation nach Standardwerten für Multiplexer CLKSRCSEL [0] = 0 (S.34), CCLKSEL [8] = 0 (S.33) und Teiler PCLKSEL [4: 0] = 0x4 (S.34). Ich sollte also PCLK = 12Mhz / 4 = 3MHz erhalten, aber ich denke, das ist nicht wahr, oder es muss ein Fehler mit dem Algorithmus zur Berechnung der Baudrate oder Gleichung vorliegen (S.508, S.509):

enter image description here enter image description here

In meinem Fall habe ich versucht, mit PCLK = 3MHz zu berechnen Code> und ich wollte Baudrate 9600 . Also habe ich zuerst DL_EST = PCLK / (16 * 9600) = 19,53 berechnet (EST steht für Schätzung) und dies ist keine ganze Zahl, also FR_EST = 1,5 und DL_EST = PCLK / (16 * 9600 * 1,5) = 13,02 = 13 . Als nächstes berechnen wir FR_EST = PCLK / (16 * 9600 * 13) = 1,5024 . Es gilt, dass mein 1.5 < FR_EST < 1.9 , damit ich Werte für einen Divisor-Latch DL aus der Tabelle lesen kann (S.510):

enter image description here

Aus den obigen Tabellen und Berechnungen folgt in meinem Fall Folgendes:

  DIVADDVAL = 1MULVAL = 2DL = 13  

Da DL = 13 = 00000000 00001101 aus dem niedrigstwertigen Byte DLL und dem höchstwertigen Byte DLM besteht Diese beiden sind gleich:

  DLL = 13DLM = 0  

Ich habe diese Werte zum Programmieren der LPC4088 UART-Baudrate verwendet, aber keine 9600 erhalten wie ich sollte. Ich habe sogar die mitgelieferte Gleichung überprüft, die 9615.384615 zurückgibt, und dies ist 0,16% genau, was gut aussieht.

Nun, ich habe den Algorithmus / die Gleichung des NXP aufgegeben und versucht, durch Versuch und Irrtum zu arbeiten, und ich habe herausgefunden, dass:

  DIVADDVAL = 1MULVAL = 2DL = 255 // dies bedeutet DLL = 255 und DLM = 0  

9600 Baudrate zurückgegeben und ich konnte problemlos mit meinem PC kommunizieren. Aber ich weiß immer noch nicht, was der Fehler ist. Mache ich irgendetwas falsch im Code oder hat NXP falsche Algorithmen bereitgestellt?

Hier ist mein voll funktionsfähiges C-Programm. Bemerken Sie Fehler?

  #include "LPC4088-ioconfig.h" #include "LPC4088-system.h" #include "LPC4088-gpio.h" #include "LPC4088-uart. h "int main () {// PIN-Einstellungen IOCON_P0_0 & = ~ (0x67F); IOCON_P0_0 | = (1<<1); IOCON_P0_1 & = ~ (0x67F); IOCON_P0_1 | = (1<<1); // UART3 PCONP einschalten | = (1<<25); // wir setzen 8-Bit-Zeichen, keine Parität, ein Stoppbit im LCR-Register //LCR.DLAB = 1 LCR | = (0x3); LCR & = ~ (0x7C); LCR | = (1<<7); // setze DLL [0-7] = 255, DLM [0-7] = 0, FDR [0-3] = 1, FDR [4-7] = 2 // Werte, die durch Versuch &-Fehler erhalten wurden - NXPs Algorithmen don funktioniert nicht DLL & = ~ (0xFF); DLL | = 255; DLM & = ~ (0xFF); DLM | = 0; FDR & = ~ (0xFF); FDR | = 1; // DIVADDVAL FDR | = (2<<4); // MULVAL //LCR.DLAB = 0 LCR & = ~ (1<<7); // Rx und Tx aktivieren FIFO FCR | = 0x1; unsigned char posiljka [] = "Ziga"; while (1) {for (int i = 0; i < (sizeof (posiljka) / sizeof (posiljka [0]) -1); ++ i) {// wir lesen LSR und warten, bis THR leer ist, während (() LSR & (1<<5))! = (1<<5)); // sende jeweils ein Zeichen THR = posiljka [i]; }}}  
Carl
2016-10-03 16:49:12 UTC
view on stackexchange narkive permalink

Ich bin gerade selbst auf dasselbe Problem gestoßen.Das 9600-Baudraten-Setup des OP funktionierte für mich, wo die aus dem Handbuch berechneten Werte nicht funktionierten.

Das Problem für mich war, dass der in meinem Projekt verwendete Standardstartcode (Keil unter Verwendung des LPC4000_DFP-1.1.0-Pakets) eine Funktion "SystemInit" aufruft, die die Taktregister auf nicht zurückgesetzte Werte einrichtet.

Die Problemfunktion befindet sich in "system_LPC407x_8x_177x_8x.c".Die Funktion wird aus dem Startcode in "startup_LPC407x_8x_177x_8x.s" aufgerufen.

Eine Lösung besteht darin, beide Dateien in Ihr Projekt zu kopieren, anstatt die Standarddateien zu verwenden, und die C-Datei zu ändern, um die Uhren so einzurichten, wie Sie es möchten.Alternativ können Sie die Assembler-Datei ändern, um den Aufruf von "SystemInit" insgesamt zu verhindern.Beachten Sie jedoch, dass Sie in diesem Fall den Co-Prozessor selbst einrichten müssen (wie in "fpu_init", das von "SystemInit" aufgerufen wird), da dies für eine normale Funktion erforderlich zu sein scheint (ich bin mir noch nicht sicher)warum).

Und deshalb hasse ich STARTUP-CODE, der nicht als Quellcode, sondern nur als Objektdatei geliefert wird ... Haben Sie vielleicht einen Quellcode für die Startdatei?Ich brauche den für den GNU-Compiler ...
Entschuldige Nein.Der von mir verwendete Startcode war für MDK-ARM (armcc).Ich habe dies im Moment nicht installiert, aber es kann kostenlos heruntergeladen werden und Sie könnten es wahrscheinlich leicht genug an gcc anpassen.
Sieht so aus, als müsste ich es selbst schreiben ... Warum verstecken sie das?Weiß jemand?= /


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...