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
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!
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.
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.
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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.