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
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
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.
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
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
Uwe schrieb: > Hat jemand noch eine Idee, was ich noch machen könnte? Benutzt du die richtige Flanke vom Clock?
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
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
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
Naja du kannst versuchen das Übersprechen durch nicht so steile Flanken kleiner zu bekommen. Quelle: 470Ohm + 1nF Senke: Schmitt-trigger Eingang
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
Hallo, was wären denn sinnvolle Widerstandswerte für den Schmitt-Trigger. Also welche Spannungen würde mal als Schwellwert nehmen? Danke! Gruß Uwe
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?
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
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
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
Uwe schrieb: > Dietrich L. schrieb: >> Ist ein Stützkondensator am Sensor? > > An der Spannungsversorgung? Ja! Gruß Dietrich
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
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...
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
@ 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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.