mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI auf SAM7 - Empfangszeitpunkt


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Probier mal:

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

lg Heinz

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.