UART se distorsiona cuando se ejecuta a más de 9600 bps

Estoy conectando 2 placas basadas en MSP430F5529 (funcionando a 1 MHz) usando UART y MAX3232 (MSP430F5529 -> MAX3232 -> cable, unos pocos cm de largo; será más largo en nuestra aplicación final -> MAX3232 -> MSP430F5529).

Funciona siempre que la velocidad de bits del UART sea inferior a 9600 bps. Si esto aumenta, empiezo a recibir muchos errores (por lo general, el MSB está invertido).

Si elimino el MAX3232 y conecto las placas directamente, el problema desaparece. No sucede si hago loopback, también.

Estoy ejecutando el MAX3232 a 3 V, lo que dice la hoja de datos es suficiente:

Las salidas del transmisor cumplirán con los niveles EIA/TIA-562 de ±3,7 V con voltajes de suministro tan bajos como 2,7 V.

¿Qué estoy haciendo mal?

Mi código en el lado TX es:

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);

}

En el lado RX, el código es similar excepto por main()(que solo recibe el valor y lo compara con 0x55).

¿Supongo que estás seguro de que tus MAX3232 no están rotos? :)
Esto fue lo primero que pensé; Probé algunos MAX3232 diferentes y el problema continuó.
Sin embargo, ¿ha verificado que están haciendo cosas eléctricamente sensibles? (Fuentes de alimentación correctas, voltajes de línea correctos, señales sensibles en el osciloscopio)
¿Su MSP430 funciona con un cristal o con un oscilador interno?
Lo que dijo @ pjc50: obtenga un osciloscopio o un analizador lógico para ver qué está sucediendo, hay muchas cosas que pueden salir mal.
@vicactu De un cristal. Verificaré con un alcance cuando pueda.
¿Has probado a usar tapones de 1µ?
@TomL. Aún no.

Respuestas (1)

Definitivamente suena como un problema de tiempo. Creo que su reloj está corriendo demasiado rápido y en lugar de muestrear el bit 7, el siguiente bit de parada (ALTO) se desplaza al registro de desplazamiento.

De hecho, es una cuestión de tiempo; Jugando con el sistema de reloj pude obtener velocidades más altas. Habrá que investigar esto más a fondo.
Resuelto usando un cristal externo como fuente de reloj.
¿Podría actualizar el código de trabajo adecuado?