Forum: Mikrocontroller und Digitale Elektronik Problem mit Auslesen vom SPI Empfang


von Björn W. (bjoern2007)


Lesenswert?

Hallo zusammen,


ich habe einen AD Wandler über SPI an meinen MSP430F169 angeschlossen. 
Die Kommunikation steht und auf dem Oscilloskop kann ich den korrekten 
Versand von Befehlen an den AD Wandler, sowie die korrekte Rückantwort 
beobachten.

Mein Problem ist nun:
Ich sende 4 einzelne Bytes. Das erste enthält den Befehl, die restlichen 
drei schicke ich nur, um ein Clock-Signal zu erzeugen und die Antwort 
des AD Wandlers zu empfangen. Daher sind die letzten Drei Wörter auch 
leer. Allerdings schaffe ich es nicht, die Werte des Empfangsbuffers 
während der letzten drei Wörter abzuspeichern und weiter zu verarbeiten. 
Im Debug-Modus kann ihc aber erkennen, das der Empfangsbuffer die 
Korrekten Daten enthält.

Mein Code lautet folgendermaßen:
unsigned char ADS_RXTX(unsigned char data)   //Zum Senden und Empfangen 
eines Wortes
{
  while((IFG2 & UTXIFG1) == 0);       //ist der Tx Buffer leer?
  TXBUF1=data;                               //data senden
  while((IFG2 & URXIFG1) == 0);      //Byte im RX Buffer?
  return RXBUF1;                             //Empfangsbuffer auslesen
}

unsigned char ADS_read(unsigned char command) //drei Wörter senden und 
Antwort aufzeichnen
{
  unsigned char value1,value2,value3;

  ADS_RXTX(command);                       //send command
  value1=ADS_RXTX(0x00);                   //send clock no command
  value2=ADS_RXTX(0x00);                   //send clock no command
  value3=ADS_RXTX(0x00);                   //send clock no command

  return value2;
}

Soweit der Code. Leider werden die Variablen value2 und value3 nicht 
beschrieben. Eigentlich soll hier dann später auch mal die 
Weiterverarbeitung erfolgen, aber es hapert ja hier schon...

Hat jemand ne Idee, wie ich das korrigieren könnte?


Gruß und vielen Dank,
Björn

von Falk B. (falk)


Lesenswert?

Björn W. wrote:

> leer. Allerdings schaffe ich es nicht, die Werte des Empfangsbuffers
> während der letzten drei Wörter abzuspeichern und weiter zu verarbeiten.

> Mein Code lautet folgendermaßen:
> unsigned char ADS_RXTX(unsigned char data)   //Zum Senden und Empfangen
> eines Wortes
> {
>   while((IFG2 & UTXIFG1) == 0);       //ist der Tx Buffer leer?
>   TXBUF1=data;                               //data senden
>   while((IFG2 & URXIFG1) == 0);      //Byte im RX Buffer?
>   return RXBUF1;                             //Empfangsbuffer auslesen
> }

Sind das nicht die falschen Bits? Du musst erst prüfen, ob die 
Übertragung beendet ist, dann RXBUF auslesen. Ich hab im Moment kein 
Datenblatt hier, aber da sollte man schon was finden. Schau dir die 
Statusbits genau an.

MfG
Falk

von Björn W. (bjoern2007)


Lesenswert?

Hm. Das empfangen klappt eigentlich. Ich habe das per Oszilloskop 
überprüft...

Komischerweise wird die Variable "value1" auch richtig befüllt, aber die 
Variablen "value1" und "value1" bekommen keinen Wert zugewiesen, obwohl 
"ADS_RXTX(0x00)" insgesamt wirklich dreimal ausgeführt wird.

von Björn W. (bjoern2007)


Lesenswert?

Ich meinte natürlich "value2" und "value3" werden nicht befüllt...

von Falk B. (falk)


Lesenswert?

@ Björn W. (bjoern2007)

>Hm. Das empfangen klappt eigentlich. Ich habe das per Oszilloskop
>überprüft...

Klar, die Daten klingeln in den Controller, aber du liest sie 
wahrscheinlich zu ZEITIG!

MfG
Falk

von Björn W. (bjoern2007)


Lesenswert?

wie kann ich das denn verzögern?
Einfach etwas warten zwischen senden und empfangen (z.B. Variable 
hochzählen)?

Allerdings mecker die IAR auch beim compilieren und sagt, die Varaiblen 
"value2" und "value3" würden zwar inizialisiert, aber nie verwendent?!?

von Falk B. (falk)


Lesenswert?

@ Björn W. (bjoern2007)

>wie kann ich das denn verzögern?

NEIN!!! Dafür gibt es Statusbits, die sagen, dass die Übertragung 
beendet ist.

>Allerdings mecker die IAR auch beim compilieren und sagt, die Varaiblen
>"value2" und "value3" würden zwar inizialisiert, aber nie verwendent?!?

Naja, dann kann es passieren dass die rausoptimiert werden. Deklarier 
die mal als volatile.

MfG
Falk

von Björn W. (bjoern2007)


Lesenswert?

Hm. Tut mir leid, ich habe vor ein paar Wochen erst angefange, und lerne 
so langsam auch erst die Programmiersprache.

wie deklariert man denn Variablen als "volatile"?

von Falk B. (falk)


Lesenswert?

@ Björn W. (bjoern2007)

>Hm. Tut mir leid, ich habe vor ein paar Wochen erst angefange, und lerne
>so langsam auch erst die Programmiersprache.

Kein Problem.

>wie deklariert man denn Variablen als "volatile"?
1
volatile int value1, value2, value3;
MfG
Falk

von Björn W. (bjoern2007)


Lesenswert?

Also, ich habe es mit volatile versucht, aber es bleibt das gleiche 
Bild.

Aber ich habe gerade festgestellt, daß je nachdem, welche Valiable über 
den Befehl "return value2" verwendet wird, die ach beschrieben wird. 
Wenn da "return value1" steht, wird value1 beschrieben, etc.

von Jens B. (sio2)


Lesenswert?

Tja, der Compiler kompiliert halt die anderen Variablen weg, da sie eh 
nicht benutzt werden, ausser lokal.

von Björn W. (bjoern2007)


Lesenswert?

jau, jetzt klappts. Man muß die Variablen nur wieterverwenden... ;-)

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.