mikrocontroller.net

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


Autor: Benjamin (Gast)
Datum:
Angehängte Dateien:

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

Autor: Obelix (Gast)
Datum:

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

Autor: Ralph (Gast)
Datum:

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




Autor: Gad Zinkler (gad)
Datum:

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

Autor: Ralph (Gast)
Datum:

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

Autor: Gad Zinkler (gad)
Datum:

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

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.