www.mikrocontroller.net

Forum: Compiler & IDEs SPI - MISO


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gestern schonmal ein Posting
(http://www.mikrocontroller.net/forum/read-2-359493.html) gemacht. Da
ich jetzt noch einen kleinen Fehler habe, mache ich nochmal einen neuen
Thread auf.

Bisher klappt die Datenübertragung nur vom Master (ATMEGA128) zum
Sklave (ATMEGA32), indem der Master in der Überlauf-ISR eines Timers
folgendes macht:
- /SS auf Low
- SPDR laden und warten auf fertig (Flag-Auswertung)
- /SS auf high
(Portrichtung PORTB: /SS, SCK und MOSI output "DDRB = 0x07")

Auf der Sklave-Seite wird via ISR (SPI Data complete) der empfangene
Datenframe an PORTC via "PORTC = SPDR" angezeigt.
(Portrichtung PORTB: alle input)

Soweit klappt alles einwandfrei. Wie kann ich jetzt gleichzeitig einen
Datenframe vom Sklave zum Master übertragen?

Ich habe die Portrichtung des Sklave auf DDRB = 0x40 (MISO -> Output)
gesetzt. Beim Lesen des Datenblattes habe ich ein paar Probleme. Hier
wird beschrieben, dass der Transmitvorgang einfach gepuffert und der
Receive doppelt gepuffert ist. Wie beschreibe ich jetzt in der
richtigen Reihenfolge das SPI-Datenregister SPDR?

Ich wollte es so machen:

- Sklave:
//SPI transfer complete
ISR(SPI_STC_vect)
{
  uint8_t tmp_sreg = SREG; //backup SREG with actual sei()
  cli(); //disable global interrupt

  SPDR = 0x04; //MISO-Dode
  PORTC = SPDR; //MOSI-Data
  SREG = tmp_sreg; //restore SREG
}

-Master:
Auswertung via ISR des eingehenden Datenframes.

Dabei kommt aber nur Mist. Hat jemand eine Idee?

Viele Grüße
Thomas

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,
wenn man es nicht besser weiß, soll man lieber den Mund halten. Aber
ich glaube zumindest in der avr-libc vor ca. 2 Jahren mal gelesen zu
haben, daß die ganzen Register (nicht nur SREG) bei Aufruf einer ISR
gepusht und am Ende auch wieder gepoppt werden. Auch das cli() sollte
überflüssig sein, da es auch automatisch gemacht wird, da es wohl fast
ausschließlich so sein sollte (außer man will nested interrupts
machen).

Zur Deiner eigentlichen Frage kann ich leider nix sagen, sorry.

Gruß
Lutz

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lutz' Vermutung ist korrekt: Das Sichern der Register und des SREG
geschieht automatisch durch den Compiler, das Löschen des I-Bit im SREG
beim Einsprung in die ISR und das erneute Setzen beim Verlassen macht
die µC-Hardware!

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Hinweis. Ich muss ehrlich sagen, dass ich vor ca. 2
Jahren das GCC-Tutorial durchgearbeitet hatte und da wurde die
Sicherung noch so beschrieben. Irgendwie habe ich das einfach
beibehalten. Wenn es jetzt nicht mehr erforderlich ist, kann ich mir
ein paar Zeilen Code sparen ;-).

Ich werde morgen nochmal systematisch das Datenblatt durchgehen, in
welcher Reihenfolgen des Lesen und Neubeschreiben des
SPI-Datenregisters gemacht werden muss.

Viele Grüße
Thomas

Autor: Christian Fasthuber (fasti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Also soweit ich weiß musst du die Daten die der Slave übertragen soll
einfach ins SPDR Register schreiben. Sobald der Master eine Übertragung
initialisiert (SS auf low) werden die Bits vom Master in den Slave und
gleichzeitig (weil Ringbuffer) vom Slave in den Master geshiftet. nach
der Übertragung brauchst du nur noch das SPDR Register des Master
auslesen und schon hast du die Daten vom Slave.

mfg

Fasti

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.