FTD232RL zeigt Kauderwelsch an

Hallo, ich verwende dsPIC30F4013 und habe versucht, uart mit pic zu verbinden. Ich möchte einige Daten über uart an den PC senden und auf dem Terminal anzeigen, aber was ich bekomme, ist weit von dem entfernt, was ich erwarte, um genau zu sein, ich bekomme Unsinn. Ich verwende das USB Serial Converter-Modul FTD232RL, um die MCU mit dem PC zu verbinden. Ich dachte zuerst, es könnte ein Unterschied in der Baudrate sein, aber ich habe es noch einmal überprüft und sogar verschiedene Baudraten ausprobiert, aber das Ergebnis ist das gleiche. Ich habe meinen Code unten gepostet. Was könnte ein Problem sein und wie kann es behoben werden? Vielen Dank im Voraus.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <p30fxxxx.h>
#include "uart.h"

_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(MCLR_DIS);

#define period 7372

unsigned int counter;

void initTMR1(void)
{
 TMR1 = 0;
 PR1 = period;    
 IFS0bits.T1IF = 0;
 IEC0bits.T1IE = 1; 
 T1CONbits.TON = 1; 
}

void delay_ms(unsigned int time)
{
 counter = 0;
 while (counter < time);
}

void initUART()
{
 U1BRG = 0x0040; //baud rate 9600
 U1MODEbits.ALTIO = 1;
 IEC0bits.U1RXIE = 1;
 U1STA &= 0xfffc;
 U1MODEbits.UARTEN = 1;
 U1STAbits.UTXEN = 1;
}

void writeUART(unsigned int data)
{
 while(U1STAbits.TRMT == 0);
 if(U1MODEbits.PDSEL == 3)
     U1TXREG = data;
 else
     U1TXREG = data & 0xFF;
}

void RS232_putst(register const char *str)
{
  while((*str)!=0)
  {
    WriteUART(*str);
    str++;
  }
 }

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
 TMR1 = 0;
 counter++;
 IFS0bits.T1IF = 0;
}


int main(void)
{
 ADPCFGbits.PCFG9 = 1;
 TRISBbits.TRISB9 = 0;
 LATBbits.LATB9 = 0;


 initUART();
 initTMR1();

 RS232_putst("START");
 delay_ms(2000);

 while(1)
 {
     RS232_putst(00000); 
     RS232_putst("This is test!!");
     LATBbits.LATB9 = ~LATBbits.LATB9;

     delay_ms(1000);
 }
 return 0;
}
Ist es wiederholbares Kauderwelsch, wenn ja, was ist es? Gibt es eine gute Systemerdung?
Ja, es ist wiederholbar. Ich bekomme so etwas: ððððð<0>þ<0>Àð<0>Àð<0><0>þððð<0>ðð<0>>|ø<0>þð<0>ððð<0>þððð<0 >ðð<0>>üð<0>>€<0>ððððð<0>>€<0>ðððð<0>ððð<0>>€<0>ðð<0><0>ððððð<0>þ< 0>Àð<0>Àð<0><0>þððð<0>ðð<0>>|ø<0>þð<0>ððð<0>þððð<0>ðð<0>>üð<0>>€ <0>ððððð<0>>€<0>ðððð<0>ððð<0>> , und es kommt einfach weiter. Ja, es ist gut begründet.
Ich sehe, dass sich 8 wiederholt, aber Zeichen mit msb=1, aber keine sich wiederholende Zeichenfolge. Das Verhältnis von ausgehenden/eingehenden Zeichen könnte auf einen Baudraten-Berechnungsfehler mit einer langsameren Ausgabe und msb-Überlappung ab Startbit=1 hindeuten
Also was genau meinst du? Sie denken, ich sollte es mit langsameren Baudraten versuchen?
sind Parität und Stoppbits korrekt? Wenn Sie den uC schlafen, muss die Serie vor dem Schlafen geleert werden.
Haben Sie einen "USB to Serial"-Konverter mit einem 9-poligen oder einem anderen Consumer-Anschluss oder ein "Logic Level USB UART"-Gerät mit blanken Drähten oder einem Header-Anschluss? Typischerweise enthält ersterer einen invertierenden Pegelumsetzer, während letzterer nur den USB-Schnittstellenchip hat. Der Pegelumsetzer akzeptiert normalerweise Signale mit niedrigem Logikpegel, aber die Inversion endet falsch und führt häufig zu Problemen, wie Sie sie sehen (auch die Sendeseite des Pegelumsetzers kann Ihre Schaltung beschädigen).
Beide Module verwenden TTL, bei denen es sich um invertierte Logikpegel handelt, sodass die Stopp- und Startbits = 1 logisch „0“ sind, indem sie Vdc im Leerlauf prüfen und den Bereich oder ein Äquivalent verwenden.
Ich habe Logikpegel-USB mit dem FTD232RL-Modul mit PC verbunden und vom Modul verbinde ich Rx und Tx jeweils mit MCU-Pins.

Antworten (2)

Ich finde es heraus, also ist hier eine Lösung, falls jemand jemals auf dieses Problem stoßen sollte. Der Grund, warum ich am Terminal Unsinn bekomme, liegt an der Stromversorgung, nicht an der Baudrate. Alle diese Module verbrauchen eine bestimmte Menge Strom, und sie erhalten nicht genug Strom, um ihre Funktion zu erfüllen, und es kann vorkommen, dass diese Art von Problemen verursacht werden. Um dies zu beheben, müssen Sie ein Netzteil mit Spannungsregler verwenden oder selbst herstellen, um genügend Strom für Ihre Schaltung sicherzustellen.

Hast du einen Umfang? Ich mache dieses Setup wiederholt mit PICs und folge immer denselben Schritten:

  1. Start um 9600
  2. Stellen Sie den PIC so ein, dass er 0x55 in einer Schleife sendet
  3. Verwenden Sie das Oszilloskop, um zu überprüfen, ob die Bitperiode nahe bei 104 us liegt
  4. Stellen Sie die Terminaleinstellungen richtig ein und prüfen Sie, ob die Zeichen ohne Probleme durchkommen.

Wenn es ein Problem gibt, werden die Bits invertiert, was leicht in der Software behoben werden kann. Wenn alles funktioniert, schiebe ich die Baudrate normalerweise auf etwa 38400. Geht bei mir immer einwandfrei.

Dies ist wirklich ein Kommentar, keine Antwort, da Sie Debugging-Vorschläge bereitstellen, anstatt das Problem identifizieren oder erklären zu können.
Nein, ich habe kein Zielfernrohr. Nehmen wir an, dass Bits invertiert sind, was sollte ich ändern, damit ich das beheben kann?
Invertieren Sie einfach das Byte in der Software, bevor Sie es an den UART übergeben - prüfen Sie, ob es dadurch behoben wird.