Forum: Mikrocontroller und Digitale Elektronik SPI auf SAM7 - Empfangszeitpunkt


von Florian (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Florian (Gast)


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.

von Andreas B. (Gast)


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?

von Heinz (Gast)


Lesenswert?

Hallo,

Probier mal:

16 Bit Befehl schreiben
Register auslesen
16 Bit dummy Daten schreiben
Register auslesen -> ADC Daten

lg Heinz

von Andre (Gast)


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 ;-)

von Florian (Gast)


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.

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.