UART está distorsionado cuando se ejecuta a más de 9600 bps

4

Estoy conectando 2 tarjetas MSP430F5529 (que funcionan a 1 MHz) utilizando UART y MAX3232 (MSP430F5529 - > MAX3232 - > cable, algunos cm de largo - será más largo en nuestra aplicación final - > MAX3232 - > MSP430F5529).

Funciona siempre que la tasa de bits del UART sea inferior a 9600 bps. Si esto se plantea, empiezo a tener muchos errores (normalmente se voltea el MSB).

Si quito el MAX3232 y conecto las tarjetas directamente, el problema desaparece. No sucede si yo también hago loopback.

Estoy ejecutando el MAX3232 a 3 V, que la hoja de datos dice que 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.7V.

¿Qué estoy haciendo mal?

Mi código en el lado de 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 se compara con 0x55 ).

    
pregunta Renan

1 respuesta

1

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

    
respondido por el jippie

Lea otras preguntas en las etiquetas