mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Schnittstelle


Autor: Matze (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Matze (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Matze (Gast)
Datum:

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

Gruß Matze

Autor: Matthias Lipinsky (lippy)
Datum:

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

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.