Übertragungsverzögerung beim SPI

Gast #5992772
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
Angehängte Dateien:
Gast
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.
Gast
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?
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.
Gast
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.
Gast
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.
Gast
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.
Gast
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.
Gast
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?
Gast
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).
Gast
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, .....
Gast
> 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.
Gast
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...
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.
Gast
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.
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.