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
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
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.
@ 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
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?!?
@ 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
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"?
@ 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"?
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.