Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 USCIA0 umschalten zw. UART und SPI


von Weihnachtsbengel (Gast)


Lesenswert?

Moin Moin,

ich versuche mit meinem Launchpad am USCIA0 nacheinander UART und SPI zu 
verwenden ... das sin meine Init Funktionen:
1
 
2
void SPI_Init(){
3
UCA0CTL1 |= UCSWRST;
4
UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; 
5
P1SEL |= SPI_USCIB0_SOMI + SPI_USCIB0_SIMO + SPI_USCIB0_SCLK;
6
P1SEL2 |= SPI_USCIB0_SOMI + SPI_USCIB0_SIMO + SPI_USCIB0_SCLK;
7
UCA0CTL1 |= UCSSEL_2; 
8
UCA0BR0 |= 0x01;               
9
UCA0BR1 = 0;
10
UCA0MCTL = 0;               
11
UCA0CTL1 &= ~UCSWRST;
12
IE2 |= UCA0RXIE; 
13
}
14
15
void UART_Init{
16
UCA0CTL1 |= UCSWRST;
17
UCA0CTL0 = 0; 
18
P1SEL = BIT1 + BIT2 ;                     
19
P1SEL2 = BIT1 + BIT2 ;                   
20
UCA0CTL1 |= UCSSEL_2;                     
21
UCA0BR0 = 104;                           
22
UCA0BR1 = 0;                             
23
UCA0MCTL = UCBRS0;                        
24
UCA0CTL1 &= ~UCSWRST;                     
25
IE2 |= UCA0RXIE;                          
26
}

Die Aufrufe im main:
1
UART_Init();
2
UART_String("Hello World");
3
Wait();
4
5
SPI_Init();
6
retValue=SPI_Send(Data);
7
8
UART_Init();
9
UART_Send(retValue);

Einezeln Funktioniert alles ... also nur UART oder nur SPI (jeweils 
andere Funktionen auskommentiert). UART gibt keine fehlerbehafteten 
Zeichen aus, SPI bekommt auf dem RX-Kanal den erwarteten Wert (0x02).

Der Wechsel von UART nach SPI und zurück klappt nicht. Folgendes 
Verhalten:
1)"Hello World" Ausgabe auskommentiert, Abfrage per SPI macht dann genau 
was sie soll, danach UART einschalten, Produziert ein fehlerbehaftetes 
Zeichen, danach normaler Betrieb.
2)"Hello word Ausgabe" aktiviert, Abfrage per SPI liefert auf dem 
RX-Kanal nur 0xFF ... danach UART-Verhalten wie in 1).

Hat jemand Erfahrung mit der Doppelverwendung des USCIA0 beim 
MSP430G2553?

Gruß
Weihnachtsbengel

von Weihnachtsbengel (Gast)


Lesenswert?

Hallo,

... sry wegen der ganzen Schreibfehler im vorherigen Posting. Da hab ich 
wohl etwas vorschnell auf Absenden geklickt :(

Kann mir vielleicht trozdem jemand einen Hinweis geben wie ich das 
Problem angehen kann?

LG
Weihnachtsbengel

von isio (Gast)


Lesenswert?

Ich würde mal damit anfangen, die '|='
wegzumachen.
Du weisst, dass Du UART machen willst, dann setze
halt die entsprechenden Bits mit einer Zuweisung ('='),
egal was vorher drinsteht. Dito für SPI.
Warum da mit den alten Werten 'rummachen.
Geht natürlich nicht immer, in dem Fall vermutlich aber schon.

Nächste Regel: Ein Register wird in einer
Funktion GENAU einmal beschrieben.
Falls das aus irgendwelchen Gründen einmal nicht geht,
müssen die Zugriffe der Übersichtlichkeit halber
beieinander gruppiert werden.
Alles andere ist eine Falle, in die Du früher
oder später tappst (oder schon 'drinsteckst).

von dododo (Gast)


Lesenswert?

isio schrieb:
> Ich würde mal damit anfangen, die '|='
> wegzumachen.
> ...

Ich denke, hier sind die aktiven Interrupts das Problem. Beim Umschalten 
sollten die gesperrt werden.

Wie immer fehlt der Teil, den es betrifft. :-(((

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.