hi,
hoffe ich krieg mein problem gut erklärt.
bei mir läuft spi soweit, bloß will ich auch, dass der slave mir sofort
daten sendet.
ich sende mit dem master entweder das char 'Z' oder 'R'.
wenn der slave etwas erhält, startet ISR(SPI_STC_vect)
falls etwas anderes als R ankommt, dann soll der wert, der der slave
erhält, angezeigt werden.
bei 'R' soll der slave zum master 'X' übertragen.
wenn ich 'Z' vom master zum slave sende, kommt Z beim slave korrekt an
und wird auf einem Display angezeigt.
wenn ich jedoch 'R' vom master zum slave sende (per Knopfdruck),
passiert erstmal nichts, erst wenn ein zweites mal 'R' gesendet wird,
erhaltet der master sein 'X'.
ich weiß, dass das interrupt startet, wenn die übertragung erfolgt ist
und das spif bit gesetzt wurde.
hier ist der code vom slave
bestname_torben schrieb:> if(buffer == 'R')> {> SPI_Transmit_char('X'); // X senden> }
Aha.
Und wie soll der Slave senden ?
Takt wird vom Master erzeugt, also kann der Slave erst beim nächsten
Senden vom Master etwas zurücksenden.
bestname_torben schrieb:> wenn ich jedoch 'R' vom master zum slave sende (per Knopfdruck),> passiert erstmal nichts, erst wenn ein zweites mal 'R' gesendet wird,> erhaltet der master sein 'X'.
Logisch.
Woher soll denn der Slave wissen, was er im Austausch antworten soll,
wenn er noch gar nicht gesehen hat, was der Master will?
SPI ist ein Austausch von Bytes!
Während 1 Byte vom Master zum Slave geht, geht 1 Byte vom Slave zum
Master.
Wenn der Master daher was vom Slave will, muss es 2 derartige
Austauschmanöver geben. Das erste, damit der Master seinen Wunsch dem
Slave vorträgt, das zweite damit er dem Slave die Gelegenheit gibt,
seine Antwort kund zu tun.
Der Slave kann von sich aus überhaupt nichts tun. Alle Aktivität liegt
beim Master.
Beim Slave SPI Senden des AVR haben schon viele graue Haare gekriegt und
sie sich dann büschelweise ausgerissen.
Der Master muß nach jedem Byte lange Gedenkpausen einlegen, damit der
Slave alle laufenden Interrupts beenden, in den SPI-Interrupt springen,
die Daten parsen und das Sendebyte laden kann.
Je nach Aufwand und Programmierfertigkeiten werden dafür ~50..500
Slave-CPU-Zyklen benötigt.
DerMitDerShiftTaste schrieb:> "gelöst" würde ich das nicht nennen, eher "hingeferkelt"
Dann erzähl doch mal, wie man das besser macht. Dass man das auch
'gelöst' nennen kann.
mfg.
Thomas Eckmann schrieb:> Dann erzähl doch mal, wie man das besser macht. Dass man das auch> 'gelöst' nennen kann.
Vielleicht richtig ?
Was hat der Troll überhaupt gelöst ?
Jeder normaler Mensch würde sagen:
Danke an Alle, jetzt weiss ich wie es funktioniert.
Und doppelt senden ist mit Sicherheit nicht gelöst.
Thomas Eckmann schrieb:> Dann erzähl doch mal, wie man das besser macht.
- einen Slave mit benutzbarem SPI nehmen (Sendepuffer)
- eine Handshakeleitung
- lange warten
Thomas Eckmann schrieb:> Wie wäre es denn, wenn ihr Nasen mal schreibt, wie man das richtig> macht?
Wie wäre es denn, wenn du mir mal den Buckel runterrutschst ?
Außer regelmäßigem Abschreiben von mir hast du nicht viel gezeigt.
Aber OK, für euch unwissende Nasen mal ganz kurz:
bestname_torben schrieb:> bei mir läuft spi soweit, bloß will ich auch, dass der slave mir sofort> daten sendet.
Slave kann beim ersten bit überhaupt nicht wissen was der Master von
ihm will, ist das euch Nasen klar ?
Deswegen sendet man zuerst ein Byte in welchem mitgeteilt wird was
verlangt wird (Daten, Zustand, etc.)
Wenn der Slave mit Datenbearbeitung beschäftigt ist, wird SPDR mit
NotReady geladen.
Wenn der Slave mit seinen Hausaufgaben fertig ist, wird SPDR mit
Ready geladen.
Und dieser Wert wird von Slaven beim ersten Byte zurückgesendet.
Wenn Master ein Ready empfängt, wird zweites Byte (natürlich etwas
zeitverzögert) gesendet. Währenddessen sendet der Slave den verlangten
Wert zurück.
Und dieses zweite Byte kann dann ein Befehl für den Slaven sein, was
er als nächstes machen soll oder auch nur ein ACK.
Wenn der Master ein NotReady empfängt, wird das zweite Byte gar nicht
erst gesendet, klar ?
Ich hoffe, dich aus deinem Abgrund der Unwissenheit wenigstens ein
bisschen hochgezogen zu haben.
Ganz nach oben ist aber ein weiter Weg, da musst du alleine klettern.
Marc Vesely schrieb:> Wenn der Slave mit seinen Hausaufgaben fertig ist, wird SPDR mit> Ready geladen.> Und dieser Wert wird von Slaven beim ersten Byte zurückgesendet.
Bist Du da aus dem Tritt gekommen?
Master und Slave senden immer "gleichzeitig Zeitversetzt" - oder?
Master 1. Byte - Slave lululu
Master 2. Byte - Slave ggf. Antwort auf 1. Byte Master
Für jedes Bit, das der Master sendet gibt es 1 Bit vom Slave "im
Austausch". Daher kann der Slave auch nur "Zeitversetzt" Antworten.
Das beschreibst Du hier ja auch vollkommen (aus meiner Sicht) korrekt:
Marc Vesely schrieb:> Wenn Master ein Ready empfängt, wird zweites Byte (natürlich etwas> zeitverzögert) gesendet. Währenddessen sendet der Slave den verlangten> Wert zurück.Marc Vesely schrieb:> Ganz nach oben ist aber ein weiter Weg, da musst du alleine klettern.
Habe die Leiter ein wenig verrückt :-)
Marc Vesely schrieb:> Slave kann beim ersten bit überhaupt nicht wissen was der Master von> ihm will, ist das euch Nasen klar ?>> Deswegen sendet man zuerst ein Byte in welchem mitgeteilt wird was> verlangt wird (Daten, Zustand, etc.)>> Wenn der Slave mit Datenbearbeitung beschäftigt ist, wird SPDR mit> NotReady geladen.> Wenn der Slave mit seinen Hausaufgaben fertig ist, wird SPDR mit> Ready geladen.> Und dieser Wert wird von Slaven beim ersten Byte zurückgesendet.> Wenn Master ein Ready empfängt, wird zweites Byte (natürlich etwas> zeitverzögert) gesendet. Währenddessen sendet der Slave den verlangten> Wert zurück.> Und dieses zweite Byte kann dann ein Befehl für den Slaven sein, was> er als nächstes machen soll oder auch nur ein ACK.>> Wenn der Master ein NotReady empfängt, wird das zweite Byte gar nicht> erst gesendet, klar ?
Siehste. Geht doch.
Aber erstmal unqualifiziert rummotzen:
Marc Vesely schrieb:> Vielleicht richtig ?>> Was hat der Troll überhaupt gelöst ?>> Jeder normaler Mensch würde sagen:> Danke an Alle, jetzt weiss ich wie es funktioniert.>> Und doppelt senden ist mit Sicherheit nicht gelöst.
mfg.
"Slave Ready/NotRead"
sollen das jetzt feste Bitmuster sein die der Slave dem Master sendet
oder was?
Wenn ich ein Bidirektionale Kommunikation über SPI mache sendet der
Slave als erstes Byte ein Status Register zurück, und als zweites bis
n-tes die Daten. (Chip Select hält der Master solange auf Enabled)
Das 1. Byte des Masters sagt was der Slave senden soll (oder das ein
Kommando folgt). Der Master bricht ab wenn er nach dem 1. Byte vom Slave
(das Statusregister) merkt, das der Slave noch nicht so weit ist.
Zusätzlich kann man noch ein Interrupt verwenden, mit dem der Slave dem
Master signalisiert, das sich was an seinem Status geändert hat.
bestname_torben schrieb:> kein plan was ihr habt, finde es mit dummy nicht uncool
Niemand hat hier was, nur gehört es einfach zu Nettiquette, dass man
sich zumindest bedankt, wenn einem etwas erklärt wird, was er vorher
nicht gewusst hat.
Und was genau wolltest du mit:
"habs gelöst, einfach doppelt senden (dummy zeugs)"
sagen ?
Daß die anderen es genauso machen sollen ?
Daß du alleine draufgekommen bist ?
Daß das eine Lösung ist, die man in die SPI-Library aufnehmen soll ?
Auch als Troll sollte man imstande sein, Danke zu sagen.
Ob du danach ein Dummy oder 2K Dummys sendest, ist deine Sache.
bin selber da drauf gekommen, also ohne hilfe so. mit den posts davor
konnte ich ehrlich gesagt nicht so richtig was anfangen.
mit dummymein ich, dass man 2 mal was sendet