Forum: Mikrocontroller und Digitale Elektronik SPI: Master empfangen, Slave senden


von Benjamin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe 2 Atmega8l über die SPI verbunden habe auch schon Zeichen vom 
Master an den Slave übergeben.
Nun soll aber Master als Empfänger dienen und der Slavew als Sender.
Habe hier auch nen Thread gefunden der darüber brichtet.

Beitrag "SPI: Master empfangen, Slave senden"

Jedoch krieg ichs irgendwie nicht gebacken.
Ich verwende zusätzlich eine 5. Verbindung(PIND7) um dem Slave zu 
signalisieren dass es jetzt senden darf.
Danach wird dann vom Master der SS PIN auf low geschalten.
Ich habe zur Kontrolle wann er stehen bleibt einige Zeichen über die 
RS232 Schnittstelle gesendet. Er bleibt dann im Masterprogramm in der 
Empfangsroutine hängen (weil SPIF nicht gesetzt wird).
Habe mal das Sende- und Empfangsprogramm angehängt, wäre nett wenn Ihr 
mir helfen köntet.

Besten Dank!

Benjamin

von Obelix (Gast)


Lesenswert?

SPI ist eine Syncrone Schnittstelle, sie braucht also einen Takt. Woher 
bekommt der Slave nun seinen Takt? Rischtisch ... vom Master. Die frage 
ist nun wie erzeigt der Master einen Takt? Man sendet einfach ein Dummy 
zum Slave und schon kommt der Takt aus dem Master raus.

von Ralph (Gast)


Lesenswert?

Hallo

Du musst die SPI als 5 Draht Schnittstelle betreiben.

1. MOSI     Master out
2. MISO     Master in
3. CLOCK
4. ChipSelect
5. BUSY/WAIT


Master sendet:

1. Master setzt ChipSelect auf LOW
2. Slave legt Sendebyte ins Senderegister und zieht BUSY auf Low
3. Master wartet bis Slave die BUSY auf LOW zieht
4. Master legt Datenbyte in Senderegister ==> Clock startet
5. Slave wartet auf empfang aller Bits , dann BUSY auf HIGH
6. Master wartet auf BUSY HIGH setzt dann Chipselect auf HIGH
7. bei weiteren Bytes beginn mit Punkt 1.


Slave sendet:
1. Slave zieht BUSY auf Low
2. Master erkennt BUSY = LOW ==> Sendeanforderung von SLAVE
3. Master setzt ChipSelect auf LOW
4. Slave zieht BUSY auf HIGH
5. Slave legt Sendebyte ins Senderegister und zieht BUSY auf Low
6. Master wartet bis Slave die BUSY auf LOW zieht
7. Master legt Dummybyte in Senderegister ==> Clock startet
8. Slave wartet auf empfang aller Bits , dann BUSY auf HIGH
9. Master wartet auf BUSY HIGH setzt dann Chipselect auf HIGH
10. bei weiteren Bytes beginn mit Punkt 1.




von Gad Z. (gad)


Lesenswert?

> Du musst die SPI als 5 Draht Schnittstelle betreiben.
Welch ein Blödsinn ist das denn?
Wozu gibt es wohl die SPI Spezifikation? Na damit alle SPI-Teilnehmer 
mit 4 Leitungen auskommen!!!

Das was Obelix geschrieben hat, ist die einzig richtige (saubere) 
Lösung.
Ich habe auch ein Sensor, der als SPI-Slave Daten an den Master schicken 
muß und ich mache es genau so wie oben beschrieben.
Einfach Slave Adressieren mit CS und Dummy-Bytes senden und nach jedem 
gesendeten Byte das Eingangsbyte einlesen.
Wichtig ist nur das Timing wo sich jeder Slave unterscheidet. Also die 
z.B. die Zeit vom CS=Low bis man das erste Byte raus taktet.
Da hier ja der Slave aber auch selbst programmiert ist, ist das schonmal 
garkein Problem, schließlich kennt man ja dann beide Seiten ganz genau 
:-)

von Ralph (Gast)


Lesenswert?

Dann lies mal die SPI Secs genau durch.

Spi kann als 3, 4 oder 5 Draht Schnittstelle aufgebaut werden, je nach 
Bedarf.

Nimm zb TMS 470 von TI ( ARM7 TDMI  µC) , dieser unterstützt die 5 Draht 
Variante sogar in Hardware.


Und wenn du mal genau nachliest, dann siehst du das die Obelix Variante 
in meinem Vorschlag ebenfalls zu finden ist.

Nur denk du dann jetzt auch mal nach wie der Slave dem Master mitteilen 
kann, das er Daten zu senden hat.
Der Master kann das natürlich auch erraten.
( Kristallkugel, Geisterbeschwörung, ....)

von Gad Z. (gad)


Lesenswert?

> Dann lies mal die SPI Secs genau durch.
Mhh ok ist schon ne Weile her das ich das so ganz genau durchgelesen 
habe...

> Spi kann als 3, 4 oder 5 Draht Schnittstelle aufgebaut werden, je nach
> Bedarf.
Stimmt, habe selber ne 3-Draht Variante...ups :-)

> Nimm zb TMS 470 von TI ( ARM7 TDMI  µC) , dieser unterstützt die 5 Draht
> Variante sogar in Hardware.
Genau in dem Fall sehe ich eher kein Bedarf dafür, zumal der hier 
verwendete MC die 5. Leitung eben nicht hardwareseitig unterstützt.

> Und wenn du mal genau nachliest, dann siehst du das die Obelix Variante
> in meinem Vorschlag ebenfalls zu finden ist.
Ja hast Recht, habs überlesen :-(

> Nur denk du dann jetzt auch mal nach wie der Slave dem Master mitteilen
> kann, das er Daten zu senden hat.
> Der Master kann das natürlich auch erraten.
Mit Raten hat es ja wohl nichts zu tun. Ganz einfach, der Master fordert 
die Daten nur an, wenn er sie auch braucht und der Salve schickt sie 
dann eben.
Denk du mal dran wie man mit einer zusätzlichen Leitung verschiedene 
Daten schicken will? Mit der zusätzlichen Leitung kann ja der Slave nur 
sagen, das er Daten hat.

Ich habe selber ein Master<->Slave und muß in beide Richtungen 
verschiedene Daten schicken. Aber bei mir sagt immer der Master, was er 
will und der Salve reagiert darauf und nimmt entweder Daten entgegen 
oder versendet welche, nachdem er die Sendeanforderung erhalten hat.
Die einzige "Ungewissheit" wäre, wenn sich der Slave aufhängt und 
garnicht antwortet. Aber das liegt ja dann nur daran, wie gut der 
Programmierer war :-)

Also sorry nochmal das ich so "voreilig" deine Variante schlecht geredet 
habe...

PS: Habe ich jetzt wieder was falsches gesagt ? :-)

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.