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
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?
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.
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?
Hallo, Probier mal: 16 Bit Befehl schreiben Register auslesen 16 Bit dummy Daten schreiben Register auslesen -> ADC Daten lg Heinz
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.