MSP430G2553: SPI Empfang von Daten

Gast #3236702
Lesenswert?

Hallo zusammen!

Ich würde gerne mithilfe des MSP430G2553 Daten per SPI empfangen und 
bekomme nach stundenlangem Herumprobieren leider nichts in den 
Empfang-Buffer. Der Slave ist aktiv bei CS=LOW.

Hoffentlich könnt ihr mir weiterhelfen!

Die Beschaltung ist folgende:

P 1.5 -> SCK
P 1.6 -> MISO
P 1.7 -> Slave Select         (also insgesamt laut Datenblatt USCI_B0)



Als Code habe ich mir folgendes zusammengebastelt (teils aus dem 
Internet, teils eigene Überlegungen).

1
int temp=0;     //in diese Variable sollen die empfangenen Bits rein
2

3

4
void pinConfig()    // MISO, SCK und CS einstellen
5
{
6
    P1SEL = BIT5 + BIT6;      // MISO + SCK
7

8
    P1DIR &= ~BIT6;      //MISO als Eingang
9
    P1DIR |= BIT5;      //SCK als Ausgang
10
    P1DIR |= BIT7;      //CS als Ausgang
11
    P1OUT |= BIT7;                      //CS auf HIGH 
12
}
13

14

15
void spiConfig()
16
{
17
 UCB0CTL1 = UCSWRST; // reset
18
 UCB0CTL0 |= UCCKPL +UCMST  + UCSYNC +UCMSB; // synchronous (=SPI) master 3 wire SPI, clock polarity High
19
 UCB0CTL1 |= UCSSEL_2; //use SCLK : 4MHz (MCP4131 supports up to 10MHz write via SPI)
20
  // set baud rate = SMCLK, no further division
21
 UCB0BR0 = 0;
22
 UCB0BR1 = 0;
23
 UCB0CTL1 &= ~UCSWRST; // **Initialize USCI **
24
}
25

26

27
void getValue(unsigned char dataOut)
28
{
29
 P1OUT &= ~BIT7; // aktiviere Slave 
30

31
 IFG2 &= ~ (UCB0RXIFG);  // Lösche Flags
32
 IFG2 &= ~ (UCB0TXIFG);
33
 UCB0TXBUF = dataOut;  // Send command
34
 while ((IFG2 & UCB0TXIFG)==0); // wait for TX buffer ready
35
 while ((IFG2 & UCB0RXIFG)==0); // wait for TX buffer ready
36

37
 temp=UCB0RXBUF;
38

39
 P1OUT |= BIT7; // deaktiviere Slave
40
}
41

42
void main(){
43
...
44

45
getValue(0);   // Schicke Dummy Wert 0, "erhalte" temp
46

47
...
48
}


Bedanke mich für jede Hilfe im Voraus!

Beste Grüße

Der µC-Anfänger
Gast #3236728
Lesenswert?

Da der MSP nur Daten empfangen soll und der Slave ohnehin keinen Input 
für MOSI hat wird MOSI folglich nicht verwendet.

Ich habe irgendwo im Internet gelesen, dass dennoch in den Sendebuffer 
ein Dummy Wert geschrieben werden muss da beim SPI Senden und Empfangen 
immer gleichzeitig durchgeführt werden (daher auch mein Code).

Den Oszi habe ich leider nur in der Uni, und die hat heute leider zu..
Da ich schaltungstechnisch keine Fehler erkennen kann, gehe ich stark 
davon aus dass am Code etwas nicht stimmen kann.

Grüße
Persönliche Seite #3236736
Lesenswert?

Das heißt, dein Slave quatscht los, sobald /CS low ist und er einen Takt 
hat? Interessantes Konzept.

- Die Clock-Polarität könnte falsch sein, da ist Ausprobieren 
hilfreicher als die Doku (so meine Erfahrung).
- Du hast keine 3-Wire-SPI, sondern 4-Wire mit einem nicht belegten MOSI 
(eher ungewöhnlich). 3-Wire wäre ohne /CS.
- Wieso wartest du zweimal auf den Sendepuffer?

Max
Gast #3236769
Lesenswert?

Zumindest laut Datenblatt des Slaves, ja. Sobald Slave aktiv ist, 
startet die Konvertierung bis Slave inaktiv ist (natürlich Clock 
vorausgesetzt).

Wieso ich zweimal auf den Buffer warte ist mir ehrlich gesagt auch nicht 
so wirklich klar, da ich den Lösungsvorschlag im Internet gefunden habe, 
wo es hieß dass die Übertragung des ersten Bytes erst abgeschlossen ist, 
wenn auch die Antwort eingegangen ist.

Die Polarität habe ich auch jetzt geändert, hat leider nichts geändert.

Wie wahrscheinlich ist es, dass an der oben angegebenen Taktung etwas 
nicht stimmt?

Beste Grüße
Gast #3239227
Lesenswert?

Der Maxim Sklave spricht laut Datenblatt auf ein sehr simples SPI 
Protokoll an. Mit drei Pins des MSP430 lässt sich alles schnell 
erledigen: Ein Pin generiert das CS Signal, der zweite das Clocksignal 
und der dritte fragt die jeweiligen Pegel am Datenausgang des Sklaven 
ab. Man muss nur wissen (wohlgemerkt, wissen nicht vermuten) wie man die 
MSP430 Pins als Ausgang bzw. Eingang konfiguriert, mehr nicht. Den 
Anfänger verwirrenden Krimskrams mit interruptgesteuertem USCI-SPI 
braucht man für erste Gehversuche nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren