Hallo, ich hab nun sehr viel über SPI gelesen, jedoch habe ich bei einer
Sache ein Verständnisproblem und finde nirgends eine Erklärung. Vllt
benötigt man dazu auch keine Erklärung weil es nicht relevant ist ?!
Folgendes: Bei SPI findet doch eine Duplex Datenübertragen statt, w.h.
ich schicke ein Byte z.B. zum Slave und bekomme gleichzeitig ein Byte
vom Slave zurück ?! Was mache ich dann mit dem Byte was der Slave mir
geschickt hat wenn ich es doch eigentlich vllt gar nicht brauche ?
Oder liegt hier mein Verständnisproblem und man bekommt nur etwas zurück
vom Slave wenn man es anfordert. Aber ich dachte die Schieberegister
schieben doch im jedenfall nicht nur hin (MOSI) sonder gezwungenermassen
auch etwas zurück (MISO).
Angenommen folgendes: "ich will einen EEPROM mit der Adresse 0x0010 mit
0xAA programmieren. Dafür wird zunächst der Befehl gesendet um das
EEPROM zu schreiben (0xC0). Dann werden zwei Bytes gesendet, welche die
zu schreibende Adresse im EEPROM beschreiben (0x00 und 0x10). Als
letztes wird dann das zu schreibende Datenbyte gesendet (0xAA)"
jetzt habe ich doch ständig was zum Slave (EEPROM) geschickt ohne bisher
etwas von ihm an Daten "zu wollen" ? aber es kommt doch gezwungenermaßen
was vom Slave zurück (Duplex) oder sind das nur NULLEN weil der Slave
dessen Shiftregister immer wieder leert ?
du kannst auch das, was du bekommst, einfach ignorieren.
Machen manche Menschen doch auch so: Man kann ihnen noch so viel sagen,
ob sie mit dem Gesagten etwas anfangen oder es einfach ignorieren liegt
in ihrem Ermessen ;)
Ja, SPI ist immer Full Duplex, also wenn du ein Byte lesen willst, musst
du auch eins hinschicken. Der Inhalt dieses Bytes ist oft "don't care",
d.h. es ist egal was da drin steht und man kann sich auch nicht auf den
Inhalt verlassen.
Hallo,
das mit dem Schieberegister hast Du völlig richtig erkannt.
Wenn Du ein Byte reinschiebst wird gleichzeitg der Inhalt des
Slave-Senderegisters rausgeschoben.
Was da drinsteht sollte das Datenblatt des IC sagen. Es können Nullen
sein, es kann das davor empfangene Byte sein, es kann der Wert sein, der
vorher vom Master angefordert wurde.
Was Du nicht brauchst ignorierst Du eben. Niemand zwingt Dich, das
Empfangsregister des Master zu lesen, wenn Du keine Daten erwartest.
Umgekehrt mußt ja genauso ein Dummybyte zum Slave schicken, wenn Du
Daten angefordert hast. Ob das Nullen, Einsen oder zufällige Werte sein
können, sagt auch das Datenblatt des Slave. Der wirft das
(üblicherweise) sowieso weg, weil nur der Takt zum rausschieben
gebraucht wird.
Gruß aus Berlin
Michael
Michael U. schrieb:> Umgekehrt mußt ja genauso ein Dummybyte zum Slave schicken,
Du musst Leergut abgeben, damit der Controller wieder was reintun kann.
Sonst gehen dem irgendwann die Bits aus. Wie bei Gasflaschen.
Sven B. schrieb:> Ja, SPI ist immer Full Duplex, also wenn du ein Byte lesen willst, musst> du auch eins hinschicken. Der Inhalt dieses Bytes ist oft "don't care",> d.h. es ist egal was da drin steht und man kann sich auch nicht auf den> Inhalt verlassen.
er ist meist duplex aber nicht immer
es gibt auch simplex Betrieb aber nicht bei einem EEPROM.
Manche ICs schicken der Antwort zur ersten Frage während sie die zweite
Frage empfangen. Das muss der Master halt berücksichtigen und evtl. am
ende eine Dummyfrage stellen oder wiederholen oder...
Bei SPI gibt es wenig festgelegtes und viel Freiheit
Vielen Dank für euer vielen Anworten ! Das macht meine Aufgabenstellung
um so schwieriger:
ich mache Reverse Engineering an einem Cap.Touchpanel und habe jede
Menge an RAW Daten welche hier zwischen Master und Slave auf meinem
Oszilloskope via SPI Decoder ausgelesen werden. Es sind 64 Bytes pro
Touch !
Ich habe die X und Y Kooridinaten aus dem ganzen RAW Datensalat nun
herausfinden können dazu habe ich nur die MISO Leitung gesnifft und
dachte, jetzt habe ich doch alles was vom Touchpanel (slave) kommt.
Doch muss das Touch auch vom Master angesprochen werden und so habe ich
auch MOSI an einem 2. Decoder mit drangehängt und sehe nun, dass die
Touchdaten/Koordinaten HEXbytes sogar auf dem MOSI sind welche ich auch
auf dem MISO habe ?!?
woher weiss der Master nun was für ihn relevante Koordinaten Daten sind
und welche er wie wohl hier in dem Beispiel, als dummybytes wieder
verwenden kann ?
ist es richtig, dass man mit dummybytes aufpassen muss , nicht dass das
dann zufällig Befehle sind, welche dem Slave dann dummheiten machen
lässt?
Alex schrieb:> woher weiss der Master nun was für ihn relevante Koordinaten Daten sind> und welche er wie wohl hier in dem Beispiel, als dummybytes wieder> verwenden kann ?
Das steht im Datenblatt unter Abschnitt "Protokoll" o.ä.
Alex schrieb:> ich mache Reverse Engineering an einem Cap.TouchpanelLothar M. schrieb:> Das steht im Datenblatt unter Abschnitt "Protokoll" o.ä.
Manche Antworten sind echt einfach heldenhaft. :)
ist das hier richtig ?
ich will den Inhalt einer Adresse aus dem Slave lesen:
1. ich schicke die Adresse von der ich den Inhalt lesen möchte an den
Slave
2. ich schicke als nächstes ein Dummybyte um den Inhalt zum Master zu
taken
was passiert nun wenn das Dummybyte einem Befehl entspricht der
eigentlich gar nicht ausgeführt werden soll ? Was ich meine ist:
ließt der Slave in jedem Fall den Inhalt den er zugetaktet bekommt und
entscheidet dann ob Dummy oder Befehl ( nach seiner Specification) ?
gilt das für den Master auch, oder liesst er seinen Inhalt nur, wenn er
etwas angefragt und somit etwas erwartet ?
Datenblatt lesen, z. B. W25Q256 oder so: Das erste(!) Byte, dass nach
aktivieren von CS hineingeschoben wird, ist der Befehl, dann ggf. noch
einige Parameter, alles danach wird ignoriert.
Man kann auch endlos lesen: Nach einem Byte 0x03 (READ), 3 oder 4 Bytes
Adresse hineinschieben, alles danach wird ignoriert, gleichzeitig aber
die gelesenen Bytes herausgeschoben (wobei die Adresse nach jedem Byte
automatisch inkrementiert wird). Erst das deaktivieren von CS beendet
den Befehl, und erst nach erneuter Aktivierung wird das erste neue Byte
wieder als Befehl interpretiert.
So wie unserer Sprache der Punkt am Ende.
A. B. schrieb:> So wie unserer Sprache der Punkt am Ende.
vielen Dank !! das war sehr gut erklärt und jetzt erkenne ich die
eigentliche Funktion des CS !! war mir bisher nie klar !!
deshalb sollte man CS nie dauerhaft auf Masse legen, auch wenn man nur
einen Slave hat. Weil der CS ein Teil der korrekten Kommunikation
zwischen M<>S ist.
Alex schrieb:> deshalb sollte man CS nie dauerhaft auf Masse legen, auch wenn man nur> einen Slave hat. Weil der CS ein Teil der korrekten Kommunikation> zwischen M<>S ist.
Du hast es immer noch nicht kapiert: Es kommt darauf an, wie das
konkrete Protokoll definiert ist. Bei manchen ist es halt möglich, CS
fest auf aktives Potential zu legen, bei anderen nicht. Nur die Lektüre
des Datenblattes gibt einem (hoffentlich) das nötige Wissen, um zu
entscheiden, ob es bei dem konkreten Device möglich ist oder nicht.
Leider muss man aber auch sagen, dass viele diese
Protokollbeschreibungen alles andere als erschöpfend sind. Und im
Zweifel gilt natürlich: wenn man CS selber kontrolliert, ist man auf der
sicheren Seite. Dann kann man nämlich sowohl die Auswirkungen
unvollständiger oder gar fehlerhafter Protokollbeschreibungen als auch
eines suboptimalen Schaltungsdesigns oder Layouts durch nachträgliche
Softwareänderungen noch relativ leicht kompensieren...