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