SPI auf SAM7 - Empfangszeitpunkt

Gast #2084154
Lesenswert?

Hallo zusammen,

ich hätte mal eine Frage zum Datenempfang per SPI auf dem AT91SAM7X256 
von Atmel. Vielleicht hat ja jemand von euch Erfahrung damit und kann 
mir weiterhelfen.

Folgendes Problem:
Es geht um die SPI Kommunikation mit einem externen AD-Wandler.
Der SPI Controller ist auf 16 Bit Datenwörter eingestellt (passend zur 
Spezifikation des ADC).
Ich sende jetzt die Anfrage per SPI raus, und warte eine gewisse Zeit. 
Dann muss ich ja, aufgrund der Funktionsweise mit Shift-Registern erneut 
etwas senden (bzw. zumindest für eine Clock sorgen), um die Antwort des 
ADC zu empfangen. Der ADC schickt auch die richtige Antwort raus (habe 
das mit einem Logic Analyzer geprüft).

Ich warte nun, dass mir das RDRF-Bit im Status Register anzeigt, dass 
der Empfang abgeschlossen wurde. Danach lese ich das Receive Data 
Register aus.
Aus irgendeinem Grunde stehen hier aber nicht die soeben empfangenen 
Daten drin (die ich ja über den Logic Analyzer sehen konnte), sondern 
die Daten vom Empfang davor. Die richtigen Daten kommen erst beim 
wiederum nächsten Sendevorgang rein.
Ich könnte jetzt jedesmal noch einen zusätzlichen Sendevorgang einbauen, 
aber das ist ja nicht Sinn der Sache.
Hat von euch jemand eine Idee, woran das liegen könnte?
Danke schonmal!

Viele Grüße
Florian
Moderator (Firma: Titel) Persönliche Seite #2084165
Lesenswert?

Florian schrieb:
> mit einem externen AD-Wandler.
Da wäre jetzt interessant, welcher das ist...

> Ich sende jetzt die Anfrage per SPI raus, und warte eine gewisse Zeit.
Wozu wartest du?

> Danach lese ich das Receive Data Register aus.
> Aus irgendeinem Grunde stehen hier aber nicht die soeben empfangenen
> Daten drin (die ich ja über den Logic Analyzer sehen konnte), sondern
> die Daten vom Empfang davor. Die richtigen Daten kommen erst beim
> wiederum nächsten Sendevorgang rein.
Hört sich irgendwie nach Double-Buffering an...
Wie sieht es aus, wenn du die Daten 2 mal hintereinander aus dem 
Register liest?
Gast #2084788
Lesenswert?

danke für den Tipp!
Momentan werde ich aus dem Ergebnis noch nicht ganz schlau: Wenn ich das 
Register zweimal bloß auslese und den Wert in einer (volatile) Variable 
speichere, wird beide male der falsche Wert zurückgegeben.

Wenn ich den Wert aber zB. über CAN versende, habe ich beide Male (also 
auch beim ersten Auslesen) den richtigen Wert....seltsam irgendwie.

Naja, werd mal weiter debuggen. Vielleicht find ich ja noch was.
Gast #2084807
Lesenswert?

Florian schrieb:
> Momentan werde ich aus dem Ergebnis noch nicht ganz schlau: Wenn ich das
> Register zweimal bloß auslese und den Wert in einer (volatile) Variable
> speichere, wird beide male der falsche Wert zurückgegeben.

Es ist doch hoffentlich der Registerzugriff volatile und nicht nur die 
Variable?
Gast #2085246
Lesenswert?

Das funktioniert nicht. Das war die erste Variante, die wir ausprobiert 
hatten.
Ich muss morgen mal gucken, zu was der Compiler das ganze baut, wenn die 
variable volatile ist. Ich habe angst, dass der das trotzdem 
wegoptimiert...

dann mehr infos ;-)
Gast #2085891
Lesenswert?

Soo, wir haben eine Lösung gefunden.
Zusätzlich zum RDRF (Receive Data Register Full) Bit fragen wir jetzt 
vor dem Auslesen des Receive Data Registers auch das TXEMPTY Bit im 
Status Register ab.
Aus irgendeinem Grund scheint das RDRF Flag nämlich vor Beginn der 
Transmission gesetzt zu sein, obwohl es ja eigentlich beim Lesen 
gelöscht werden sollte.

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