Forum: Mikrocontroller und Digitale Elektronik SPI-Schnittstelle


von Matze (Gast)


Lesenswert?

Hallo,
ich versuche die Kommunikation zwischen zwei Mikrocontrollern über die 
SPI-Schnittstelle zu realisieren. Ein Mikrocontroller wird als Master, 
der andere als Slave initialisiert. Wenn ich jetzt die Übertragung 
starte (Master schreibt erstes Byte in SPI-Datenregister), wird das 
erste Datenbyte vom Master zum Slave übertragen. Gleichzeitig überträgt 
der Slave (über MISO) ein Byte zum Master. Wenn zum Übertragungsbeginn 
noch keine Daten beim Slave vorhanden sind, wird dann ein leeres Byte 
(00h) übertragen oder erkennt der Master das keine Daten vorhanden sind. 
Mir ist nicht ganz klar, wie ich das Timing gestallten muss.
Angenommen ich schreibe einen Befehl (Master an Slave). Jetzt braucht 
der Slave einige Zeit bis er den Befehl bearbeitet hat und gültige Daten 
liefern kann. Wenn jetzt der Master das SPI-Datenregister liest und es 
gibt noch keine gültigen Daten, wird dann 00h gelesen oder erkennt er, 
dass keine gültigen Daten vorhanden sind und fragt so lange ab bis die 
gültigen Daten vorhanden sind?
Gibt es im Netz eine genaue Erklärung zur SPI-Schnittstelle. Der Artikel 
auf Wiki hilft mir leider auch nicht weiter.

Danke für Eure Hilfe!

Gruß Matze

von Stefan (Gast)


Lesenswert?

Woher soll der Master wissen, dass 0x00 ("leeres" Datenbyte) nicht doch 
gültigen Daten sind?
Um das Protokollhandling musst Du Dich schon selbst kümmern. Entweder 
die max. Antwortzeit des Slaves ermitteln und immer einhalten. Oder ein 
ACK/NAK Protokoll das Deinen Ansprüchen genügt entwerfen!

von Matze (Gast)


Lesenswert?

Hi,
genau das ist meine Frage. Es gibt ja ein SPI-Control Register, hier 
wird ein Bit gesetzt, wenn Daten übertragen wurden und zum auslesen 
bereit stehen. Wenn ich aber keine Daten zum Senden geschrieben habe, 
wird dann 00h übertragen oder realsiert der Master, dass der Slave keine 
Daten hat und setzt deshalb auch nicht das Control-Bit im SPI-Control 
Register.

von Johannes M. (johnny-m)


Lesenswert?

Matze wrote:
> Hi,
> genau das ist meine Frage. Es gibt ja ein SPI-Control Register, hier
> wird ein Bit gesetzt, wenn Daten übertragen wurden und zum auslesen
> bereit stehen. Wenn ich aber keine Daten zum Senden geschrieben habe,
> wird dann 00h übertragen oder realsiert der Master, dass der Slave keine
> Daten hat und setzt deshalb auch nicht das Control-Bit im SPI-Control
> Register.
Der Slave sendet genau das, was zum Zeitpunkt des Sendens im 
Datenregister steht. Wenn Du da seit dem letzten Übertragungsvorgang 
nichts neues reingeschrieben hast, wird das gesendet, was beim letzten 
Mal empfangen wurde. Wenn Du in der Zwischenzeit eine 0x00 
reingeschrieben hast, dann wird die gesendet. Ein SPI-Interface ist 
nichts anderes als ein Schieberegister, bei dem am einen Ende rein- und 
am anderen rausgeschoben wird.

von Stefan (Gast)


Lesenswert?

Wenn der Master ein Datenbyte sendet, dann liest er auch gleichzeitig 
ein Datenbyte ein, ohne wenn und aber! Was er dann empfängt hängt vom 
Slave ab.
Hat der Slave keine Daten zum Senden vorbereitet, wird das letzte im 
Buffer liegende Byte gesendet (das kann nach der Initialisierung des 
Slaves auch komplett undefiniert sein und muss keinesfalls immer 0x00 
sein!!!).

Klar ist doch, in dem Moment in dem der Master was sendet, kann der 
Slave noch keine Antwort dazu parat haben, den das Byte ist ja noch gar 
nicht komplett beim Slave angekommen, dieser sendet aber schon fleißig 
was zurück.
Es muss also darauf hinauslaufen, dass der Master einen Befehl oder 
Daten an den Slave sendet, wartet bis der Slave mit der Bearbeitung 
fertig ist und dann in einer neuen Datenübertragung das Ergebnis vom 
Slave abholt.

von Matze (Gast)


Lesenswert?

Hi,
genau das wollte ich wissen. Vielen Dank für die Antworten!

Gruß Matze

von Matthias L. (Gast)


Lesenswert?

>wartet bis der Slave mit der Bearbeitung
>fertig ist und dann in einer neuen Datenübertragung das Ergebnis vom
>Slave abholt.

NEnnt man Dummy-Read.

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.