Forum: Mikrocontroller und Digitale Elektronik MSP430G2553: SPI Empfang von Daten


von µC-Anfänger (Gast)


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

von Max G. (l0wside) Benutzerseite


Lesenswert?

Was ist mit MOSI? HAst du mal die Signalleitungen mit einem Oszi 
angeschaut?

SPI ist ein Schieberegister, nur wenn der Master was sendet, antwortet 
auch der Slave.

Max

von µC-Anfänger (Gast)


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

von Max G. (l0wside) Benutzerseite


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

von µC-Anfänger (Gast)


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

von Cago-Kult Guru (Gast)


Lesenswert?

Gib lieber die Typenbezeichnung des Slaves preis, eher die Leute ihre 
Glaskugeln ganz abreiben.

von µC-Anfänger (Gast)


Lesenswert?

Gute Idee, hätte früher darauf kommen können!

http://www.adafruit.com/datasheets/MAX6675.pdf

von µC-Anfänger (Gast)


Lesenswert?

Keiner eine Idee? :(

von Jim M. (turboj)


Lesenswert?

Nach dem von Dir verlinkten Datenblatt darf zwischen den 2 SPI 
DatenBytes der CS nicht auf high Pegel gehen. Deine Lesefunktion macht 
genau das.

Außerdem können weitere Fehler in dem Teil des Codes stecken, den Du uns 
vorenthältst.

von Arduinofan (Gast)


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.

von MSP (Gast)


Lesenswert?

TIs Wiki zeigt ein Beispiel
http://processors.wiki.ti.com/index.php/Using_a_Digital_Potentiometer_via_SPI_with_a_MSP430
mit Grace und weiter unten ohne.

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.