Forum: Mikrocontroller und Digitale Elektronik Problem mit SPI - lange Kabel!?


von Uwe (Gast)


Lesenswert?

Hi und hallo,

ich habe ein Problem mit einer SPI-Leitung. Ich versuche einen 
Temperatursensor per SPI auszulesen. Ich habe ein Controller-Board mit 
einem Atmel. Dazu ein kleines Board, auf dem im Moment der 
Temperatursensor sitzt. Da sollen vielleicht auch mal noch andere 
Sensoren drauf.

Das Problem ist nun, dass der Temperatursensor nur Müll liefert. Das 
Kabel zwischen Controller-Platine und der Platine mit dem 
Temperatursensor ist etwa 25cm lang.
Ich habe nun mal das Kabel auf 5cm gekürzt und siehe da, das Ganze 
funktioniert und der Sensor liefert saubere Daten. Also liegt es wohl am 
Kabel. Ich verwende im Moment ein normales Flachbandkabel mit Steckern 
in Schneid-/Klemmtechnik, keine Ahnung, wie die heißen.
Kurzes Kabel alles Ok, langes nur Mist.

Hat jemand eine Idee, wie ich da noch etwas dran drehen könnte?

Grüße
Uwe

von Achim M. (minifloat)


Lesenswert?

Kommunikation nicht mit Vollgas, sondern langsamer. Wie schnell machst 
du deinen SPI? Wenn F_CPU/2 dann ist mir das vollkommen klar. Schraubs 
mal runter auf 100kHz und wunder dich dann bitte nicht, dass >5m 
gehen...
mfg mf

von Martin (Gast)


Lesenswert?

Bei Flachbandkabeln kannst du auch jede zweite Ader mit GND belegen und 
einen geeigneten Abschlusswiderstand (Stichwort: Wellenwiderstand) am 
Ende von relevanten Leitungen (z.B. SCK) einsetzen.

von Uwe (Gast)


Lesenswert?

Hallo,

im Moment läuft es mit 2MHz. Ich habe 16MHz am Controller. Habe es mit 
125kHz ( 16MHz/128 ) probiert, aber auch das funktioniert leider nicht. 
Mit einem kurzen Kabel geht es dann wieder.

Martin schrieb:
> Bei Flachbandkabeln kannst du auch jede zweite Ader mit GND belegen

Das geht leider nicht, weil nicht genug Platz wäre, um noch mehr Ader zu 
führen.

Das mit der Terminierung habe ich mir schon angeschaut. Ich werde mal 
testen, direkt am Sensor einen Widerstnd in die Clockleitung zu legen. 
Mal sehen, ob es was bringt.

Danke!
Gruß
Uwe

von Uwe (Gast)


Lesenswert?

Hallo,

ich habe jetzt einmal versucht einen Widerstand in die Clockleitung zu 
legen. ICh habe Werte zwischen 100 und 150 Ohm versucht. Nun Kommt jeder 
zweite Wert richtig an. Ein Wert wird also richtig empfangen, der 
nächste nicht, dann wieder ein richtiger Wert usw.

Das funktioniert aber auch nur bei 125kHz. Bei 2MHz funktioniert auch 
das nicht.

Hat jemand noch eine Idee, was ich noch machen könnte?


Danke!
Gruß
Uwe

von µC-Bastler (Gast)


Lesenswert?

Uwe schrieb:
> Hat jemand noch eine Idee, was ich noch machen könnte?

Benutzt du die richtige Flanke vom Clock?

von Klaus (Gast)


Lesenswert?

Uwe schrieb:
> Martin schrieb:
>> Bei Flachbandkabeln kannst du auch jede zweite Ader mit GND belegen
>
> Das geht leider nicht, weil nicht genug Platz wäre, um noch mehr Ader zu
> führen.

Du wirst ein so großes Übersprechen zwischen Clock und Daten haben, daß 
es so garnicht geht.

Das einzige was du versuchen kannst, ist die Signale "klein" und "krumm" 
zu machen, also 1 bis 2k Längswiderstand an der Quelle und 
Schmitt-Trigger am Empfänger.

MfG Klaus

von Uwe (Gast)


Lesenswert?

Hallo,

ja, das dürfte alles richtig sein, denn mit einem kurzen Kabel 
funktioniert es ja einwandfrei.

Ich habe mittlerweile ich festegestellt, dass es mit einem 270 Ohm 
Widerstand das gleiche bei 2MHz gibt. Es wird jeder zweite Wert richtig 
ausgelesen. ABER...nach einer Weile, Dauer immer unterschiedlich, werden 
nur noch falsche Werte ausgelesen.

Also alle 1000ms wird der Sensor mit 2MHz ausgelesen. Für einige Zeit 
wird jeder zweite WErt richtig erfasst. Nach einer Weile sind alle Werte 
falsch.

Einfach ein Widerstand scheint hier wohl nicht die richtige Lösung zu 
sein.

Gruß
Uwe

von Dietrich L. (dietrichl)


Lesenswert?

Ist ein Stützkondensator am Sensor?

Gruß Dietrich

von Klaus (Gast)


Lesenswert?

Uwe schrieb:
> Nach einer Weile sind alle Werte falsch.

Da wird der Takt aus der Synchronisation geraten sein.

Uwe schrieb:
> Einfach ein Widerstand scheint hier wohl nicht die richtige Lösung zu
> sein.

Die richtige Lösung ist, Daten und Clockleitung zu trennen.

Stell doch mal ein Bild von den Signalen rein.

MfG Klaus

von Matthias K. (mkeller)


Lesenswert?

Naja du kannst versuchen das Übersprechen durch nicht so steile Flanken 
kleiner zu bekommen.

Quelle:  470Ohm + 1nF
Senke: Schmitt-trigger Eingang

von Uwe (Gast)


Lesenswert?

Klaus schrieb:
> Stell doch mal ein Bild von den Signalen rein.

Kann ich im Moment leider nicht. Kein entsprechendes Oszi da.

Matthias Keller schrieb:
> Naja du kannst versuchen das Übersprechen durch nicht so steile Flanken
> kleiner zu bekommen.
>
> Quelle:  470Ohm + 1nF
> Senke: Schmitt-trigger Eingang

Das werde ich mal versuchen.

Dietrich L. schrieb:
> Ist ein Stützkondensator am Sensor?

An der Spannungsversorgung?

Gruß
Uwe

von Uwe (Gast)


Lesenswert?

Hallo,

was wären denn sinnvolle Widerstandswerte für den Schmitt-Trigger. Also 
welche Spannungen würde mal als Schwellwert nehmen?


Danke!

Gruß
Uwe

von µC-Bastler (Gast)


Lesenswert?

Uwe schrieb:
> Kann ich im Moment leider nicht. Kein entsprechendes Oszi da.

Dann besorg' dir ganz schnell eins. An den 25 cm Leitungslänge darf das 
auch bei 2 MHz nicht scheitern. Ohne deinen Temperatursensor und deine 
SPI Konfiguration zu kennen, ist das zielloses rumgefrickel und 
wahrscheinlich Rutscherei auf irgendwelchen Flanken. Bist du sicher, 
dass du den richtigen SPI Mode benutzt?

von Uwe (Gast)


Lesenswert?

Hallo,

bin mir recht sicher, dass der SPI Mode stimmt. Mit kurzen Kabeln 
funktioniert es ja einwandfrei.

Mittlerweile habe ich allerdings mal einen anderen Sensor getestet 
TMP122. Hatte ich noch rumfliegen. Der macht es auch mit langen Kabeln. 
Beide im SPI-Mode NUll, also CPOL und CPHA=0. Liegts doch am SPI-Mode?

Der, der nicht will ist ein ADT7301. Link zum Datenblatt:
http://www.analog.com/static/imported-files/data_sheets/ADT7301.pdf

Das mit dem Oszi muss wohl bis nach Ostern warten.

Danke!

Gruß
Uwe

von spess53 (Gast)


Lesenswert?

Hi

>bin mir recht sicher, dass der SPI Mode stimmt. Mit kurzen Kabeln
>funktioniert es ja einwandfrei.

Ja. U.U. auch mit falschem Mode. 25cm Kabel und 2MHz sind lächerlich. Du 
dokterst an der falschen Baustelle herum.

MfG Spess

von Uwe (Gast)


Lesenswert?

Hallo,

ich bin nun alle 4 SPI-Modi durchgegangen, aber bei allen das gleiche 
Bild leider. Es werden auch immer die gleichen Daten empfangen. Bei 
stark steigender Temperatur verdoppelt sich der Wert dann irgendwann, 
aber vernünftige Daten kommen nicht.

Gruß
Uwe

von Dietrich L. (dietrichl)


Lesenswert?

Uwe schrieb:
> Dietrich L. schrieb:
>> Ist ein Stützkondensator am Sensor?
>
> An der Spannungsversorgung?

Ja!

Gruß Dietrich

von Uwe (Gast)


Lesenswert?

Hallo,

Dietrich L. schrieb:
>> Dietrich L. schrieb:
>>> Ist ein Stützkondensator am Sensor?
>>
>> An der Spannungsversorgung?
>
> Ja!

Ja, habe ich.


Das ist echt verwunderlich ein TMP122 von TI funktioniert auf anhieb mit 
langem Kabel. der ADT nur mit sehr kurzen. Der scheit da mega 
empfindlich zu sein irgendwie. Ich denke,ich komme nicht drum herum, mir 
mal die Flanken von beiden Sensoren anzusehen, um zu schauen, wo der 
Unterschied liegt.

Danke!

Gruß
Uwe

von Martin M. (capiman)


Lesenswert?

Vielleicht hab ich es überlesen, aber

- welcher uC wird eingesetzt
- hast du eine Schaltung, wie du den Controller
  und den Sensor verbunden hast (welche Leitungen am uC)
  -> Bild / Schaltung sagt mehr wie 1000 Worte
- vielleicht etwas Source-Code, in dem die Einstellung
  der verwendeten Schnittstelle und die Kommunikation
  mit dem Sensor zu sehen ist

Vielleicht kämpfst du auch gegen mindestens 2 Fehler?
Wenn du an einer Stelle drehst, wird es nicht besser,
auch wenn dadurch ein Fehler behoben wird,
weil der andere dann immer noch drin ist...

von Uwe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich nutze im Moment einen AT90CAN32. Den Habe ich hier auf so einem 
kleinen Eval-Board. Das ist nur eine Leihgabe.

Den Tempsensor habe ich wie im Anhang zu sehen angeschlossen. Das Kabel 
ist ein 6 poliges Flachbandkabel mit entsprechenden Wannensteckern und 
den dazu passenden Buchsen am Kabel.

Hier ist mal ein wenig Code; Einstellung des SPI:
1
SPI_DDR &=~(1<<MISO);      
2
SPI_DDR |= (1<<Clock);        
3
SPI_DDR |= (1<<MOSI);      
4
SPI_DDR |= (1<<SS);      
5
6
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<CPOL)|(0<<CPHA);
7
// CPOL= 0, CPHA= 0
8
// Clock active High, Data sampled on rising edge
9
SPSR=(1<<SPI2X);

Hier ist ein Ausschnitt von der Kommunikation mit dem Sensor:
1
PORT_SS |= (1<<PE5);  
2
      _delay_us(10);            
3
SPDR= 0x80;              
4
while(!(SPSR & (1<<SPIF)));      
5
temperature= (SPDR<<8);        
6
SPDR= 0x00;              
7
while(!(SPSR & (1<<SPIF)));      
8
temperature+= SPDR;
9
          
10
PORT_SS &= ~(1<<PE5);


Danke!

Gruß
Uwe

von Falk B. (falk)


Lesenswert?

@  Uwe (Gast)

>Den Tempsensor habe ich wie im Anhang zu sehen angeschlossen. Das Kabel
>ist ein 6 poliges Flachbandkabel mit entsprechenden Wannensteckern und
>den dazu passenden Buchsen am Kabel.

Die Pinbelegung ist suboptimal. Das kritische Signal SCK sollte direkt 
neben der Masse liegen, siehe Wellenwiderstand. Der Längswiderstand 
in deiner SCK Leitung sollte im Bereich 20-100 Ohm liegen, muss man ein 
wenig experimentieren.

>SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<CPOL)|(0<<CPHA);

(0<<CPOL) solche Sachen sind sinnfrei, siehe [[Bitmanipulation]}.

>// CPOL= 0, CPHA= 0
>// Clock active High, Data sampled on rising edge

Der Kommentat ist falsch. Und dein Sensor braucht SPI mode 3, also eher

CPOL= 1, CPHA= 1

>PORT_SS |= (1<<PE5);
>      _delay_us(10);

Das lesen wir nochmal nach. CS ist low active, muss also am Anfang von 
High auf Low wechseln.

MFG
Falk

von Stephan H. (stephan-)


Lesenswert?

ich hatte das gleiche Problem mit dem ADT. Hatte ich damals auch schon 
hier gepostet. Ich hatte auch Flachband. Ab ca. 10-15 cm gab es massive 
Probleme.
ADT sagte mir per Mail dazu, das ich ein ein CAT 5  Kabel nehmen soll. 
Auch die Terminierung brachte wenig bis nichts. Das Ding scheint im 
allg. recht kritisch zu sein.

Gruß

ps.: ich hatte damals das SPI zu Fuss gemacht, max. 1Mhz und deutlich 
langsamer. Aber mehr als 20cm habe ich auch nicht zuverlässig hin 
bekommen.
DS1820 ist da deutlich genügsamer.

von Uwe (Gast)


Lesenswert?

Stephan Henning schrieb:
> ich hatte das gleiche Problem mit dem ADT. Hatte ich damals auch schon
> hier gepostet. Ich hatte auch Flachband. Ab ca. 10-15 cm gab es massive
> Probleme.
> ADT sagte mir per Mail dazu, das ich ein ein CAT 5  Kabel nehmen soll.
> Auch die Terminierung brachte wenig bis nichts. Das Ding scheint im
> allg. recht kritisch zu sein.
>
> Gruß
>
> ps.: ich hatte damals das SPI zu Fuss gemacht, max. 1Mhz und deutlich
> langsamer. Aber mehr als 20cm habe ich auch nicht zuverlässig hin
> bekommen.
> DS1820 ist da deutlich genügsamer.

Da bin ich ja ein wenig beruhigt, dass ich nicht der Einzige bin, der 
damit Probleme hat. Ich bin vorerst mal auf einen anderen Sensor 
umgestiegen.


Falk Brunner schrieb:
>>PORT_SS |= (1<<PE5);
>>      _delay_us(10);
>
> Das lesen wir nochmal nach. CS ist low active, muss also am Anfang von
> High auf Low wechseln.

Ja, ist quatsch, keine Ahnung, im Code habe ich es richtig, keine 
Ahnung, warum ich es hierhin Stückweise kopiert habe. Sonst würde mein 
Code ja auch gar nicht laufen.

Falk Brunner schrieb:
>>SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<CPOL)|(0<<CPHA);
>
> (0<<CPOL) solche Sachen sind sinnfrei, siehe [[Bitmanipulation]}.

Ja, mag sein, aber es hat mir geholfen den Überblick über die 
Einstellung der Modi zu helfen.

Falk Brunner schrieb:
> Die Pinbelegung ist suboptimal. Das kritische Signal SCK sollte direkt
> neben der Masse liegen, siehe Wellenwiderstand. Der Längswiderstand
> in deiner SCK Leitung sollte im Bereich 20-100 Ohm liegen, muss man ein
> wenig experimentieren.

Werde ich beachten, wenn ich das nochmal neu aufbaue. Das mit den 
Widderständen werde ich mal so nach und nach testen.

Danke erst einmal. Ich werde noch ein wenig weiter experimentieren und 
dann mal wieder Bericht erstatten.

Gruß
Uwe

von Stefan Z. (Gast)


Lesenswert?

Hi!

Noch ein Tipp:
Es könnte helfen, wenn Du direkt am Eingang des Sensors an Daten und 
Clock einen RC Tiefpassfilter verwendest.

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.