Problem mit Auslesen vom SPI Empfang

OP #649886
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
#649927
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
OP #650001
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.
#650010
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
#650016
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

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