Forum: Mikrocontroller und Digitale Elektronik 'Sichere' Übertragung mit SPI


von A. G. (grtu)


Lesenswert?

Hallo zusammen,

ich möchte Daten bidirektional zwischen zwei Mikrocontrollern 
austauschen, und habe dafür momentan SPI implementiert. Das läuft 
soweit, allerdings nur wenn ich ein Delay zwischen den Übertragungen 
einbaue, sonst verschluckt der Slave manchmal die Datenpakete, da er 
eine gewisse aber unbestimmte Zeit braucht um diese zu bearbeiten. Gibt 
es da sinnvolle Möglichkeiten wie man sowas verhindern kann? Ist SPI für 
sowas überhaupt sinnvoll?

von Cyblord -. (cyblord)


Lesenswert?

A. G. schrieb:
> Hallo zusammen,
>
> ich möchte Daten bidirektional zwischen zwei Mikrocontrollern
> austauschen, und habe dafür momentan SPI implementiert. Das läuft
> soweit, allerdings nur wenn ich ein Delay zwischen den Übertragungen
> einbaue, sonst verschluckt der Slave manchmal die Datenpakete, da er
> eine gewisse aber unbestimmte Zeit braucht um diese zu bearbeiten. Gibt
> es da sinnvolle Möglichkeiten wie man sowas verhindern kann? Ist SPI für
> sowas überhaupt sinnvoll?

Wenn du beide Controller programmiert hast, solltest du wissen welche 
Zeit wofür verwendet wird und wie lange der Sender ggf. warten muss.

Ansonsten kannst du Checksummen und entsprechende Response vom Slave 
einbauen um in solchen Fällen das Paket wiederholen zu können.

Ein Komm Kanal kann immer mal gestört werden. Das muss ein Protokoll 
halt abfangen wenn jede Übertragung 100% ankommen muss.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. G. schrieb:
> Ist SPI für sowas überhaupt sinnvoll?

Eher nicht.

SPI taugt mehr dafür, wenn du als Slave etwas in Hardware hast, ein 
Schieberegister, ein FPGA. Dort hast du normalerweise mit der nächsten 
Flanke des Hardwaretaktes (der ohnehin immer viel schneller als der 
SPI-Takt sein muss) die Antwort parat.

Für Controller als Slave eignet sich I²C besser, denn da hat der Slave 
die Möglichkeit, dem Master ein "Halt mal kurz!" zuzurufen, bis er die 
Antwort bereit hat.

von A. G. (grtu)


Lesenswert?

Jörg W. schrieb:
> SPI taugt mehr dafür, wenn du als Slave etwas in Hardware hast, ein
> Schieberegister, ein FPGA. Dort hast du normalerweise mit der nächsten
> Flanke des Hardwaretaktes (der ohnehin immer viel schneller als der
> SPI-Takt sein muss) die Antwort parat.

Das ist ein guter Hinweis. Der Slave ist tatsächlich ein FPGA, auf dem 
NIOS läuft, und das ist etwas langsam. Ich versuche es mal so 
umzustellen, dass die SPI-Kommunikation direkt in Hardware über einen 
Adressenbereich (wie bei einem EEPROM) gemacht wird.

Cyblord -. schrieb:
> Ansonsten kannst du Checksummen und entsprechende Response vom Slave
> einbauen um in solchen Fällen das Paket wiederholen zu können.
>
> Ein Komm Kanal kann immer mal gestört werden. Das muss ein Protokoll
> halt abfangen wenn jede Übertragung 100% ankommen muss.

Das stimmt, eine Checksumme ist notwendig. Ich wollte nur vermeiden so 
lange zu pollen bis das 'richtige' Ergebnis zurück kommt, was den Master 
dann vollkommen lahmlegen würde.

von Gerd E. (robberknight)


Lesenswert?

Jörg W. schrieb:
> Für Controller als Slave eignet sich I²C besser, denn da hat der Slave
> die Möglichkeit, dem Master ein "Halt mal kurz!" zuzurufen, bis er die
> Antwort bereit hat.

Das mag sein. Allerdings ist I2C ziemlich empfindlich gegen 
EM-Störungen. Kommt da eine Störung, die der Slave als Clocksignal 
interpretiert, der Master aber nichts gesendet hat, kommen Master und 
die Slaves durcheinander.

Das muss man dann erkennen und den Bus wieder "freitakten". In den 
meisten Fällen hilft das, ich hab aber auch schon Slaves gehabt die 
manchmal einen Reset brauchten bevor das I2C wieder funktionierte.

Vor allem wenn für die Anwendung garantierte Antwortzeiten benötigt 
werden ist das also gar keine gute Idee. SPI ist da besser, da es über 
das Slaveselect-Signal immer sauber synchronisiert wird.

Für einen FPGA als Slave würde ich SPI nehmen, mit SPI in Hardware. Ist 
auch von der Logik her deutlich einfacher als I2C.

Für einen Mikrocontroller als Slave ist vermutlich etwas UART-basiertes 
das einfachste. Bei mehreren Mikrocontrollern dann als Open Collector 
Bus.

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.