Hey,
ich nutze gerade den MSP430F169 mit beiden UARTS. Die UART0 kommuniziert
mit dem PC und die UART1 mit einer Steuereinheit. Die Baudraten sind
unterschiedlich.
Nachfolgend mal der Initialisierungscode:
1 | void init_serial(void)
|
2 | {
|
3 |
|
4 |
|
5 | P3SEL = 0xF0;
|
6 | UCTL0 |= CHAR;
|
7 |
|
8 |
|
9 | //USART0 initialisieren
|
10 | //57600 bei 4Mhz
|
11 | //57600 * 2 bei 8 Mhz
|
12 | UTCTL0=0x30;//SSEL0.1,SSEL0.0
|
13 | URCTL0=0x00;
|
14 | U0BR1=0x00;
|
15 | U0BR0=0x45;
|
16 | UMCTL0=0x2A;
|
17 |
|
18 | ME1 |= UTXE0 + URXE0;
|
19 | UCTL0 &= ~SWRST;
|
20 | IE1 |= URXIE0;
|
21 | IFG1 &= ~URXIFG0;
|
22 |
|
23 | //USART1 initialisieren
|
24 | //9600 bei 4Mhz
|
25 | UCTL1 |= CHAR;
|
26 | UTCTL1=0x30;//SSEL0.1,SSEL0.0
|
27 | URCTL1=0x00;
|
28 | U1BR1=0x01;
|
29 | U1BR0=0xA0;
|
30 | UMCTL1=0x5B;
|
31 |
|
32 | ME2 |= UTXE1 + URXE1; // einschalten
|
33 | UCTL1 &= ~SWRST; // USART freigeben
|
34 | IE2 |= URXIE1;
|
35 | IFG2 &= ~URXIFG1;
|
36 | }
|
Die Kommunikation über die UART0 klappt sauber.
Über den UART1 gehen Kommandozeichenketten zur Steuereinheit
[c]
void SendUSART1(void)
{
char Chr;
int counter = 0;
//Erstes Zeichen holen
Chr = ucArr_SendString_UA2[counter];
counter++;
//Überprüfen ob Stringterminierung
while (Chr != 0)
{
while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready?
TXBUF1 = Chr;
Chr = ucArr_SendString_UA2[counter];
counter++;
}
}
[\c]
Jetzt habe ich aber die Situation, dass die Steuereinheit an der UART1
jeden einzelnen Character in einer Zeichenkette sofort echoed. Diese
einzelnen Character muss ich wieder einlesen. Deshalb hole ich mir in
der ISR für die UART1 den Character.
[c]
void usart1_rx (void) __interrupt [UART1RX_VECTOR]
{
ucArr_ReadString_UA2[uint_ReadCharCounter_UA2] = RXBUF1;
uint_ReadCharCounter_UA2++;
}
[\c]
Mein Problem ist jetzt, dass die ISR der UART1 die Character nicht
sauber liest. Ich denke, dass es ein reines Timing-Problem ist.
Habt ihr eine Idee???
Danke,
greets Bloddy Beginner