Forum: Mikrocontroller und Digitale Elektronik Übertragungsverzögerung beim SPI


von Seb E. (ihreismaen)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe eine Frage zur Übertragung beim SPI Bus. Im angehängten Bild 
ist der CS (gelb) und der SCL (blau) abgebildet. Es werden zyklisch zwei 
mal 12 Byte übertragen. DIe frage ist: Warum dauert es ~500µs zwischen 
den beiden Übertragungen? Der Code ist auf das Minimum heruntergebrochen 
und sollte daher eigentlich keine Limitierungen liefern. Gleichzeitig 
ist aber auch die übertragungsdauer nicht konstant, sondern schwankt. 
Hat jemand eine Ahnung woran das liegen kann?

Grüße Ihreismaen

von Nebel Stocherer (Gast)


Lesenswert?

Seb E. schrieb:
> Der Code ist auf das Minimum heruntergebrochen

Welcher Code?

Und den Prozessor kennen wir auch nicht.

Seb E. schrieb:
> sollte daher eigentlich keine Limitierungen liefern

... aber uneigentlich vielleicht schon ....

von Jim M. (turboj)


Lesenswert?

Da meine Glaskugel in Reparatur ist, müsstest Du uns schon mal den 
Source Code zeigen.

Ist das SPI mit DMA? Dann überlege Dir mal wie lange die Verarbeitung im 
Interrupt Handler dauert.

von Nebel Stocherer (Gast)


Lesenswert?

Seb E. schrieb:
> Hat jemand eine Ahnung woran das liegen kann?

Jetzt ist es mir eingefallen: es ist Arduino Code.

Denn Arduino schützt einem davor zu wissen was man tut.

von Tip (Gast)


Lesenswert?

Seb E. schrieb:
> IMG_20191002_091438_1153_.jpg

Da fragt man sich unweigerlich, wozu das Oszi wohl eigentlich rechts 
unterm Bildschirm die USB-Buchse besitzt.

Guck mal ins Kapitel "Saving and Recalling Files With a USB Flash Drive" 
im User Manual.

von Seb E. (ihreismaen)


Lesenswert?

Ich vergaß zu erwähnen: der Master ist ein Raspberry, der Code folglich 
in Python. Im Code werden wie erwähnt nur zwei Bytearrays übertragen. 
Aber warum die Lücke dazwischen? Kann das am Kernel liegen?

von Nebel Stocherer (Gast)


Lesenswert?

Seb E. schrieb:
> Ich vergaß zu erwähnen: der Master ist ein Raspberry, ....

Dann wundert mich nichts mehr.

Seb E. schrieb:
> der Code folglich in Python.

Ist das zwingend, ja?

von Seb E. (ihreismaen)


Lesenswert?

Nebel Stocherer schrieb:
> Seb E. schrieb:
>> Ich vergaß zu erwähnen: der Master ist ein Raspberry, ....
>
> Dann wundert mich nichts mehr.
>
> Seb E. schrieb:
>> der Code folglich in Python.
>
> Ist das zwingend, ja?

Hast du auch sinnvolle Kommentare im Angebot, oder nur Sarkasmus?

von Nebel Stocherer (Gast)


Lesenswert?

Seb E. schrieb:
> Hast du auch sinnvolle Kommentare im Angebot, oder nur Sarkasmus?

Wenn bei dir aus "Raspberry" die Programmiersprache Python
folgt und das für dich sozusagen selbstverständlich ist ....

von Axel S. (a-za-z0-9)


Lesenswert?

Seb E. schrieb:
> ich habe eine Frage zur Übertragung beim SPI Bus. Im angehängten Bild
> ist der CS (gelb) und der SCL (blau) abgebildet. Es werden zyklisch zwei
> mal 12 Byte übertragen.

Ich nehme an, jeweils zwei dicht benachbarte blaue Gezappel sind die 
zwei Übertragungen von je 12 Bytes? Und dann wiederholt sich das?

> DIe frage ist: Warum dauert es ~500µs zwischen
> den beiden Übertragungen?

Das darfst du uns nicht fragen. Du hast den Code geschrieben. Wie 
sieht der aus?

Aber selbst beim minimalistischen
1
while (1) {
2
  spi_send1();
3
  spi_send2();
4
}

kann man nicht erwarten, daß die Pause zwischen spi_send1() und 
spi_send2() exakt genauso lang sein wird wie die andere Pause zwischen 
spi_send2() undspi_send1(). Weil es das eine Mal linear im Code 
weitergeht und das andere Mal ein Rücksprung zum Schleifenanfang 
dazwischen liegt. Wieviel das ausmacht, hängt von Details ab, die du 
nicht preisgibst.


> Gleichzeitig
> ist aber auch die übertragungsdauer nicht konstant, sondern schwankt.

Das kann ich da nicht herauslesen.

> Hat jemand eine Ahnung woran das liegen kann?

Am Code? Am SPI (Hardware, Software, DMA, Puffergröße?)?
Wir kennen ja wirklich gar keine Details. Du schon.

von Wolfgang (Gast)


Lesenswert?

Axel S. schrieb:
>> Hat jemand eine Ahnung woran das liegen kann?
>
> Am Code? Am SPI (Hardware, Software, DMA, Puffergröße?)?
> Wir kennen ja wirklich gar keine Details. Du schon.

Wahrscheinlich liegt es auch am Betriebssystem, dessen Echtzeitfähigkeit 
nicht die Erwartungen erfüllt und so zu nicht erwarteten Schwankungen in 
der Ausführung vom Python Code führt.

von Nebel Stocherer (Gast)


Lesenswert?

Solange am Raspberry ein Display hängt (oder auch nur wenn
die Software des Raspberry meint ein Display antreiben zu
müssen) und dieses Display so klein ist dass es noch über
SPI gesteuert ist dann wird wohl dauernd ein zyklischer
Display-Update dazwischenfunken. Denn externes SPI gibt's
nur einmal.

von Stefan F. (Gast)


Lesenswert?

Tip schrieb:
> Da fragt man sich unweigerlich, wozu das Oszi wohl eigentlich rechts
> unterm Bildschirm die USB-Buchse besitzt.

Ist doch egal, in einer *.bmp Datei würde man nicht wirklich mehr sehen. 
Das Foto ist doch gut.

Beitrag #5992941 wurde von einem Moderator gelöscht.
von Seb E. (ihreismaen)


Lesenswert?

Tip schrieb:
> Seb E. schrieb:
>> IMG_20191002_091438_1153_.jpg
>
> Da fragt man sich unweigerlich, wozu das Oszi wohl eigentlich rechts
> unterm Bildschirm die USB-Buchse besitzt.
>
> Guck mal ins Kapitel "Saving and Recalling Files With a USB Flash Drive"
> im User Manual.

Das Oszi ist so alt, dass es USB-Sticks mit maximal 1GB nimmt. Und die
sind hier leider rar.

von Seb E. (ihreismaen)


Lesenswert?

Nebel Stocherer schrieb:
> Solange am Raspberry ein Display hängt (oder auch nur wenn
> die Software des Raspberry meint ein Display antreiben zu
> müssen) und dieses Display so klein ist dass es noch über
> SPI gesteuert ist dann wird wohl dauernd ein zyklischer
> Display-Update dazwischenfunken. Denn externes SPI gibt's
> nur einmal.

Der Raspi wird mit SSH ferngesteuert, der SPI Bus sitzt an den GPIOs. 
Sollte in dem Fall doch kein Porblem sein oder?

von Seb E. (ihreismaen)


Lesenswert?

Axel S. schrieb:
> Du hast den Code geschrieben.

Leider nein, da liegt ja das Problem. Aber ich muss dafür damit klar 
kommen. Deswegen besteht das Problem ja.

von Stefan F. (Gast)


Lesenswert?

Seb E. schrieb:
> Das Oszi ist so alt, dass es USB-Sticks mit maximal 1GB nimmt. Und die
> sind hier leider rar.

Ich habe eins, dass laut Anleitung maximal 2GB nimmt. Aber ich konnte 
einen 8GB Stick benutzen, nachdem ich die FAT Partition auf 2GB 
verkleinerte (6GB bleiben ungenutzt).

von Nebel Stocherer (Gast)


Lesenswert?

Seb E. schrieb:
> Nebel Stocherer schrieb:
>> Solange am Raspberry ein Display hängt (oder auch nur wenn
>> die Software des Raspberry meint ein Display antreiben zu
>> müssen) und dieses Display so klein ist dass es noch über
>> SPI gesteuert ist dann wird wohl dauernd ein zyklischer
>> Display-Update dazwischenfunken. Denn externes SPI gibt's
>> nur einmal.
>
> Der Raspi wird mit SSH ferngesteuert, der SPI Bus sitzt an den GPIOs.
> Sollte in dem Fall doch kein Porblem sein oder?

So wie du hier schreibst hast du nichts verstanden. Da bleibt
auch keine Lust übrig dir das nochmal auseinanderzudröseln.

Ausserdem mangelt es dir stark daran, klar verständlich und
umfassend deine Konfiguration darzustellen. Damit ist dir
nicht zu helfen.

Jim M. schrieb:
> Da meine Glaskugel in Reparatur ist, .....

von Joe F. (easylife)


Lesenswert?

Ratespiel accepted: Linux time-slicing 1ms?

von Stefan F. (Gast)


Lesenswert?

> Der Code ist auf das Minimum heruntergebrochen
> und sollte daher eigentlich keine Limitierungen liefern.

> der Master ist ein Raspberry, der Code folglich
> in Python. Im Code werden wie erwähnt nur zwei Bytearrays übertragen.

Zeige mal den Code!

> Ratespiel accepted: Linux time-slicing 1ms?

Vermute ich auch, irgendwas in dieser Richtung.

von John Doe (Gast)


Lesenswert?

Wolfgang schrieb:
> Wahrscheinlich liegt es auch am Betriebssystem, dessen Echtzeitfähigkeit
> nicht die Erwartungen erfüllt und so zu nicht erwarteten Schwankungen in
> der Ausführung vom Python Code führt.

An eine Linux-Distribution, in welcher der Kernel keine der 
Echtzeiterweiterungen eingebaut hat, hat man gar keine Erwartungen an 
die Echtzeitfähigkeit...

von Axel S. (a-za-z0-9)


Lesenswert?

Seb E. schrieb:
> Axel S. schrieb:
>> Du hast den Code geschrieben.
>
> Leider nein, da liegt ja das Problem. Aber ich muss dafür damit klar
> kommen. Deswegen besteht das Problem ja.

Ich kann ehrlich gesagt nicht erkennen, worin das Problem bestehen soll. 
Unter einem Nicht-Echtzeitbetriebssystem und dann auch noch mit einer 
Interpretersprache wie Python kannst du genau gar keine Anforderungen 
an den zeitlichen Ablauf deiner SPI-Übertragungen stellen.

Falls das irgendwie erwartet wurde, dann sind einfach die Erwartungen 
unrealistisch.

von Wolfgang (Gast)


Lesenswert?

John Doe schrieb:
> An eine Linux-Distribution, in welcher der Kernel keine der
> Echtzeiterweiterungen eingebaut hat, hat man gar keine Erwartungen an
> die Echtzeitfähigkeit...

Unsinn, Echtzeitfähigkeit ohne quantitative Angabe ist ein Gummibegriff.
Von jedem Raspberry erwartet man, auch ohne Kernel mit expliziter 
Echtzeiterweiterung, dass er in absehbarer Zeit auf äußere Ereignisse 
(z.B. einen Tastendruck auf der Tastatur) reagiert.

von Joe F. (easylife)


Lesenswert?

Wolfgang schrieb:
> Von jedem Raspberry erwartet man, auch ohne Kernel mit expliziter
> Echtzeiterweiterung, dass er in absehbarer Zeit auf äußere Ereignisse
> (z.B. einen Tastendruck auf der Tastatur) reagiert.

z.B. in 1ms? ;-)

von Axel S. (a-za-z0-9)


Lesenswert?

Joe F. schrieb:
> Wolfgang schrieb:
>> Von jedem Raspberry erwartet man, auch ohne Kernel mit expliziter
>> Echtzeiterweiterung, dass er in absehbarer Zeit auf äußere Ereignisse
>> (z.B. einen Tastendruck auf der Tastatur) reagiert.
>
> z.B. in 1ms? ;-)

"echtzeitfähig" ist einer der am häufigsten fehlverstandenen Begriffe. 
Ein Prof meiner Alma Mater pflegte es so auszudrücken: "echtzeitig ist 
rechtzeitig".

Insbesondere hat "Echtzeit" nichts mit "schnell" zu tun. Der springende 
Punkt ist, daß es ein Echzeitsystem garantierte maximale Reaktionszeit 
auf ein externes Ereignis hat. "Maximal" im Sinne von "es dauert nicht 
länger". Ob diese Reaktionszeit nun 1ms, 1s oder 10min ist, ist eine 
Frage der Anwendung. Aber für die Beurteilung, ob es ein Echtzeitsystem 
ist, zählt lediglich, daß die garantierte Reaktionszeit unter allen 
Umständen eingehalten wird.

Auch für das "Problem" des TE ist Echtzeit die falsche Kategorie. Er hat 
wohl erwartet, daß es a) schneller und b) gleichmäßiger geht. Leider 
sagt er nicht, warum oder in welchen Grenzen. Denn selbstverständlich 
kann auch ein stinknormaler Linux-Kernel IO in schnell und gleichmäßig. 
Man denke nur an Gigabit-Ethernet oder isochrone USB-Transfers. Nur 
implementiert man so etwas halt nicht im Userspace und nicht in Python.

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.