Forum: Mikrocontroller und Digitale Elektronik MSP430 SPI-Schnittstelle


von Andreas (Gast)


Lesenswert?

Hallo zusammen,

ich möchte über die SPI-Schnittstelle einen Baustein ansprechen(Daten 
senden und entfangen)
Dazu möchte ich den STE-Pin (PIN-Bereich 3.0-3.3) auf Masse ziehen um 
den Slave-Baustein zu aktivieren und dann Daten senden. Im User Guide 
steht, man kann einen 3-Wire-System und ein 4-Wire-System einstellen. 
Mit dem 4-Wire-System geht der MC in den Slave-Mode wenn ich STE 
verändere (??).
Das kann doch nicht so schwer sein, Ze fix!!
Kann mir hier irgendjemand weiterhelfen Verzweiflung

Gruß
Andreas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

a) Welchen MSP430 verwendest Du?

b) Was ist das für ein Baustein, mit dem Du da kommunizieren willst?

c) Wer soll bei der Übertragung Master, und wer Slave sein?

von Andreas (Gast)


Lesenswert?

Ich verwenden den MSP430FG4619, dieser soll auch der Master sein.

Zu dem Baustein gibt es noch kein Datenblatt, wenn ich z.B. 0x20 an den 
Baustein sende, führt er etwas aus.

von Dennis (Gast)


Lesenswert?

Andreas schrieb:
> Im User Guide
> steht, man kann einen 3-Wire-System und ein 4-Wire-System einstellen.

3-Wire:

CLK
DIN
DOUT

4-Wire:

CLK
DIN
DOUT
STE

Der Mikrocontroller geht nicht automatisch in den Slave-Modus, nur weil 
du STE benutzt - STE regelt nur selbstständig die Chip-Select-Leitungen.

Leider fällt bei ihrer Benutzung ein weiter Kommunikationspin weg, da 
diese meist doppelt belegt sind - daher wird jeder, der die USCIs 
braucht, eine eigene CS-Leitung als normalen Port-Pin ausführen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas schrieb:
> Im User Guide steht, man kann einen 3-Wire-System
Hier werden MISO und MOSI verbunden, das ist auch bekannt als 
Microwire...
Damit können nicht wie bei SPI gleichzeitig Daten gesendet und 
empfangen werden.

> und ein 4-Wire-System einstellen.
Das dürfte der klassische SPI sein: SS, MOSI, MISO und SCLK.

Du solltest das Datenblatt nochmal genau lesen.
IdR. ist es so, dass der uC, wenn er als Master konfiguriert ist, nichts 
mit der SlaveSelect Leitung tut. Das mußt du selber in die Hand nehmen, 
und einen Portpin vor der Übertragung richtig setzen, und nachher wieder 
deaktivieren...

EDIT:
Dennis schrieb:
> 3-Wire:
>
> CLK
> DIN
> DOUT
Das ist ja ein blödes Interface.
Da fehlt jede Synchronisation auf Byte- bzw. Wortebene...

von Andreas (Gast)


Lesenswert?

Hat das noch keiner gemacht mit dem MSP430?
Ist doch normale Vorgehensweise, den CS auf LOW etc.

von nicht_eingeloggt (Gast)


Lesenswert?

Initialisierung sollte ungefähr so aussehen. Ist zwar von nem F5438, 
aber das ist alles recht ähnlich. Zu beachten ist dann noch, dass das 
Teil in diesem Fall eine RX-ISR braucht
1
void SpiUcb1Init (void)            
2
{
3
  P3OUT |= BIT6;              //cs high
4
  P3DIR |= BIT6;              // P3.6 output (CS)
5
  P3SEL |= 0x80;                            // P3.7 option select
6
  P5SEL |= 0x30;              //P5.4,5 option select
7
  UCB1CTL0 |= UCMST+UCSYNC+UCMSB;        //3-pin, 8-bit SPI master, MSB first
8
  UCB1CTL1 |= UCSSEL_2;                     // SMCLK -> 2MHz
9
  UCB1BR0 = 0x02;                           // /10=200kHz = ADC-SampleRate
10
  UCB1BR1 = 0;                              //
11
  UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
12
  UCB1IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
13
}

Das hier sendet einen 16 bit-Wert, wenn du MISO und MOSI miteinander 
verbindest solltest du gerade das wieder zurückbekommen, was du gesendet 
hast:
1
void SPI_Send_Command (unsigned int MST_Data)
2
{
3
  P3OUT &= ~BIT6;               // cs low
4
  while (!(UCB1IFG & UCTXIFG));
5
  UCB1TXBUF = (MST_Data >> 8);              // Transmit first character
6
  while (!(UCB1IFG & UCTXIFG));             // USCI_B0 TX buffer ready?
7
  UCB1TXBUF = (MST_Data & 0xff);
8
    while ((UCB1STAT & UCBUSY)); 
9
  P3OUT |= BIT6;              //CS high
10
}

von Dennis (Gast)


Lesenswert?

Andreas schrieb:
> Hat das noch keiner gemacht mit dem MSP430?
> Ist doch normale Vorgehensweise, den CS auf LOW etc.

Doch, das macht wohl jeder so!

Mach es in etwa so, wie "nicht_eingeloggt (Gast)" geschrieben hat, dann 
klappt das schon. Ein paar Sachen sind hier jedoch falsch!

Auf jeden Fall immer bevor du etwas an den USCI-Registern änderst, 
solltest du das Software-Reset-Bit setzen und danach wieder löschen.

Was du auch nicht machen solltest, ist das enablen der Interrupts ohne 
sie danach zu verwenden, oder zumindest einen Handler dafür zu 
erstellen.

nicht_eingeloggt schrieb:
> while ((UCB1STAT & UCBUSY));
>   P3OUT |= BIT6;              //CS high

Das hier klappt meistens, aber bei höheren Baudraten nicht immer.
Besser ist es, das RXIFG abzufragen:
1
...
2
UCB1IFG &= ~UCRXIFG
3
...sende letztes Byte
4
while (!(UCB1IFG & UCRXIFG)) {}
5
CS high

Noch besser wäre es natürlich wenn du die Interrupts nutzt und keine 
while-Schleifen drin hast, die bremsen halt alles.

von Andreas (Gast)


Lesenswert?

Was bedeutet ...
(UCB1IFG & UCTXIFG)
... Diese Register gibt es nicht!?

von nicht_eingeloggt (Gast)


Lesenswert?

Eigentlich ist das mehr oder weniger aus einer Application-Note von TI 
übernommen.

Dennis schrieb:
> Auf jeden Fall immer bevor du etwas an den USCI-Registern änderst,
> solltest du das Software-Reset-Bit setzen und danach wieder löschen.

Soweit ich das in Erinnerung habe, langt es mit UCB1CTL1 &= ~UCSWRST; 
nach der Konfiguration die Statemachine neu zu initialsieren.

Dennis schrieb:
> Das hier klappt meistens, aber bei höheren Baudraten nicht immer.
> Besser ist es, das RXIFG abzufragen:

> ...
> UCB1IFG &= ~UCRXIFG
> ...sende letztes Byte
> while (!(UCB1IFG & UCRXIFG)) {}
> CS high

hat bei mir immer so geklappt, aber wär mal n Versuch wert.

von nicht_eingeloggt (Gast)


Lesenswert?

Andreas schrieb:
> Was bedeutet ...
> (UCB1IFG & UCTXIFG)
> ... Diese Register gibt es nicht!?

Naja, es ist halt für einen anderen Controller. Ich schrieb ja, dass das 
im Prinzip immer gleich ist, aber es kann schon sein, dass dieses 
Register bei deinem Controller anders heisst.

BTW: Hast du mal auf der TI-Seite geguckt, die haben eigentlich immer 
ganz brauchbare Codebeispiele zu den einzelnen Controllern / Familien

von nicht_eingeloggt (Gast)


Lesenswert?

nicht_eingeloggt schrieb:
> BTW: Hast du mal auf der TI-Seite geguckt, die haben eigentlich immer
> ganz brauchbare Codebeispiele zu den einzelnen Controllern / Familien

Zum Beispiel hier:
http://www.ti.com/litv/zip/slac118d

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Andreas schrieb:
> ... Diese Register gibt es nicht!?

Das stimmt natürlich, es heisst
1
 UC1IFG & UCB1TXIFG

nicht_eingeloggt schrieb:
> Soweit ich das in Erinnerung habe, langt es mit UCB1CTL1 &= ~UCSWRST;
> nach der Konfiguration die Statemachine neu zu initialsieren.

Ja klappt meistens auch, das stimmt, aber siehe Bild - lieber auf Nummer 
sicher :-)

nicht_eingeloggt schrieb:
> hat bei mir immer so geklappt, aber wär mal n Versuch wert.

Ich weiß nicht genau, woran es liegt, aber ich habe mich mal Ewigkeiten 
mit genau dem Scheiss herumgeschlagen, weil ich aufs Busy-Register 
gewarte hab, aber immer ging CS zu früh hoch. Mit RXIFG klappt es immer.

Am besten ist aber klar immer die Interrupt-Lösung...manchmal natürlich 
oversized.

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

danke für die Hilfe.
Habe jetzt meinen MSP wie oben beschrieben initalisiert.
Sende jetzt z.B. 0x20.
Habe aber ein Problem mit dem MISO-Eingang.
Habe mal ein Oszi-Bild angehängt. Alle Leitungen sind nicht an ein 
Bauteil angeschlossen, also SPI-Schnittstelle ist offen.
Blau ist CLK, Rosa ist SIMO, Grün ist SOMI und Gelb ist CS.
Warum habe ich auf SOMI so ein gezappel. Schaut irgendwie nach 
einkopplungen durch den CLK aus?
Vielen Dank im voraus!

Gruß
Andreas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Andreas schrieb:
> Blau ist CLK, Rosa ist SIMO, Grün ist SOMI und Gelb ist CS.

Es wäre hilfreich, wenn Du zusätzlich noch die Eingangsnummern erwähnst, 
denn das angehängte Bild enthält zwei der genannten Farben nicht.

1 ist blau
2 ist türkis (oder meinetwegen "Hellblau")
3 ist violett (oder meinetwegen "Lila")
4 ist grün

von Andreas (Gast)


Lesenswert?

oh sorry.

türkis (2) ist CLK, lila (3) ist SIMO, Grün (4) ist SOMI und blau(1) ist 
CS.
Durch das Abspeichern haben sich die Farben verändert...
Hat jemand einen Plan?

von Andreas (Gast)


Lesenswert?

hat sich erledigt, danke

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.