Forum: Mikrocontroller und Digitale Elektronik SPI funktioniert nur mit Tastkopf


von Tom L. (munzi)


Lesenswert?

Hallo,

ich habe eine SPI-Verbindung zwischen 2 uC mit ca. 1 MHz, die nur 
funktioniert, wenn ein Tastkopf an SCK angeschlossen ist, bzw. ein Kabel 
auch ohne Oszi. Auch bei einem einfachen BNC-Kabel ohne 
(1:1/1:10)-Tastkopf. Sonst empfange ich nur Datenmüll, oft um ein paar 
Bits verschoben, aber meistens ohne Zusammenhang zum gesendeten Signal.

Nun habe ich bereits von SCK 10pF, bzw. 100pF nach Masse gezogen, was 
aber nichts gebracht hat. Dummerweise habe ich keine SS-Leitung, was ich 
aber nicht ändern kann.

Mit dem Kabel funktioniert die Kommunikation einwandfrei. Was kann ich 
tun?



Viele Grüße
Munzi

von Klaus (Gast)


Lesenswert?

Jürgen Ungerer schrieb:
> Mit dem Kabel funktioniert die Kommunikation einwandfrei. Was kann ich
> tun?

Mit der anderen Clockflanke das Datensignal übernehmen

MfG Klaus

von (prx) A. K. (prx)


Lesenswert?

Wie lang ist die Leitung zwischen den µCs?

von Der Rächer der Transistormorde (Gast)


Lesenswert?

Mit Tastkopf oder Kabel hat das vermutlich nichts zu tun. Ein Oszi hat 
ja in erster Linie eine Eingangsimpedanz. Die hat eine SPI so erstmal 
nicht also liegt für mich nahe das es irgendwo zu Reflektionen kommt 
oder die Pegel nicht reichen. Auch die Fehler lassen das vermuten.

Also erstmal eine Abschlusswiderstand versuchen, danach einen 
Reihenwiderstand um die slew rate zu verringern und dann einen pull up 
Widerstand um den Pegel zu beeinflussen.

von Tom L. (munzi)


Lesenswert?

A. K. schrieb:
> Wie lang ist die Leitung zwischen den µCs?

Die Leitung ist vielleicht 3cm lang. Die CPOL habe ich schon umgedreht. 
Hat nix gebracht.

von 6A66 (Gast)


Lesenswert?

Jürgen Ungerer schrieb:
> Die Leitung ist vielleicht 3cm lang.

Hallo Jürgen,

wir haben ein ähnliches Problem, auch auf kurze Distanz, bei uns jedoch 
umgekehrt: Je mehr Last (wenige pF des Tastkopfes) desto mehr Müll kam 
an. Die Taktleitung der SPI Schnittstelle IST sehr empfindlich. 
Abschließen ist eine gute Empfehlung, schau auch in das Datenblatt des 
Herstellers dazu rein.

Wir haben im übrigen NICHTS gemacht nachdem die Kommunkation ohne Last 
stabil geblieben ist.

rgds

von (prx) A. K. (prx)


Lesenswert?

6A66 schrieb:
> Abschließen ist eine gute Empfehlung, schau auch in das Datenblatt des
> Herstellers dazu rein.

Bei einer 3cm langen Leitung wirkt das nicht wirklich zwingend.

von (prx) A. K. (prx)


Lesenswert?

Testweise mal einen Pullup- oder Pulldown-Widerstand an SCK gehängt?

von Tom L. (munzi)


Lesenswert?

Der Rächer der Transistormorde schrieb:
> Mit Tastkopf oder Kabel hat das vermutlich nichts zu tun. Ein Oszi hat
> ja in erster Linie eine Eingangsimpedanz. Die hat eine SPI so erstmal
> nicht also liegt für mich nahe das es irgendwo zu Reflektionen kommt
> oder die Pegel nicht reichen. Auch die Fehler lassen das vermuten.
>
> Also erstmal eine Abschlusswiderstand versuchen, danach einen
> Reihenwiderstand um die slew rate zu verringern und dann einen pull up
> Widerstand um den Pegel zu beeinflussen.

Ein 10k von SCK gegen Masse und es läuft.

von Falk B. (falk)


Lesenswert?

@  Jürgen Ungerer (munzi)

>Ein 10k von SCK gegen Masse und es läuft.

Behauptung oder Beobachtung? Das ist eher ein Zeichen dafür, dass was 
faul ist. SPI läuft, wenn man ein paar Grundreglen beachtet sehr stabil, 
erst recht bei 3cm Kabellänge. Ohne irgendwelche Pull-Widerstände.

von (prx) A. K. (prx)


Lesenswert?

Solange SPI nicht eingeschaltet ist floatet SCK. Wenn der Slave vor dem 
Master eingeschaltet wird und keine per Pullup deaktivierte SS-Leitung 
hat, dann taktet er jede Störung auf SCK als Daten durch.

Der Pulldown bewirkt, dass SCK keine Störtakte liefert, wenn der Master 
nicht aktiv konfiguriert ist. Je nach SPI-Modus ist ein Pulldown- oder 
up angesagt.

Ein grundlegendes Problem bleibt: Ein einziger Störtakt und die ganze 
Chose gerät ausser Tritt, gibt dann eine bleibende Bitverschiebung. Wenn 
mangels SS oder eines anderen Signal keine Möglichkeit besteht, den 
Beginn oder Ende eines Frames zu erkennen, dann muss in Software ein Weg 
gefunden werden, den SPI-Slave beispielsweise bei längerer Inaktivität 
zurück zu setzen. Und der Master muss ab und zu für eine solche Pause 
sorgen.

von Tom L. (munzi)


Lesenswert?

Falk Brunner schrieb:
> Behauptung oder Beobachtung? Das ist eher ein Zeichen dafür, dass was
> faul ist. SPI läuft, wenn man ein paar Grundreglen beachtet sehr stabil,
> erst recht bei 3cm Kabellänge. Ohne irgendwelche Pull-Widerstände.

Das ist eine Beobachtung.

A. K. schrieb:
> Solange SPI nicht eingeschaltet ist floatet SCK. Wenn der Slave vor dem
> Master eingeschaltet wird und keine per Pullup deaktivierte SS-Leitung
> hat, dann taktet er jede Störung auf SCK als Daten durch.

Dann kann ich, abgesehen vom SS-Problem, das Problem lösen indem ich die 
Master-SPI vor der Slave-SPI initialisiere?


Vielen Dank und viele Grüße
Munzi

von Falk B. (falk)


Lesenswert?

@  A. K. (prx)


>Solange SPI nicht eingeschaltet ist floatet SCK. Wenn der Slave vor dem
>Master eingeschaltet wird und keine per Pullup deaktivierte SS-Leitung
>hat, dann taktet er jede Störung auf SCK als Daten durch.

Das klingt plausibel.

von (prx) A. K. (prx)


Lesenswert?

Jürgen Ungerer schrieb:
> Dann kann ich, abgesehen vom SS-Problem, das Problem lösen indem ich die
> Master-SPI vor der Slave-SPI initialisiere?

Ja.

Aber wie schon erwähnt: Wenn das mal ausser Tritt gerät, dann fängt es 
sich nicht automatisch wieder sondern bleibt verschoben.

von Peter D. (peda)


Lesenswert?

Jürgen Ungerer schrieb:
> Dummerweise habe ich keine SS-Leitung, was ich
> aber nicht ändern kann.

Solange Du Dich nur selber damit rumärgern mußt, bitteschön.

Verkaufen würde ich so ein Produkt aber nicht, das gibt mit Sicherheit 
Probleme.


Peter

von Tom L. (munzi)


Lesenswert?

Ich habe es gerade probiert. Anscheinend ist das mit der Initialisierung 
nicht so einfach, da es auch in dieser Reihenfolge ohne den 10k nicht 
funktioniert.

von skyperhh (Gast)


Lesenswert?

Sind die beiden uC's von Atmel, also ATMega32 oder ähnlich?

von Tom L. (munzi)


Lesenswert?

skyperhh schrieb:
> Sind die beiden uC's von Atmel, also ATMega32 oder ähnlich?

Nein, sie sind ARM Cortex, genauer STM32.

von skyperhh (Gast)


Lesenswert?

Ok... denn bei den ATMegas ist der SS-Eingang im SPI Master Mode eine 
schöne Fehlerquelle, wenn der Pin als Eingang konfiguriert ist!! Dann 
muss er auf High liegen, bei Low schaltet der uC sonst in den Slave Mode 
... wenn der SS-PIN als Ausgang gesetzt ist hat er keinen Einfluss ...

Evtl. hat der STM32 ein ähnliches Verhalten...

von (prx) A. K. (prx)


Lesenswert?

Jürgen Ungerer schrieb:
> Nein, sie sind ARM Cortex, genauer STM32.

Dann wär das Programm vielleicht interessant. Über die SS-Programmierung 
des STM32-SPI haben sich schon viele gewundert. Ja, ich weiss du hast 
kein SS. Aber der STM32 hat trotdem eines, und sei es nur intern, ob du 
willst oder nicht. Wenn man da nicht aufpasst, dann wird aus dem Master 
flugs mal ein Slave.

von Tom L. (munzi)


Lesenswert?

A. K. schrieb:
> Dann wär das Programm vielleicht interessant.

Beim Slave setze ich im CR1-Register das SoftwareSlaveManagement-Bit 
(Bit 9), sowie den Prescaler, gemäß Datenblatt: "set the SSM bit and 
clear the SSI bit in the SPI_CR1 register"

Beim Master zusätzlich noch das InternalSlaveSelect-Bit (Bit 8) und das 
Master-Config-Bit. Nach der Initialisierung geht der Rest über DMA, aber 
das ist ja für NSS weniger relevant.

von Tom L. (munzi)


Lesenswert?

skyperhh schrieb:
> Ok... denn bei den ATMegas ist der SS-Eingang im SPI Master Mode eine
> schöne Fehlerquelle, wenn der Pin als Eingang konfiguriert ist!! Dann
> muss er auf High liegen, bei Low schaltet der uC sonst in den Slave Mode
> ... wenn der SS-PIN als Ausgang gesetzt ist hat er keinen Einfluss ...

Am NSS-Pin liegt an Master und Slave bereits ein Signal an (Pins jeweils 
als Eingang konfiguriert). Daher kann ich den NSS nicht einfach auf High 
ziehen.

von 6A66 (Gast)


Lesenswert?

Jürgen Ungerer schrieb:
> Nein, sie sind ARM Cortex, genauer STM32.

Jou, bei uns auch!

rgds

von (prx) A. K. (prx)


Lesenswert?

Jürgen Ungerer schrieb:
> Beim Slave setze ich im CR1-Register das SoftwareSlaveManagement-Bit
> (Bit 9), sowie den Prescaler, gemäß Datenblatt: "set the SSM bit and
> clear the SSI bit in the SPI_CR1 register"
>
> Beim Master zusätzlich noch das InternalSlaveSelect-Bit (Bit 8)

Du löschst also auf dem Master SSI und setzt Bit 8?
In welcher Reihenfolge? ;-)

von Tom L. (munzi)


Lesenswert?

A. K. schrieb:
> Jürgen Ungerer schrieb:
>> Beim Slave setze ich im CR1-Register das SoftwareSlaveManagement-Bit
>> (Bit 9), sowie den Prescaler, gemäß Datenblatt: "set the SSM bit and
>> clear the SSI bit in the SPI_CR1 register"
>>
>> Beim Master zusätzlich noch das InternalSlaveSelect-Bit (Bit 8)
>
> Du löschst also auf dem Master SSI und setzt Bit 8?
> In welcher Reihenfolge? ;-)

OK, ich drücke mich klarer aus:
Nach der Konfiguration ist CR1 beim Slave 0x0228 (das SSM-Bit ist 
gesetzt und SSI gelöscht) und beim Master ist CR1 0x032C (sowohl SSM als 
auch SSI und darüberhinaus MSTR gesetzt).

von skyperhh (Gast)


Lesenswert?

Jürgen Ungerer schrieb:
> Am NSS-Pin liegt an Master und Slave bereits ein Signal an (Pins jeweils
> als Eingang konfiguriert). Daher kann ich den NSS nicht einfach auf High
> ziehen.

... ich hab keine Ahnung, ob der ARM STM sich ähnlich oder genauso wie 
ein ATMega verhält. Wenn der STM aber auch Multimaster-Fähigkeit für den 
SPI-Bus hat, dann könnte das ganze vielleicht damit zusammen hängen... 
am besten tief in der Doku zum uC nachschauen...

von Peter D. (peda)


Lesenswert?

Die einzig professionelle Lösung ist, die Platine wegzuschmeißen und 
eine neue mit SS-Leitung zu machen.

Ansonsten geh lieber in die Politik. Da werden auch nur die Symptome 
bekämpft, nicht aber die Ursachen. Sonst könnte sich ja was ändern (Gott 
behüte).


Peter

von Munzi (Gast)


Lesenswert?

Mir ist völlig klar, dass es SS braucht. Aus der Beschreibung zu SS wird 
aber kein Mensch schlau, weswegen es ja auch so viele Fragen hier dazu 
gibt. Da vermisse ich die guten alten AVR-Datenblätter.

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.