Me estoy conectando 2 MSP430F5529basado en tablas (que se ejecuta en 1 MHz) mediante UART y MAX3232 (MSP430F5529 -> MAX3232 -> cable, un par de cm de largo será mayor en nuestra aplicación final -> MAX3232 -> MSP430F5529).
Esto funciona siempre y cuando la tasa de bits de la UART es en virtud de 9600 bps. Si este es elevado, puedo comenzar a recibir muchos errores (normalmente el MSB es volteado).
Si puedo quitar el MAX3232 y conectar las tablas directamente, el problema desaparece. No sucede si me loopback, demasiado.
Estoy ejecutando el MAX3232 de 3 V, que la hoja de datos dice que es suficiente:
Transmisor de salidas se reunirá EIA/TIA-562 niveles de ±3.7 V con voltajes tan bajos como los de 2.7 V.
¿Qué estoy haciendo mal?
Mi código en el TX lado 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 la RX lateral el código es similar, excepto para main()
(lo que recibe el valor y la compara a 0x55
).