mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit I2C Bus


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende LM92 Sensoren zum Messen der Innen und Außentemperatur. Ein
LM92 sitzt also direkt auf der Platine, der andere ist über 3m Flachband
Kabel angeschlossen.
Pullups: je 1kOhm und zusätzlich noch 47Ohm in Serie zur langen
Leitung.
Das ganze ist an einen mega8515 angeschlossen und läuft per Software
I2C Routinen mit rund 30kHz.
Allerdings gibt es sehr oft Probleme (kein ACK, falsche Daten usw.)
Das ganze lief jetzt rund 1 Jahr mehr oder weniger mit
Fehlerkorrektur.
Seit gestern liefert der Außensensor keine Daten mehr.
Also habe ich einen einfachen I2C Logger (attiny2313 + 10cm Kabel)
angeschlossen, um mir den Datenverkehr anzuschauen.
Jetzt liefert der Außensensor plötzlich fehlerfrei die Daten, dafür
bekomme ich vom Innensensor kein ACK mehr.

In verschiedensten AppNotes von Philips wurde I2C mit einigen 10m
problemlos bei 100kHz betrieben. Wieso habe ich also bereits bei 30kHz
und 3m Kabel solche Probleme ?

Auf dem Oszilloskop sehen die Signale ziemlich rechteckig aus, also
scheint das ganze an Reflektionen am Kabel zu liegen. Das kann ich
allerdings schlecht beurteilen, denn je nach Zusatztlast am Kabel geht
entweder alles besser oder garnichtmehr.

Kann man einen I2C Bus beidseitig terminieren, und wenn ja wie ?
Oder gibt es sonst noch irgendeine Lösung ?

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal, beidseitig Pullup-Widerstände zu setzen, evtl. nur 4k7 beim
Slave (Sensor) und nicht 1k.

Ich hätte bisher bei I2C keine nennenswerten Probleme festgestellt über
ca. 10m, v.a. nicht bei nur 30kHz.

Die Software I2C Routine ist sauber?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Software Routine nutzte ich für viele andere Sachen, und hatte
damit noch nie Probleme. Auf kurze Entfernung läuft die auch wunderbar
mit beiden Sensoren (je ca. 10cm Kabel)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I2C-Bauteile sind für max 3mA spezifiziert, d.h. 1k (5mA) ist zu klein.

Ich nehme 1,8k.

Es kann auch nichts schaden, auf beiden Seiten des Kabels je einen
Pullup (doppelter Wert) zu setzen.


Peter

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der Außensensor auf einer Platine in einem Gehäuse untergebracht,
oder direkt am Flachbandkabel angelötet und eingeschrumpft o.ä.?
Ich hatte auch LM92 eingeschrumpft, wenns nicht richtig dicht ist, kann
eindringendes Wasser wohl Schaden anrichten. Da würde ich mal nachsehen.
Und die Pullups sind nicht etwas klein? Würde auch mind. 4k7 verwenden,
hat bei mir immer problemlos funktioniert.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auf 10cm gibt es vermutlich auch keine Störungen auf den Kabeln.
Wie verhält sich die I2C-Routine bei Störungen?
Flankenwechsel von SDA/SCL auf Störspitzen geprüft (also erst als
gültig betrachtet, wenn sie eine Mindestzeit einhalten)?
Wenn die Routine sofort bei Wechsel auf SDA/SCL weitermacht, reicht
jede Störnadel, um den Ablauf aus dem Tritt zu bringen.

Nur als Vermutung...

Gruß aus Berlin
Michael

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt 4,7k beim uC und 6,8k beim Außensensor. Es geht ein
kleinwenig besser, aber immer noch nicht so wie es sein sollte.

Ist eine Slew Rate Begrenzung sinnvoll (über zusätzliche Kondendatoren
am uC) so wie es eigentlich die I2C Spezifikationen vorsehen, oder
haben die Leitungen ausreichend Kapazitäten ?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich nehme mal an du hast sogar zuviel kapazitäten drauf.. bei philips
gibts eine appnote über i2c-expander und wie weit das mit welcher
geschwindikgeht geht... ich würd sagen 1Khz müsste schon gehn...

oder eben nen i2c expander...

73

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3 Meter unabgeschirmtes Flachbandkabel bilden eine schöne Antenne. Ich
würde es erst mal mit abgeschirmtem Mikrofonkabel o.ä. probieren, das
hilft mehr als niederohmige Abschlußwiderstände ( die natürlich auch
eingestreute Hochfrequenz vermindern).

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

wie verhält sich Dein System wenn:

- Die Taktrate sehr stark verringert wird ?

- Die Widerstände Durch eine Konstantstromquelle ersetzt werden ?



Wo kann man diese Sensoren beziehen?

Gruß

Bernhard

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Taktratenänderung bringt nicht viel, ich habe schon von 10kHz bis
100kHz alles durchprobiert.

Stromquelle könnte ich mal einbauen, aber die Signale sehen eigentlich
fast rechteckig aus, und das trotz Tastkopflast (mit dieser bekomme ich
aber garkein Acknowledge mehr).

Wo man die LM92 bekommt weiß ich nicht, aber ich würde von denen auch
abraten. Diese sind meiner Meinung nach sehr empfindlich was eine nicht
perfekt saubere Betriebspannung angeht. Dann laufen diese auch mit
kurzem Kabel nicht. Der LM92 gehört in den selben Bereich wie der LM75
mit dem auch schon einige andere hier im Forum Probleme hatten.
Ich verwende den DS1820 auch schon seit längerem, am Anfang parallel zu
dem LM92 über ein gleichlanges Kabel. Selbst ohne CRC hatte ich damit
noch nie einen Übertragungsfehler. Auch die Temperatur springt weitaus
weniger. Dafür kostet der etwas mehr und die Übertragung ist halt
asynchron weshalb das Timing kritisch ist (weshalb ich auch den LM92
verwendet habe, was eine Fehlentscheidung war.)

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass sich der LM92 intern "aufhängt" ?

Was passiert, wenn Du, bevor Du die Daten ausliest, die
Betriebsspannung der LM92 kurzzeitig abschaltest (Reset)?

Die Pins für die Adressvergabe liegen auch richtig auf HIGH bzw LOW und
bammeln nicht in der Luft?

Ersetze doch den LM92 mal durch einen anderen SLAVE, zB. TWI-EEPROM,
treten dann die gleichen Probleme auf?

Autor: Peter -NL (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> kein ACK, falsche Daten usw.

Siehe Philips Application Note AN444 im Anhang.
-Ist das Flachkabel unbeschaedigt?
-Problem mit uebersprechen? Liegt jede zweite Leitung im Flachkabel an
Masse?
-Schwebt nicht irgendwo eine Masseanschluss?
-Ist der Fehler irrgendwie Temperatur-/Feuchte-/Sonne-abhaengig?
-Ist die Versorgungsspannung (an allen Enden gemessen) in Ordnung?
-Ist die Versorgungsspannung (an allen Enden) gepuffert und
entkoppelt?
-Sind die SCL und SDA Pegel fuer 0 und 1 (an allen Enden) in Ordnung?
-Gibt es eine kalte Loetstelle?
-Gibt es eine nahezu Unterbrechung (oder zu wenig Querschnitt)
irgendwo im Flachkabel?
-Falls das Flachkabel auf insgesamt 5-6 Meter verlaengert wird
funktioniert es besser/gleich/schlechter/gar nicht mehr?
-Kann dein Oszi speichern und triggern auf Impulszeit kleiner als SCL
Clockpuls?
-Kann dein Oszi speichern und bleibt SDA immer stabil 0 oder 1 waehrend
SCL 1 ist?
-"Zusatztlast", "Tastkopflast", ... sind Tastkopf und
Masseverbindung in Ordnung?
-Was sind die Umgebungsbedingungen? Gibt es Stoerquellen in der naehe?

Abgeschirmtes Kabel verwenden. Eventuell Leitungstreiber (I2C expander)
verwenden.

Es wird schon zu spaet....

Peter -NL

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach langer Fehlersuche habe ich die Fehler doch noch gefunden:
- Die Leitungen wirken als Antenne, daher werden selbst bei
fehlerfreier Schaltung ab und zu ein paar Werte falsch übertragen: Kann
ich per Software abfangen
- Das Kabel hatte an der Stelle wo es durch das Fenster nach draußen
geht eine kleine Unterbrechung
- Die Platine mit dem uC hatte eine schlechte Lötstelle so dass ab und
zu die Betriebsspannung ausfiel. Der mega8515 @16MHz versorgte sich
dann über Datenleitungen und lief stabil mit 1,8V. Selbst dem SRAM
schien die 1,8V nichts auszumachen, nur der I2C Bus fiel dann aus.

Autor: Peter -NL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut das Du weitergesucht und nicht aufgegeben hast!
Auch gut dass Du hier eine Nachricht schreibst.

Vielleicht schreibst Du noch eine weitere Nachricht falls (und wie) Du
tatsaechlich DIE FEHLER gefunden hast, behoben, und es auch wirklich
zuverlaessig funktioniert.

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bendikt

>Nach langer Fehlersuche habe ich die Fehler doch noch gefunden

Das kostet Dich aber für uns alle eine Runde Limonade ;)

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mich zu früh gefreut:
Vorgestern abend, 23Uhr: 26,9°C
Das ist etwas zu warm, kein Wunder: Die Außentemperatur änderte sich
seit 6 Stunden nicht mehr.
Außensensor abgeklemmt: Temperatur fiel auf 0°C (so wie es sein soll).
Sensor wieder angeklemmt: 21,1°C. Das passt schon besser. Am nächsten
morgen: 21,1°C. Der I2C Bus funktioniert, nur der LM92 misst nichts
mehr.
Anscheinend verstellt sich bei Übertragunsgfehlern das Control word und
aktiviert so den Shutdown.
Seitdem schreibe ich alle paar Sekunden das Control word in den LM92
und jetzt läuft das ganze (hoffentlich.)

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mal den Weg gegangen, weil die Entferung zum Sensor nicht
bekannt un dsomit relativ groß sein konnte, die Signale zu symmetrieren
(RS422-Transceiver).
Das erfordert zwar ein Leitungspaar mehr, ist dafür aber störsicherer.
Die bidirektionale Datenleitung habe ich in eine Sende- und eine
Empfangsleitung geteilt. Dazu habe ich einen 74xx125-Baustein
verwendet, der zwischen Masse und hochohmig umgeschaltet wird. Man
könnte vermutlich auch einen Transistor nehmen.
Auf der Master-Seite hat man dann zwei Sender und einen Empfänger, auf
der Slaveseite zwei Empfänger und einen Sender.
Da es sich beim Sensor um einen SHT11 von Sensirion handelt, der ein
nicht ganz I²C-konformes Protokoll benutzt, war ich gezwungen, die
Schnittstelle "händisch" zu realsieren. Deswegen habe ich mir dann
auch die Schaltung mit den Pull-up-Widerständen sparen können und bin
direkt auf die RS422-Transceiver gegangen.
Auf der Sensor-Seite funktioniert die Schaltung einwandfrei, weswegen
ich vermute, dass das genauso mit der richtigen I²C-Schnittstelle
funktionieren müsste.
Wenn man CAN-Transceiver benutzen würde, könnte man IMHO auch mehrere
Sensoren an den "differentiellen I²C-Bus" hängen...

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem einzelnen Transistor kann es natürlich nicht funktionieren,
weil der das Signal ja invertiert.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"In verschiedensten AppNotes von Philips wurde I2C mit einigen 10m
problemlos bei 100kHz betrieben. Wieso habe ich also bereits bei 30kHz
und 3m Kabel solche Probleme ?"

Ist vielleicht plötzlich ein starker Störer in deiner unmittelbaren
Nähe  hinzu gekommen?

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kämpfe auch mit i2c über lange Wege (ca. 5m). Hat bei mir auch schon 
funktioniert und ging dann plötzlich nicht mehr...

Weiter oben steht
"Ist die Versorgungsspannung (an allen Enden gemessen) in Ordnung?
-Ist die Versorgungsspannung (an allen Enden) gepuffert und
entkoppelt?"

Was ist damit gemeint ?
Puffern => Kondensator (z.B. 100 nF Keramik) zwischen GND und 
Versorgungsspannung bei jedem Knoten ?

Entkoppeln ? Wie was wozu ?

Ich kann bei mir am Oszi sehen, dass die Versorungsspannung einbricht 
sobald Daten übertragen werden. Das war aber schon immer so und hat 
zumindest früher nicht gestört....

Als Kabel verwende ich ein geschirmtes Kabel, 4 mal 0.14 mm2 Litzen. die 
Schirmung ist nicht an Masse oder sonst was. Hilft es die Schirmung an 
Masse zu legen (bzw. ich vermute es stört eher) ?!?

Alle ca. 1.2 m hängt ein I2C Temp.sensor MCP9801 (4 in Summe), Master 
ist ein PIC 18F2680.

Danke für Hilfe im Voraus !

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine komplette Wohnung habe ich verkabelt, es hängen ca. 20 
Sensormodule dran (Raumtemperatur, Heizkörper, DCF, Wetterstation usw.)

Natürlich kommt es zu Störungen auf dem BUS, z.B. wenn meine bessere 
Hälfte mit dem Staubsauger herumwirbelt und ihn ein- und ausschaltet.

Die Sensormodule erkennen eine Störung (z.B. der Bus ist längere Zeit 
belegt und schalten sich kurzzeitig ab)

Sollte das einzelne Abschalten der Sensoren auch nicht helfen, dann wird 
kurzzeitig die komplette Betriebsspannung abgeschaltet (aber erst nach 
einigen Minuten).

Bernhard

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

bei mir sind es keine temporären Störungen sondern eher permanente.

2 Kabel (ca. 4-5m, überall 4 i2c MCP9801 dran) funktionieren, nun habe 
ich 2 Kabel fast exakt gleich aufgebaut (NUR der Abstand der Sensoren 
ist ein wenig unterschiedlich) und mit diesen Kabeln geht´s nicht...

Auf den anderen 2 Kabeln schaffe ich 100kHz ?!? Wie kann das sein ?

Hie und da meldet sich einer der Sensoren und dann ist wieder ewig lange 
nichts... Die Sensoren habe ich vorher getestet, funktionieren alle mit 
kurzem Kabel, nur beim "Zusammenschalten" nicht mehr....

Dass i2c nicht für lange Distanzen geeignet ist, war mir klar.
Ich dachte das Kapazitätsproblem kann ich einfach durch Drosseln der 
Bitrate lösen - wobei 100kHz eh viel mehr sind als ich brauche.

Verwendest du spezielle Kabel, Bustreiber oder Abschlusswiderstände etc. 
?

Danke !

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Verwendest du spezielle Kabel, Bustreiber oder Abschlusswiderstände etc.

Die Abschlusswiederstände sind jeweils ca. 1k,

als Kabel ist teilweise nur einfachster Klingeldraht verwendet worden, 
ohne Schirmung.

(Zu Versuchszwecken benötige ich einen von außen stark gestörten Bus)

Allerdings habe ich den Takt sehr stark reduziert, auf ca. 10 KHz, bei 
100Khz gab es unangenehme Übertragungs-Probleme.

>ich kämpfe auch mit i2c über lange Wege (ca. 5m). Hat bei mir auch schon
>funktioniert und ging dann plötzlich nicht mehr...

Sieht das Fehlerbild so aus, dass ein Slave die SDA-Leitung auf LOW 
zieht?

Ist es immer der gleiche Slave?

Mit einfachen LED's kann man das sehr schön sichtbar machen.


>Ich kann bei mir am Oszi sehen, dass die Versorungsspannung einbricht
>sobald Daten übertragen werden. Das war aber schon immer so und hat
>zumindest früher nicht gestört....

Die Versorgungsspannung bricht zusammen? Wie stark bricht sie zusammen?

Wenige µV oder merhere Volt?


Bernhard

Autor: Pavol (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir ziemlich sicher, dass das Problem durch Leitungsreflexionen 
verursacht wird. Ob 3m Kabel viel sind oder nicht, hängt vorallem von 
der Flankensteilheit des Signales ab. Bei I2C wird wahrscheinlich die 
fallende Flanke vom SCL Signal zu kurz sein, wass dann zu Reflexionen 
führen kann. Egal, wie hoch deine Taktrate ist, die Flanke wird immer zu 
steil sein, deswegen ist das Problem unabhängig von der Taktrate. ÜBer 
die Pull-ups kann keine Anpassung erreichen, da die Impedanz der Leitung 
im Bereich 50 bis 150 Ohm liegt und ein Pull-up im KOhm Bereich da 
nichts bringt. Lösung: Fallende Flanke langsamer machen, z.B. mit einem 
C am Master, aber nicht zu viel, weil nur 400pF auf dem Bus erlaubt 
sind. Oder den Bus anpassen, damit die Reflexionen unterdrückt werden.

Autor: Klaus Ra. (klara)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Pavol,
mit Reflektionen kann man die Probleme nicht komplett erklären.
Ich selber habe nachvollziehbare Probleme mit dem DS1631 und ähnlichen 
Sensoren (TMP102, ...) gehabt.

Mein Master ist ein MSP430. Hier hat TI eine sehr gute Arbeit geleistet. 
Das Timing des I2C-Protokolls ist hervorragend. Ich setze noch einen 
P82B96 als Buffer und Levelshifter ein. Jeder I2C-Slave ist über 330 Ohm 
Widerstände angeschlossen. Also alles nach dem Lehrbuch, vom Feinsten.

Ein I2C-Bus, 10m 8adriges KAT5 und dann 6 DS1631 sternförmig 2-3 m, 
laufen seit über 2 Jahren auf Anhieb ohne Probleme.

Ich hatte jetzt einen zweiten I2C-Bus in Arbeit und beim Testen nur ca. 
2m Zuleitung. Es gab schon bei zwei Sensoren Probleme. Durch Debuggen 
der MSP430 - I2C-Funktionen stellte ich fest, dass direkt beim Init der 
erste Ack nicht kam. Der Check mit dem Oszi zeigte nichts, saubere 
Rechtecke bis hoch zu 100 KHz Takt. Nach einigen Tagen erfolgloser 
Bemühungen habe ich dann die Zuleitung auf 20m verlängert (8 adriges 
Telefonflachkabel, Litze). Und siehe da, die Probleme verschwanden.

Ich habe es noch nicht weiter getestet. Aber demnach müsste man 
masterseitig mit ca. 3,6 Ohm in serie und vielleicht 100pF die Zuleitung 
nachbilden können.

Kurrios ist, ein PCF8574 arbeitet einwandfrei, selbst wenn die DS1631 
versagen.

Mich würde es interessieren ob jemand ähnliche Erfahrungen gemacht hat.

Gruss Klaus.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.