UART wird verstümmelt, wenn es mit mehr als 9600 bps läuft

Ich verbinde 2 MSP430F5529 -basierte Boards (mit 1 MHz) mit UART und MAX3232 (MSP430F5529 -> MAX3232 -> Kabel, einige cm lang - wird in unserer endgültigen Anwendung länger sein -> MAX3232 -> MSP430F5529).

Es funktioniert, solange die Bitrate des UART unter 9600 bps liegt. Wenn dies ausgelöst wird, bekomme ich viele Fehler (normalerweise ist das MSB umgedreht).

Wenn ich den MAX3232 entferne und die Platinen direkt anschließe, verschwindet das Problem. Es passiert auch nicht, wenn ich loopback.

Ich betreibe den MAX3232 mit 3 V, was laut Datenblatt ausreicht:

Senderausgänge erfüllen EIA/TIA-562-Pegel von ±3,7 V bei Versorgungsspannungen von nur 2,7 V.

Was mache ich falsch?

Mein Code auf der TX-Seite ist:

void UART_Initialize() {

    UCA1CTL1 |= UCSWRST;
    UCA1CTL0 = UCMODE_0; // UART
    UCA1CTL0 &= ~UC7BIT ; // 8 bits, no parity, 1 stop bit
    UCA1CTL1 |= UCSSEL_2; // Source 1 MHz


    UCA1BR0 = 104; // 104 ~= 9600 bps 
    UCA1BR1 = 0;  

    UCA1MCTL |= UCBRS_0 + UCBRF_0; // Modulation
    P4SEL |= BIT4 + BIT5;
    UCA1CTL1 &= ~UCSWRST;
    UCA1IE |= UCRXIE;
}


void UART_send_data(unsigned char character) {
    while (!(UCA1IFG & UCTXIFG));
    UCA1TXBUF = character;
}

unsigned char UART_get_char() {
    while (!(UCA1IFG & UCRXIFG));
    return UCA1RXBUF;
}

void UART_shutdown() {
    UCA1IE &= ~(UCRXIE|UCTXIE);
    UCA1CTL1 = UCSWRST;
}


int main() {
    unsigned char received_data;

    P4OUT = 0x00;
    // Disables the watchdog
    WDTCTL = WDTPW + WDTHOLD;

    // CPU clock to 1 MHz

    UCSCTL0 = 0x00;
    UCSCTL1 = DCORSEL_3;  
    UCSCTL2 = FLLN5_L;

    __enable_interrupt();
    UART_Initialize();

    while(1) UART_send_data(0x55);

}

Auf der RX-Seite ist der Code ähnlich, außer für main()(das nur den Wert erhält und mit vergleicht 0x55).

Ich nehme an, Sie sind sicher, dass Ihre MAX3232 nicht kaputt sind? :)
Das war das erste, was ich dachte; Ich habe ein paar verschiedene MAX3232 ausprobiert und das Problem ging weiter.
Haben Sie sich vergewissert, dass sie elektrisch sinnvolle Dinge tun? (Korrekte Netzteile, korrekte Netzspannungen, sinnvolle Signale am Oszi)
Läuft Ihr MSP430 von einem Quarz oder von einem internen Oszillator?
Was @pjc50 gesagt hat - nehmen Sie ein Oszilloskop oder einen Logikanalysator, um zu sehen, was passiert, es kann viel schief gehen.
@vicactu Aus einem Kristall. Werde es bei Gelegenheit mit einem Oszilloskop prüfen.
Haben Sie versucht, 1µ-Kappen zu verwenden?
@TomL. Noch nicht.

Antworten (1)

Klingt definitiv nach einem Timing-Problem. Ich denke, Ihre Uhr läuft zu schnell und anstatt dass Bit 7 abgetastet wird, wird das folgende Stoppbit (HIGH) in das Schieberegister verschoben.

In der Tat ist es ein Timing-Problem; Durch Herumbasteln am Taktsystem konnte ich höhere Geschwindigkeiten erreichen. Werde das genauer untersuchen müssen.
Gelöst durch Verwendung eines externen Kristalls als Taktquelle.
könnten Sie den richtigen Arbeitscode aktualisieren?