Forum: Mikrocontroller und Digitale Elektronik I2C Probleme beim Lesen


von Engineer (Gast)


Lesenswert?

Hallo ,

ich habe folgendes Problem bei einem I2C Slave Device:

Ich lese ein und dasselbe Byte mehrere hundert mal bei 100 kHz aus.
Meistens ist der Inhalt des gelesenen Bytes richtig, in einem von 10-20 
Fällen (unregelmässiger Wert), kommt aber ein falscher Wert zurück.

Hinzu kommt dass dieser Fehler nicht bei allen Devices vorkommt sondern 
nur bei 30% der Devices. Alle haben denselben Mikrocontroller verbaut, 
einen Freescale MC9S08QG8.

Der Fehler tritt auch nur bei einem bestimmten Master (host) auf , bei 
anderen Mastern tritt der Fehler nie auf.

Pullups sind 4k7 ohm gewählt.

Fehler verschwindet , wenn 2k pullups verwendet werden.

Kommunikation sieht folgendermassen aus:

1) write Byte an Adresse 0x5D ohne stop condition
2) read Byte mit stop condition , erwarteter Wert 0x03 manchmal jedoch 
0x00

Hat jemand eine Idee was das sein könnte?

Falls Infos fehlen , teile ich diese gerne noch mit.

Vielen Dank

von Joe F. (easylife)


Lesenswert?

Engineer schrieb:
> Pullups sind 4k7 ohm gewählt.
>
> Fehler verschwindet , wenn 2k pullups verwendet werden.

Nimm 2.2K Pullups, oder eine langsamere Datenrate.

von Arduinoquäler (Gast)


Lesenswert?

Engineer schrieb:
> Hat jemand eine Idee was das sein könnte?

Schwäche im Schaltungsaufbau.

von Clemens L. (c_l)


Lesenswert?

Engineer schrieb:
> Falls Infos fehlen , teile ich diese gerne noch mit.

Die I²C-Signale auf einem Oszilloskop.

von Joe F. (easylife)


Lesenswert?

Machst du eigentlich irgend ein Fehlerhandling in deiner Firmware?
Bei I2C sind Kommunikationsfehler nie ausgeschlossen, insofern sollte 
man zumindest Fälle detektieren, in denen ein Slave seine Adresse nicht 
ACKed.

Mit diesem Verhalten signalisieren manche Sensoren auch "ganz legal", 
dass sie gerade nicht bereit zur Kommunikation sind.

: Bearbeitet durch User
von Engineer (Gast)


Lesenswert?

Hallo ,

meinst du die Fehlerbehandlung auf Host Seite?

Diese kenne ich nicht, da das System bei einem Kunden installiert ist 
der bisher der einzige ist wo dieses Problem auftritt. Die Module(Slave) 
sind seit Jahren bei anderen Kunden ebenfalls im Einsatz.

Gruss

von kleiner Tipp (Gast)


Lesenswert?

Es gibt I2C Monitorprogramme, die das sehr effektiv debuggen helfen. Es 
muss ein Dauertest gefahren werden, um sowas zu finden und dann das 
jeweilige Oszilloskopbild gespeichert werden.

von TK (Gast)


Lesenswert?

Engineer schrieb:
>Pullups sind 4k7 ohm gewählt.
>Fehler verschwindet , wenn 2k pullups verwendet werden.

Damit ist die Analyse doch schon fertig. Du hast eine zu hohe 
Buskapazität im System. Die kann man auch mit einem Oszi messen, was in 
Deinem Fall SEEEEHR sinnvoll wäre. Damit kann man anschließend den 
"richtigen" PullUp R_p berechnen (bzw. aus dem Diagramm der IIC-Spec 
ablesen) und diesen dann auch verbauen. Aber Vorsicht: R_p hat auch eine 
Abhängigkeit von einem evtl. vorhandenen seriellen Widerstand R_s, von 
der Busspannung und der Übertragungsgeschw. (hier 100kHz)

Ungeachtet davon ist die Auswertung eines ACKs oder eben eines nACKs 
immer notwendig / sinnvoll.

Gruß
TK

von Klaus (Gast)


Lesenswert?

TK schrieb:
> Engineer schrieb:
>>Pullups sind 4k7 ohm gewählt.
>>Fehler verschwindet , wenn 2k pullups verwendet werden.
>
> Damit ist die Analyse doch schon fertig. Du hast eine zu hohe
> Buskapazität im System.

Falsch.

Es gibt Crosstalk zwischen SCL und SDA. Dieser wird kleiner, weil die 
Impedanz der jeweiligen Leitung durch die kleineren Pullups geringer 
wird. Das kann man auf einem Scope sofort sehen. Also erstmal mit 
kleineren Pullups leben, das nächste mal aber besser auf den Aufbau 
achten.

MfG Klaus

von TK (Gast)


Lesenswert?

Tja Klaus,
wer recht hat, sagt Dir gleich das Licht (1,2 oder 3 - Du mußt Dich 
entscheiden...)
Es könnte auch Crosstalk (aber nicht bei 100kHz!) sein. Dazu müßte man 
aber das Layout sehen. Meine Erfahrung mit diesem Bus ist jedoch 
eindeutig die Buskapazität-Problematik.
Und mit einem Oszi-Auszug könnte man das sogar erkennen (Crosstalk oder 
Buskapa). Bis dahin hilft vorerst ein kleinerer R_p.

Gruß
TK

von HildeK (Gast)


Lesenswert?

Bisher wurde in noch keinem Beitrag etwas über die Länge der 
Bus-Leitungen gefragt oder gesagt. Kannst du die nennen?
Die I2C-Bus Spezifikation sieht max. 3mA vor, also einen minimalen 
Pullup von etwa 1.2k bei 3.3V- oder etwa 1.8k bei 5V-Systemen. Damit 
sollte das System bis zu 400pF Buskapazität (zulässiges Maximum) 
funktionieren.
Also: wenn der Stromverbrauch nicht das oberste Kriterium ist, dann 
würde ich nahe an die unteren Werte gehen.

von Engineer (Gast)


Lesenswert?

Hallo ,

die Strecke zwischen Slave und Master beträgt maximal 15-20 cm.
auf dem Slave ist weiterhin ein I2C Repeater verbaut der eine 
Eingangskapazität von 10 pF hat. Erlaubt sind laut Spec (SFF Spec) 14 
pF.

Dieser wurde extra genommen um die Buskapazität so tief wie möglich zu 
halten, da auf dem Slave mehrere I2C Geräte geschaltet sind.(Hinter dem 
Repeater). Die Strecke hinter dem Repeater ist maximal 3-4 cm.

Das Mastersystem kenne ich leider (noch) nicht... habe aber bereits 
einen Termin beim Kunden und werde mir die Sache näher ansehen.

Ich Versuche dort dann mal Oszi Aufnahmen zu machen.

Das Master Design werde ich aber wohl nicht zu Gesicht bekommen, hier 
könnte ja auch Crosstalk auftauchen.

Gruß

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.