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
).
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.
usuario17592
Renán
pjc50
vicatcu
Juan U.
Renán
tom l
Renán