Forum: Mikrocontroller und Digitale Elektronik 10k Pull-Up zerstört SPI-Signal (STM32F407)


von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

auf der Suche nach dem Fehler auf einer anderen Leiterplatte bin ich auf 
ein Kuriosum gestoßen. Ich will ein ILI9341 per SPI mit einem STM32F407 
ansteuern. Das funktioniert hervorragend bis 42 MHz mit SPI1 und SPI2. 
Bei SPI3 funktionieren nur Takte bis 18 kHz, also Vorteiler 256. Schon 
bei Vorteiler 128 versagt die Verbindung. SPI3 unterscheidet sich von 
den beiden anderen, da hier 10k-Pull-Ups verbaut sind (für ein 
SDIO-Interface). Da ich nicht damit gerechnet habe, daß diese Pull-Ups 
für das Nicht-funktionieren verantwortlich sein können, habe ich erst 
einmal nach Nebenschlüssen etc. gesucht, um schließlich den Einfluß in 
einem anderen Aufbau (siehe Bild) nachzuspielen.

Und tatsächlich: Ein 10k-Pull-Up in der Clock-Leitung sorgt dafür, daß 
maximal 18 kHz SPI-Takt noch funktionieren (per Bit-Banging gehen immer 
noch 12 MHz), während es ohne trotz des primitiven fliegenden Aufbaus 
bis 42 MHz funktioniert.

Es bleibt die Frage: Warum? Wie kann ein 10-Kiliohm-Pull-Up den SPI 
derart heftig beeinflussen? Ein Pull-Down der gleichen Größe hat 
übrigens keine negativen Auswirkungen.

Zur Quellimpedanz finde ich nichts im Datenblatt, aber aus Tabelle Table 
49. Output voltage characteristics lassen sich grob 65 Ohm abschätzen. 
Dann sollte der 10 kOhm-Widerstand (induktive Komponente hin oder her) 
keine wesentliche Rolle spielen.

Wird die Quellimpedanz bei AFIO größer? Das Speed-Register zeigt immer 
noch 0x2 an. Oder welches Phänomen sorgt dafür, daß der SPI durch einen 
mittelmäßig schwachen Pull-Up so beeinträchtigt werden kann?

: Bearbeitet durch User
von Urlauber (Gast)


Lesenswert?

Du baust damit einen Schwingkreis auf, vor allem da der Widerstand am 
Ende der Leitung ist. Wenn man sowas macht dann am Anfang der Leitung 
dann wirkt es sogar dämpfend und es kann die Signalqualität verbessern.

Maßgebend wird der Widerstand bei dir vor allem deswegen weil vorher der 
Widerstand des Eingangs deutlich größer war als dein Pullup.

von Jens M. (schuchkleisser)


Lesenswert?

Kenne den Chip nicht, aber es hört sich für mich so an als ob die ersten 
beiden SPIs push/pull-Endstufen haben, der dritte jedoch nur auf den 
Pullup lauscht.

Entweder ist der Pin defekt, dein Setup falsch (schaltet statt H/L auf 
Z/L, oder In+weak pullup/Out), oder die Schnittstelle ist primär für 
I²C-SDA gedacht.
Ein Pullup an irgendwelchen SPI-Pins außer CS kommt mir auch komisch 
vor.
Hab ich noch nie gemacht, die Pins liegen seitens des Controllers immer 
auf festem Ruhepegel.
MAl mit'm Scope nachgesehen, wie das Signal aussieht?

Beitrag #5958432 wurde von einem Moderator gelöscht.
von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Die Funktionen sind kein Geheimnis. Sie entsprechen im wesentlichen 
einem der Standard peripheral library beiliegenden Beispiel (siehe 
Anhang).

von Fern Schätzer (Gast)


Lesenswert?

Walter T. schrieb:
> Ein 10k-Pull-Up in der Clock-Leitung sorgt dafür, daß
> maximal 18 kHz SPI-Takt noch funktionieren

Dein 10kOhm-PullUp ist keiner.

Du kannst keine Widerstands-Codes korrekt entziffern.

von Stefan F. (Gast)


Lesenswert?

Fern Schätzer schrieb:
> Dein 10kOhm-PullUp ist keiner.
> Du kannst keine Widerstands-Codes korrekt entziffern.

Woran hast du das erkannt?

von Gerd E. (robberknight)


Lesenswert?

Wenn da auf dem Foto schon die Oszi-Probe daneben liegt - wie sehen denn 
die verschiedenen Signale des SPI auf dem Oszi aus, einmal mit diesem 
Pullup und einmal ohne?

von Wolfgang (Gast)


Lesenswert?

Walter T. schrieb:
> Dann sollte der 10 kOhm-Widerstand ...

Hast du den Wert nachgemessen?
Leider kann man auf deinem Photo wegen der Blickrichtung den Farbcode 
nicht erkennen.

von A. B. (Gast)


Lesenswert?

An PC10 und PC12 ist der CS43L22 angeschlossen.

von Dr. Sommer (Gast)


Lesenswert?

Walter T. schrieb:
> 10k-Pull-Ups verbaut sind (für ein SDIO-Interface

Aber warum? Muss man bei SDIO die Pullups nicht abschalten können, um 
den maximalen Takt erreichen zu können, weshalb man die internen Pullups 
verwendet (und auch die internen der SD-Karte)? Bis auf den Card Detect 
Pin, aber der ist ja nicht Teil von SDIO und kann ein beliebiger GPIO 
sein.

von Fern Schätzer (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Aber warum? Muss man bei SDIO die Pullups nicht abschalten können, um
> den maximalen Takt erreichen zu können,

Ein 10kOhm-PullUp ist für die allermeisten Controller-I/Os
ohne Relevanz wenn ein I/O auf Ausgang und Push/Pull gesetzt ist.

von Dr. Sommer (Gast)


Lesenswert?

Fern Schätzer schrieb:
> Ein 10kOhm-PullUp ist für die allermeisten Controller-I/Os
> ohne Relevanz wenn ein I/O auf Ausgang und Push/Pull gesetzt ist.

Naja, bei 48MHz SDIO sieht das vielleicht schon anders aus. Jedenfalls 
ist der Widerstand m.E. unnötig (insb. bei der Clock Leitung) und macht 
nur Ärger.

von Wolfgang (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Naja, bei 48MHz SDIO sieht das vielleicht schon anders aus.

An 10kΩ Pull-Up darf es auch bei 48MHz nicht scheitern. Wie soll eine 
Push-Pull Ausgangsstufe, die schon an 10kΩ scheitert, mit dem Umladen 
der Leitungskapazität klar kommen.

Da ist irgendetwas anderes faul.
Ein Vergleich der Oszi-Bild (mit vs. ohne), aufgenommene mit 1:10 
Tastkopf und ein Nachmessen des Widerstandes dürften eher Klarheit 
bringen als blindes Rumrätseln.

von Joe F. (easylife)


Lesenswert?

Walter T. schrieb:
> Ich will ein ILI9341 per SPI mit einem STM32F407
> ansteuern. Das funktioniert hervorragend bis 42 MHz mit SPI1 und SPI2.

Im Datenblatt des ILI9341 ist SCL mit max. 10 MHz spezifiziert (100ns 
clock cycle).

: Bearbeitet durch User
von Fern Schätzer (Gast)


Lesenswert?

Wolfgang schrieb:
> Da ist irgendetwas anderes faul.

Er kann keine Widerstands-Codes korrekt entziffern.

Fern Schätzer schrieb:
> Du kannst keine Widerstands-Codes korrekt entziffern.

Es sollte ein Leichtes sein den Widerstandswert zu verifizieren.

Auch beim Thema Oszillogramm hören wir nichts .....

von Fern Schätzer (Gast)


Lesenswert?

Joe F. schrieb:
> Im Datenblatt des ILI9341 ist SCL mit max. 10 MHz spezifiziert

Mit SCL wird im Allgemeinen ein I2C Bus Clock bezeichnet.
In diesem Thread geht es um SPI. Falls es noch nicht aufgefallen
sein sollte ....

Dass ein SPI Display mit einer maximalen Clockrate spezifiert
ist heisst noch lange nicht dass es nicht auch schneller
funktionieren mag.

von Joe F. (easylife)


Lesenswert?

Fern Schätzer schrieb:
> Joe F. schrieb:
>> Im Datenblatt des ILI9341 ist SCL mit max. 10 MHz spezifiziert
>
> Mit SCL wird im Allgemeinen ein I2C Bus Clock bezeichnet.
> In diesem Thread geht es um SPI. Falls es noch nicht aufgefallen
> sein sollte ....

Danke für den Hinweis, mir ist allerdings durchaus bewusst, dass es um 
SPI geht. In besagtem Datenblatt ist das Signal allerdings auch für den 
SPI Betrieb als "SCL" bezeichnet.

> Dass ein SPI Display mit einer maximalen Clockrate spezifiert
> ist heisst noch lange nicht dass es nicht auch schneller
> funktionieren mag.

Oder eben auch nicht. 42 MHz ist jedenfalls weit out of spec.
16 MHz ist da schon eher in dem Bereich, wo man sagen könnte man 
befindet sich noch in der Grauzone.

: Bearbeitet durch User
von Fern Schätzer (Gast)


Lesenswert?

Joe F. schrieb:
> Oder eben auch nicht.

Walter T. schrieb:
> während es ohne trotz des primitiven fliegenden Aufbaus
> bis 42 MHz funktioniert.

von Joe F. (easylife)


Lesenswert?

Fern Schätzer schrieb:
> Joe F. schrieb:
>> Oder eben auch nicht.
>
> Walter T. schrieb:
>> während es ohne trotz des primitiven fliegenden Aufbaus
>> bis 42 MHz funktioniert.

Ja, erstklassige Ingenieursleistung. Datenblätter sind ja sowas von 
überschätzt...

von Fern Schätzer (Gast)


Lesenswert?

Joe F. schrieb:
> Ja, erstklassige Ingenieursleistung. Datenblätter sind ja sowas von
> überschätzt...

Du Knaller hälst es also für nicht möglich dass der TO beurteilen
kann ob sein Testaufbau mit 42 MHz Clock funktioniert oder nicht.

von Joe F. (easylife)


Lesenswert?

Fern Schätzer schrieb:
> Joe F. schrieb:
>> Ja, erstklassige Ingenieursleistung. Datenblätter sind ja sowas von
>> überschätzt...
>
> Du Knaller

Nicht nötig unfreundlich zu werden.

> hälst es also für nicht möglich dass der TO beurteilen
> kann ob sein Testaufbau mit 42 MHz Clock funktioniert oder nicht.

Doch. Es kann sein, dass es mit viel Glück mal funktioniert.
Wie man sieht, funktioniert es aber nicht immer. Offenbar hat der andere 
Pin ein leicht anderes Timing, einen anderen Pegel, andere 
Rise-/Fall-Zeiten, weiss der Henker.
Es lohnt auch gar nicht, darüber nachzudenken, da die 42 MHz wie gesagt 
weit ausserhalb des Bereiches liegen, in dem der Hersteller einen 
zuverlässigen Betrieb garantiert.

von Fern Schätzer (Gast)


Lesenswert?

Joe F. schrieb:
> Wie man sieht, funktioniert es aber nicht immer.

Und das liegt garantiert an einem jämmerlichen 10k Pullup der
bei Null Volt gerade mal 0.33mA zieht.

Fachmann!

von Joe F. (easylife)


Lesenswert?

Fern Schätzer schrieb:
> Joe F. schrieb:
>> Wie man sieht, funktioniert es aber nicht immer.
>
> Und das liegt garantiert an einem jämmerlichen 10k Pullup der
> bei Null Volt gerade mal 0.33mA zieht.
>
> Fachmann!

Nein, ich sage ja, es gibt noch viele andere Möglichkeiten an denen es 
liegen kann, über die es sich aber nicht lohnt nachzudenken.
Die 10K als Ursache halte ich persönlich auch eher als nicht ursächlich.
Das ist dann auch meine letzte Antwort an dich, da ich deine andauernde 
Unhöflichkeit nicht mag.

von Walter T. (nicolas)


Lesenswert?

Fern Schätzer schrieb:
> Dein 10kOhm-PullUp ist keiner.

Was Du für den Pull-Up hälst, ist keiner, sondern der Vorwiderstand für 
die LED-Beleuchtung. Der Pull-Up/Pull-Down ist längs zur Blickrichtung.

Gerd E. schrieb:
> wie sehen denn
> die verschiedenen Signale des SPI auf dem Oszi aus

Mit Pull-Up sind die Überschwinger oberhalb VDD deutlich heftiger. Mit 
dieser Masseführung weigere ich mich allerdings, im Oszilloskopbild mehr 
als eine Hausnummer zu sehen.

Wolfgang schrieb:
> Hast du den Wert nachgemessen?

Das Discovery spielt nur Modell. Das Board, das die Pull-Ups fest 
verbaut hat, ist ein STM32F407 black: ( 
Beitrag "STM32F407 Black und Arduino" ). Beim Discovery läßt sich 
nur schneller zwischen "pull up" und "kein pull up" wechseln, um 
nachzuweisen, daß es genau an diesem liegt.

Auch bei der "Rückreise" auf das Black-Board macht das Entfernen von 
R12, der auch nach dem Ausbau noch 10kOhm hat, den Unterschied aus 
zwischen "funktioniert" und "funktioniert nicht".

Das Phänomen ist nicht auf SPI3 beschränkt. Zumindest an SPI2 ist es 
auch sichtbar. Ich habe kein zweites Displaymodul für einen Kreuztest 
da.

Joe F. schrieb:
> Im Datenblatt des ILI9341 ist SCL mit max. 10 MHz spezifiziert (100ns
> clock cycle).

Stimmt. Ich habe meinen Test trotzdem von 18 kHz bis 42 MHz gemacht. Und 
mit dem Pull-Up ist bei 18 kHz Schluß.

Fern Schätzer schrieb:
> Ein 10kOhm-PullUp ist für die allermeisten Controller-I/Os
> ohne Relevanz wenn ein I/O auf Ausgang und Push/Pull gesetzt ist.

So weit der naive erste Gedanke. Jetzt liegt aber der Fall vor, wo ein 
Pull-Up bei läppischen 36 kHz den Unterschied zwischen "funktioniert" 
und "funktioniert nicht" ausmacht, wärend ein Pull-Down bis 42 MHz keine 
Probleme macht.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Ich hatte die 18 *K*Hz für einen Tippfehler gehalten.
Wie sieht das 18 KHz CLK Signal denn auf dem Oszilloskop aus?

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Joe F. schrieb:
> Wie sieht das 18 KHz CLK Signal denn auf dem Oszilloskop aus?

Wie aus dem Malbuch.


Mal eine naive Frage: Kann SPI_Cmd(SPIx, DISABLE) (löscht Bit SPI in 
SPIx->CR1) einen floatenden Clock-Pin zurücklassen?

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Walter T. schrieb:
> Joe F. schrieb:
>> Wie sieht das 18 KHz CLK Signal denn auf dem Oszilloskop aus?
>
> Wie aus dem Malbuch.

Und die Daten liegen auch noch mit der richtigen Phase an (SPI Mode 0)?
Evtl. ist da ja was nicht richtig konfiguriert, und dann wirkt sich 
bereits eine minimale Verschiebung der CLK Flanke ggü. der Datenleitung 
negativ aus.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Walter T. schrieb:
> Mal eine naive Frage: Kann SPI_Cmd(SPIx, DISABLE) (löscht Bit SPI in
> SPIx->CR1) einen floatenden Clock-Pin zurücklassen?

Nachtrag: Ja, tut er. Der Pegel läßt sich danach mit 10 kOhm lustig in 
der Gegend herumschieben.

Was passiert also: Der Pull-Up generiert bei jedem Abschalten einen 
weiteren Flankenwechsel als Artefakt. Danach stimmt nichts mehr. Warum 
das bei der einen niedrigsten Taktrate keine Rolle spielt, muß ich noch 
suchen.

Bei Bitbanging passiert das nicht, weil da nichts hochohmig geschaltet 
wird.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Walter T. schrieb:
> Nachtrag: Ja, tut er. Der Pegel läßt sich danach mit 10 kOhm lustig in
> der Gegend herumschieben.

SPI sollte Push-Pull Ausgangsstufen verwenden. Ein Pull-Up darf da gar 
nichts schieben. Ohne die Ausgangskennlinie der Ausgangsstufe angeguckt 
zu haben, dürfen die 0.3mA vom Pull-Up allenfalls den L-Pegel im 
1/10-Volt Bereich beeinflussen.

> Was passiert also: Der Pull-Up generiert bei jedem Abschalten einen
> weiteren Flankenwechsel als Artefakt. Danach stimmt nichts mehr. Warum
> das bei der einen niedrigsten Taktrate keine Rolle spielt, muß ich noch
> suchen.

Schaltest du die Ausgangsstufe ab (High-Z) oder was treibst du da?

von Walter T. (nicolas)


Lesenswert?

Ich muß mal zusehen, wie man SPI/DMA pausieren kann, ohne die 
Treiberstufe hochohmig zu schalten. Am kommenden Wochenende werde ich 
wohl nicht dazu kommen, aber generell wird das ja keine 
Raketenwissenschaft sein.

von Philipp K. (philipp_k59)


Lesenswert?

Walter T. schrieb:
> Der Pull-Up generiert bei jedem Abschalten einen
> weiteren Flankenwechsel als Artefakt.

Nur so mal eine Idee, vielleicht mal den SPI-Mode zu den Pullups 
anpassen..

auf Ruhelage HIGH!

von Joe F. (easylife)


Lesenswert?

Philipp K. schrieb:
> Nur so mal eine Idee, vielleicht mal den SPI-Mode zu den Pullups
> anpassen..
>
> auf Ruhelage HIGH!

Das schmeckt dem ILI9341 nicht gut... ;-)

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.