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
Engineer schrieb: > Pullups sind 4k7 ohm gewählt. > > Fehler verschwindet , wenn 2k pullups verwendet werden. Nimm 2.2K Pullups, oder eine langsamere Datenrate.
Engineer schrieb: > Falls Infos fehlen , teile ich diese gerne noch mit. Die I²C-Signale auf einem Oszilloskop.
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
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
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.
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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.