Ich verbinde 2 MSP430F5529 -basierte Boards (mit 1 MHz) mit UART und MAX3232 (MSP430F5529 -> MAX3232 -> Kabel, einige cm lang - wird in unserer endgültigen Anwendung länger sein -> MAX3232 -> MSP430F5529).
Es funktioniert, solange die Bitrate des UART unter 9600 bps liegt. Wenn dies ausgelöst wird, bekomme ich viele Fehler (normalerweise ist das MSB umgedreht).
Wenn ich den MAX3232 entferne und die Platinen direkt anschließe, verschwindet das Problem. Es passiert auch nicht, wenn ich loopback.
Ich betreibe den MAX3232 mit 3 V, was laut Datenblatt ausreicht:
Senderausgänge erfüllen EIA/TIA-562-Pegel von ±3,7 V bei Versorgungsspannungen von nur 2,7 V.
Was mache ich falsch?
Mein Code auf der TX-Seite ist:
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);
}
Auf der RX-Seite ist der Code ähnlich, außer für main()
(das nur den Wert erhält und mit vergleicht 0x55
).
Klingt definitiv nach einem Timing-Problem. Ich denke, Ihre Uhr läuft zu schnell und anstatt dass Bit 7 abgetastet wird, wird das folgende Stoppbit (HIGH) in das Schieberegister verschoben.
Benutzer17592
Renan
pjc50
Vicatcu
John u
Renan
Tom L.
Renan