Forum: Mikrocontroller und Digitale Elektronik Slave SPI


von Dirk (Gast)


Lesenswert?

Hi,

ich habe ein kleines Problem mit meinem Mega8 im HW SPI Slave Mode.

Der /SS Pin wird als Triggerinput genutzt. Ich hab das komplette
Datasheet nach einem Interrupt Vektor danach abgesucht.

Ich möchte eigentlich ungern den /SS Pin Pollen , aber anscheinend gibt
es keinen Int Vector wie z.B. die externen Int's diesen besitzen.

Bin ich zu blind ?  oder bleibt mir keine andere Moeglichkeit als den
/SS Pin zupollen?

Eine kurze andere Frage haette ich auch noch.

Ich hab hier ein paar Atmel Flashspeicher liegen. Bei einigen Projekten
habe ich gesehen das Bilder/Font's in einem externen EEprom
gespeichert werden.

Dieses sollte doch auch über mit dem Flashspeicher moeglich sein oder
gibt es Probleme ?

Mfg
Dirk

von Mike (Gast)


Lesenswert?

Das ist ein Hardware-Interface. Wird dieser Pin angesprochen, werden
Daten korrekt empfangen. Du musst dich darum nicht kümmern.

von Dirk (Gast)


Lesenswert?

Hi,

ok die daten werden richtig empfangen. Ich dachte man koennte dann auch
gleich die Daten verarbeiten. So muss ich nun immer erstmal schaun ob
Daten empfangen wurden.

Was mach ich aber wenn ich mehr Daten vom Master empfange ? Das SPI
Register ist doch nur 8Bit breit?

Die Daten in ein Buffer zusammeln ist mir schon klar , aber woher weiss
ich nun das Daten empfangen wurden?

Ein Receive Int. gibt es auch nicht.

Man mir da jemand ein Tipp geben?

Mfg
Dirk

von Martin (Gast)


Lesenswert?

hm ist das nicht so wie beim SPI Master das es einen SPI INT gibt?

von Dirk (Gast)


Lesenswert?

Hi,

ich hab mich fachlich nicht richtig ausgedrueckt. Ein Receive Int gibt
es schon.

Ich hab die SPI_receive Routine aus dem Datasheet genommen. Springt er
jetzt sobald /SS aktiv ist die Funktion an ?

Mfg
Dirk

von Justus (Gast)


Lesenswert?

Ok SPI und IIC wurden schon 1000 mal besprochen aber trotzdem habe ich
keine richtige Antwort gefunden, deshalb greif ich diesen Thread
nochmal auf.

Mein Problem ist eigentlich das gleich das Dirk als erstes schon
angesprochen hat.
Was ich realisieren möchte bzw. muss:

1 Master und 5 Slaves
Der Master sendet ein Byte an den Slave den er über SS auswählt.Es ist
doch richtig das nur ein Interrupt für SPI zur Verfügung steht und
dieser Ausgelöst wird wenn alle 8 Bit aus dem SPDR rausgeschiftet
wurden, quasi die Übertragung eines Bytes beendet ist?!
Also das Byte welches ich sende dient als Start-Befehl für den Slave um
eine Routine auszuführen (Dauert einige Zeit, da Steuerung eines
Mechanischen Aufbaus). Wenn diese erfolgreich ausgeführt wurde soll ein
OK, wenn nicht ein ERROR (Wieder ein bestimmtes Byte) an den Master
zurückgesendet werden.
So, ein Zyklus wird durch setzen von SS auf Low initialisiert und eine
Übertragung wird ja durch schreiben eines Bytes in SPDR initialisiert
und der Interrupt nur bei fertiger Übertragung, nicht bei einem Empfang
oder Änderung des SS von High auf Low ausgelöst.
Mein Slave weiss quasi nie wann Daten gekommen sind, d.h. ich kann es
nicht per Interrupt o.ä. abfragen.

Da mein Slave erst dann was senden soll wenn er fertig ist komm ich
nicht so ganz damit klar dies ganz simpel zu realisieren.

Bevor ihr mir den Rat geben wollt IIC oder UART zu nehmen versucht mir
bitte in SPI nen Tipp zu geben.
Tja und sonst muss ich halt umschwenken.

Thx!!!

von peter dannegger (Gast)


Lesenswert?

Das SS ist eine Art Chip-Enable, d.h. der Master muß es low setzen,
bevor er anfängt, Bits zu schieben.

Und wenn der Master die 8 Bits rausgeschoben hat, bekommst Du auch
Deinen Interrupt, vorher wäre doch witzlos.


Das Auslesen eines Slaves ist komplizierter:

Der Master dreht ne Weile Däumchen, bis er der Meinung ist, der Slave
könnte was in den Sendepuffer geschrieben haben, und dann wieder SS =
low und 8 Bits einlesen.

Hat der Slave es aber nicht geschafft, dann liest der Master genau das
aus, was er beim letzten Mal zum Slave gesendet hatte.


Peter

von Justus (Gast)


Lesenswert?

"Das SS ist eine Art Chip-Enable, d.h. der Master muß es low setzen,
bevor er anfängt, Bits zu schieben.

Und wenn der Master die 8 Bits rausgeschoben hat, bekommst Du auch
Deinen Interrupt, vorher wäre doch witzlos."

Schon alles klar. Hab ich was anderes erzählt???

"...das nur ein Interrupt für SPI zur Verfügung steht und
dieser Ausgelöst wird wenn alle 8 Bit aus dem SPDR rausgeschiftet
wurden"

Naja, egal.


Interessanter dagegen:

"Der Master dreht ne Weile Däumchen, bis er der Meinung ist, der Slave
könnte was in den Sendepuffer geschrieben haben, und dann wieder SS =low
und 8 Bits einlesen.

Hat der Slave es aber nicht geschafft, dann liest der Master genau das
aus, was er beim letzten Mal zum Slave gesendet hatte."


Das heisst ja auch das das SPDR nicht gelöscht wird, wenn ich die
empfangenen Daten z.B. in eine Variable schreibe.
Passiert mir nämlich. Dann müsste ich also ununterbrochen den Slave
abfragen, und das so lange bis die Daten die der Master bekommt,
verschieden sind von denen die er zuletzt geschickt hat.
(Ausser ich weiß das nach einer bestimmten Zeit zu 100% neue Daten vom
Slave zur Verfügung stehen).

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.