Hallo liebe Community,
ich probiere gerade die UART Kommunikation auf einem MSP 430
Experimentierboard zu implementieren.
Leider funktioniert das ganze nicht wirklich so wie gedacht.
Die wichtigsten Eckparameter sind CLK von 8 MHz, SMCLK von 250 kHz und
eine UART Kommunikation über das Integrierte eUSCI - Modul.
Hier einmal meine Main.c für euch
1 | #define UART_TXD BIT4
|
2 | #define UART_RXD BIT5
|
3 |
|
4 |
|
5 | int main(void) {
|
6 |
|
7 | /*CLK EINSTELLUNGEN*/
|
8 | WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
|
9 | CSCTL0_H = 0xA5; //TI möchte einen Passwortschutz auf die CS Register
|
10 | CSCTL1 = 0x7; //8 MHz
|
11 | CSCTL2 = SELA_3 | SELS_3 | SELM_3; // Setzen von ACLK = MCLK= SMCLK
|
12 | CSCTL3 = DIVA_0 | DIVS_0 | DIVM_0; // Alle Teiler auf Null
|
13 | CSCTL3 |= DIVS_5; //Setzen von SMCLK auf DIV = 32
|
14 |
|
15 | /*UART EINSTELLUNGEN*/
|
16 |
|
17 |
|
18 | //Wir gehen von 9600 Baud aus -> N = 250 kHz / 9600 => 26,04
|
19 | //Dieser Wert ist größer 16 -> OS16 = 1
|
20 | //26,04 / 16 = 1.64 (int) -> UCBRx = 1
|
21 | //UCBRFx = (int)((26,04/16)-((int)(26,04/16))*16) => 10 dez
|
22 | //UCBRSx = 0,04 => 0x01
|
23 |
|
24 |
|
25 | //Baud,etc .. Einstellungen
|
26 | UCA0CTLW0 &= ~(0x8000);//Keine Parität
|
27 | UCA0CTLW0 &= ~(0x1000);//8 Bit daten
|
28 | UCA0CTLW0 &= ~(0x0800);//1 Stopbit
|
29 | UCA0CTLW0 &= ~(0x0600);//Ab in den UART Mode
|
30 | UCA0CTLW0 &= ~(0x0060);//Wählen von SMCLK als Clock Source
|
31 | //Konfiguration der Berechnung oben
|
32 | UCA0MCTLW |= 0x1;//Setzen von Oversampling
|
33 | UCA0BRW |= 0x1;//UCBRx = 1
|
34 | UCA0MCTLW |= 0x00A0;//UCBRFx = 1010;
|
35 | UCA0MCTLW |= 0x0100;//UCBRSx = 1
|
36 | //Konfigurieren der Ports
|
37 | //P3.4 TX
|
38 | //P3.5 RX
|
39 | P3SEL0 |= UART_TXD | UART_RXD; //Definieren der Pins als besondere Funktion IST das so richtig ?
|
40 | P3OUT |= UART_TXD; //Laut Datenblatt muss OUT auch bei SELX gesetzt werden
|
41 |
|
42 |
|
43 | /*INIT DES UARTS*/
|
44 |
|
45 | UCA0CTLW0 &= ~(0x1); //Entfernen der RESET bedinung
|
46 | UCA0IE |= UCRXIE; //Aktivieren des RX Interrupts
|
47 | UCA0IE |= UCTXIE;//Aktivieren des TX Interrupts
|
48 |
|
49 |
|
50 | __bis_SR_register(GIE); //Aktivieren der Globalen Interrupts
|
51 |
|
52 | while (true)
|
53 | {
|
54 | _delay_cycles(1);
|
55 | }
|
56 |
|
57 | }
|
58 |
|
59 | #pragma vector=USCI_A0_VECTOR
|
60 | __interrupt void USCI0_ISR(void)
|
61 | {
|
62 | switch (UCA0IFG){
|
63 | case 0x2:
|
64 | UCA0TXBUF = 'a'; //Senden von 'a' auf die TX Leitung
|
65 | break;
|
66 | case 0x1:
|
67 | if (UCA0RXBUF == 'a') // 'a' erhalten ?
|
68 | {
|
69 | UCA0RXBUF &= 0x0; // Kein Nutzen hinter dieser Anweisung
|
70 | }
|
71 | break;
|
72 | }
|
73 | }
|
Mit dem Debugger kann ich das Programm soweit nachvollziehen, das es in
den Interrupt springt und case 0x2 anspringt. Dort setzt er dann den
Ausgangsbuffer und idled dann in der while(true) Schleife in der Main.
Ich hoffe Ihr könnte mir helfen, den Fehler in meinem Code zu finden.
Bei dem Experimenterboard handelt es sich um MSP-EXP430FR5739 FRAM
Board. (Link Datasheet: http://www.farnell.com/datasheets/1684431.pdf)
Es soll der auf dem Board vorhandene RS232 to USB Wandler benutzt
werden.
Gruß
AlexanderS.