Forum: Mikrocontroller und Digitale Elektronik I2C EEPROM: Auslesen liefert nie logische Null


von Talisca (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe die Aufgabe bekommen ein Programm zu schreiben, welches Daten 
in einem I2C EEPROM (M24256) speichert und auch wieder auslesen kann. Zu 
erwähnen wäre evtl., dass ich in der Richtung noch nie etwas gemacht 
habe.
Nun stehe ich vor dem Problem, dass ich geschriebene Werte nur am Oszi 
wieder auslesen kann. Die zum Master gesendeten Bits werden bei einem 
Pulldown nie genau auf logisch 0 gezogen. So gibt mir mein Programm 
immer 255 aus.
Das ganze sieht dann wie im Anhang aus (auslesen vom dez. Wert 17 mit 
anschließendem NOACK und Stop Condition).
Nun stellt sich mir die Frage: Warum?

Kann dies am Pulldown/-up Widerstand liegen (zu klein)?
Oder gibt es evtl. noch andere Fehlerquellen?
Bin am verzweifeln...

Gruß

Talisca

von Klaus (Gast)


Lesenswert?

Talisca schrieb:
> Die zum Master gesendeten Bits werden bei einem
> Pulldown nie genau auf logisch 0 gezogen.

Was meinst du mit "logisch 0" und was mit "genau"? Digitalsignale gelten 
im allgemeinen als Low oder logisch 0, wenn sie unterhalb einer gewissen 
Schwelle sind. Bei TTL Pegeln ist das ca. 0,8V, bei CMOS Pegeln typisch 
1/3 Vcc.

MfG Klaus

von Lattice User (Gast)


Lesenswert?

Wäre besser, wenn die beiden Traces nicht überlappen. So sieht man nur 
sehr schwer was du meinst.

Da liegt vermutlich ein Fehler in der Beschaltung, sieht aus als ob 
zwischen dem Pullup auf Vcc und dem Datenpin des EEProms noch ein zu 
grosser Widerstand in Serie ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Talisca schrieb:
> Kann dies am Pulldown/-up Widerstand liegen (zu klein)?
I2C kennt nur Pullup-Widerstände...
Wie sieht die Beschaltung zwischen uC und EEPROM aus?

> Nun stehe ich vor dem Problem, dass ich geschriebene Werte nur am Oszi
> wieder auslesen kann.
Was bedeutet das: "nur am Oszi"?

> ich habe die Aufgabe bekommen ein Programm zu schreiben, welches Daten
> in einem I2C EEPROM (M24256) speichert und auch wieder auslesen kann.
Und wie sieht dieses Programm aus?

Was sieht man eigentlich auf dem Oszi? Was ist gelb, was blau?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Talisca schrieb:
> Die zum Master gesendeten Bits werden bei einem
> Pulldown nie genau auf logisch 0 gezogen.

Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset 
anzeigen lässt? Das ist eine Einstellungssache Deines Oszilloskopes; wie 
sieht das Bild aus, wenn Du beide Eingänge auf Masse legst? Sind dann 
die gelbe und blaue Linie auch etwa um ein Kästchen verschoben?

von Lattice User (Gast)


Angehängte Dateien:

Lesenswert?

Lothar Miller schrieb:
> Was bedeutet das: "nur am Oszi"?

Rufus Τ. Firefly schrieb:
> Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset
> anzeigen lässt?

Schaut euch den angehängten Ausschnitt an.

Lattice User schrieb:
> Da liegt vermutlich ein Fehler in der Beschaltung,

Könnte auch sein, dass die I2C Pins am µC falsch konfiguriert sind und 
die Datenleitung vom µC aktiv auf high gezogen wird.

von Lattice User (Gast)


Lesenswert?

Noch ein Nachtrag.


Lattice User schrieb:
> Könnte auch sein, dass die I2C Pins am µC falsch konfiguriert sind und
> die Datenleitung vom µC aktiv auf high gezogen wird.

darauf deuten auch die relativ steilen Low nach High Flanken.

von holger (Gast)


Lesenswert?

>Könnte auch sein, dass die I2C Pins am µC falsch konfiguriert sind und
>die Datenleitung vom µC aktiv auf high gezogen wird.

Das sieht wirklich so aus. Zwei Ausgänge prallen
aufeinander oder der Pullup ist viel zu klein.
Wenn das ein AVR ist dann den SDA nicht auf Ausgang schalten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Schaut euch den angehängten Ausschnitt an.

Auf dem sieht man nicht, wie das Bild aussieht, wenn beide Signale auf 
Masse liegen.

Aussehen tut Dein Bild nämlich so, als ob da ein Anzeigeoffset ist, 
d.h., daß der Bezugspunkt beider Signalzüge nicht der gleiche ist.

von Lattice User (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Aussehen tut Dein Bild nämlich so, als ob da ein Anzeigeoffset ist,
> d.h., daß der Bezugspunkt beider Signalzüge nicht der gleiche ist.

Guck nochmal hin.
Wo ist der blaue Pegel am linken Rand, und wo ist er am Rechten.

von Klaus2m5 (Gast)


Lesenswert?

Wohl vergessen, SDA während des Lesens auf Input zu setzen? SCL sieht 
übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis von 
1 zu 1 ergeben.

von Talisca (Gast)


Angehängte Dateien:

Lesenswert?

Meine Güte, wie schnell das hier geht.

Klaus schrieb:
> Was meinst du mit "logisch 0" und was mit "genau"? Digitalsignale gelten
> im allgemeinen als Low oder logisch 0, wenn sie unterhalb einer gewissen
> Schwelle sind. Bei TTL Pegeln ist das ca. 0,8V, bei CMOS Pegeln typisch
> 1/3 Vcc.
>
> MfG Klaus

Da liegt mein Problem. Wie der Grafik entnommen werden kann, wird auf 
ca. die Hälfte "runtergezogen", was aber noch als 1 interpretiert wird. 
Wäre halt doch irgendwie praktisch, wenn z. B. ein ACK als 0 gewertet 
wird und nicht als 1.

Lothar Miller schrieb:
> Wie sieht die Beschaltung zwischen uC und EEPROM aus?

Der genaue Schaltplan vom Aufbau liegt mir leider nicht vor.

> Was bedeutet das: "nur am Oszi"?

Dass jedes Bit, welches ich lese, stets als 1 interpretiert wird, so 
lange vor dem letzten ACK als lsb eine 1 gesendet wurde. Lese/Schreibe 
ich bsp. 0x05, so wird der folgende ACK nur auf diese halbe Flanke 
gezogen. Bei bsp. 0x04 bleibt die SDA auf 0.

> Und wie sieht dieses Programm aus?

Dieses hab ich leider nicht parat. Befindet sich bei meiner 
Praktikumsstelle.
Evtl. noch erwähnenswert: Es wurde in LabVIEW zusammengeklickt.

> Was sieht man eigentlich auf dem Oszi? Was ist gelb, was blau?

Wie konnte ich das nur vergessen.
Blau = SDA
Gelb = SCL

Rufus Τ. Firefly schrieb:
> Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset
> anzeigen lässt? Das ist eine Einstellungssache Deines Oszilloskopes; wie
> sieht das Bild aus, wenn Du beide Eingänge auf Masse legst? Sind dann
> die gelbe und blaue Linie auch etwa um ein Kästchen verschoben?

Das war so beabsichtigt. Hat mir zumindest die Auswertung vereinfacht.

Anbei hätte ich noch eine Grafik, welche einen Schreibvorgang mit dem 
Wert 0xAB zeigt. Hab den Teil vom ACK mal markiert. Ist eigentlich schön 
zu sehen, wie die SDA nach der achten Clock Periode nach unten ziehen 
will bzw. zieht. Aber eben nicht sehr weit kommt.

Werde morgen gleich mal schauen, welches Bild sich ergibt, wenn ich die 
Eingänge auf Masse lege.

Vielen Dank aber schonmal für eure Antworten :-)

von holger (Gast)


Lesenswert?

>SCL sieht übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis 
>von 1 zu 1 ergeben.

Jupp, das sieht nach Software I2C aus.
Da lässt man den SDA Portpin im Portregister immer auf 0
und schaltet zum erzeugen von High und Low
Pegel mit dem DDR Register um, nicht mit PORT.

von Talisca (Gast)


Lesenswert?

Klaus2m5 schrieb:
> Wohl vergessen, SDA während des Lesens auf Input zu setzen? SCL sieht
> übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis von
> 1 zu 1 ergeben.

War froh, dass das Teil heute wenigstens endlich mal seinen Zweck 
erfüllen konnte :D
Werde die Pegel noch genauer anpassen, nur bei jedem kompilieren 7 
Minuten Wartezeit geht dann doch schon auf die Nerven.

von Spess53 (Gast)


Lesenswert?

Hi

>War froh, dass das Teil heute wenigstens endlich mal seinen Zweck
>erfüllen konnte :D
>Werde die Pegel noch genauer anpassen, nur bei jedem kompilieren 7
>Minuten Wartezeit geht dann doch schon auf die Nerven.

Um welchen Controller geht es überhaupt? Und ist es Hard- oder 
Sofware-I2C?

MfG Spess

von Klaus (Gast)


Lesenswert?

Klaus2m5 schrieb:
> SCL sieht
> übrigens auch alles andere als ideal aus, sollte ein Tastverhältnis von
> 1 zu 1 ergeben.

Warum? Wäre nur was fürs Auge. Das Verhältnis ist unerheblich, solange 
jede der beiden Zeiten nicht kleiner als die halbe Bitzeit ist. Beim 
letzten Bit, wenn der Slave die Clock verlängert, passt das mit 1 zu 1 
sowieso nicht.

MfG Klaus

von Klaus2m5 (Gast)


Lesenswert?

Klaus schrieb:
> Das Verhältnis ist unerheblich, solange
> jede der beiden Zeiten nicht kleiner als die halbe Bitzeit ist.

Stimmt - aber wir sind uns hoffentlich einig, dass man die maximale 
Übertragungsrate nur erreichen kann, wenn beide Hälften der Clock die 
halbe Bitzeit haben.

Wenn ich mit einem EEPROM nur mit Morsegeschwindigkeit kommunizieren 
will, ist es wirklich egal.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Guck nochmal hin.
> Wo ist der blaue Pegel am linken Rand, und wo ist er am Rechten.

Und?

Wo ist das Bezugspotential?

Also, nochmal: Lege beide Eingänge Deines Oszilloskops auf Masse.

Wo sind dann die gerade durchgehenden Linien?

Ich tippe darauf, daß die blaue gut ein Kästchen oberhalb der gelben 
sein wird.

von Tim S. (maxxie)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Ich tippe darauf, daß die blaue gut ein Kästchen oberhalb der gelben
> sein wird.

Das hat er ja schon gesagt/erklärt wie sich die beiden zueinander 
verhalten (bzw wie sie sich nicht zueinander verhalten)

Unabhängig jedoch von der Referenz sind 3 stabile Pegel bei I2C meines 
Wissens nicht vorgesehen.

von Dietrich L. (dietrichl)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wo ist das Bezugspotential?

Schau doch mal auf die beiden Zeiger "1" und "2" an der linken Seite - 
dass sind die Nullpunkte.

Gruß Dietrich

von Lattice User (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und?
>
> Wo ist das Bezugspotential?
>
> Also, nochmal: Lege beide Eingänge Deines Oszilloskops auf Masse.

Mal zur Klarstellung, es ist nicht mein Scope und ich bin auch nicht der 
TE, habe nur versucht ein paar Missverständnisse aufzuklären, wohl 
umsonst.

Allerdings ist das ursprüngliche Bild des TE etwas ungünstigt, da es das 
Auge irreführt. Auch mich am Anfang.

Dietrich L. schrieb:
> Schau doch mal auf die beiden Zeiger "1" und "2" an der linken Seite -
> dass sind die Nullpunkte.

Exactly.

von Klaus (Gast)


Lesenswert?

Klaus2m5 schrieb:
> Wenn ich mit einem EEPROM nur mit Morsegeschwindigkeit kommunizieren
> will, ist es wirklich egal.

Auch Morsegeschwindigkeit ist schneller als geht garnicht.

Und in der Realität kommt es darauf nicht an, das Clock-Stretching beim 
ACK, die Verzögerungen zwischen den Bytes und geschicktes oder eher 
ungeschicktes Abwarten nach einem Write machen mehr aus. Nicht zu 
vergessen die ganzen delay_ms(), die man in den so vorgezeigten 
Codestücken so sieht (wenn ein Cast nicht hilft, dann vielleicht ein 
Delay?) ...

MfG Klaus

von Laie (Gast)


Lesenswert?

Lothar Miller schrieb:
> Was sieht man eigentlich auf dem Oszi? Was ist gelb, was blau?

Rufus Τ. Firefly schrieb:
> Könnte es sein, daß Du die beiden Signale mit unterschiedlichem Offset
> anzeigen lässt?

Kinners, so schwer ist das doch nicht. ;-)

Wer schon mal mit I2C gearbeitet hat, sieht sofort, dass gelb nur SCL 
sein kann und folglich SDA in cyan dargestellt ist. Der Nullpegel ist, 
wie bei DSOs üblich, jeweils durch ein kleines Symbol am linken Rand 
markiert. Natürlich ist da ein Offset drauf.

Und wer sich dann auch noch das Signal im Ausgangspost etwas genauer 
ansieht, kann auch leicht feststellen, dass beim SCL zwei Pegel 
auftreten, beim SDA dagegen drei. Der mittlere SDA Pegel liegt auf 
gleicher Höhe mit dem H-Pegel von SCL (innerhalb des Bytes) und gehört 
da definitiv nicht hin.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das mag wohl sein, aber zunächst mal: Wer misst, misst Mist. Und wer auf 
erstes Nachfragen nicht klar erkennen lässt, daß er tatsächlich mit 
seinem Oszilloskop umzugehen weiß, der muss einfach mit weiteren 
Nachfragen leben.

So, jetzt sollte zumindest dieser Teil der Übung geklärt sein.

Jetzt wird die beteiligte Hardware interessant; welcher µC wird hier 
genutzt und was genau ist wie mit dessen I2C-Bus verbunden?

Wie groß bzw. wie klein sind die Pullup-Widerstände?

von Georg G. (df2au)


Lesenswert?

Diverse Leute haben es weiter oben schon geschrieben: Da arbeiten zwei 
Ausgänge gegeneinander. Jedes mal, wenn der Master lesen soll, geht der 
Pegel nicht auf Null. Also wird der SDA des Master nicht auf Eingang 
geschaltet.

von Peter D. (peda)


Lesenswert?

Talisca schrieb:
> nur bei jedem kompilieren 7
> Minuten Wartezeit geht dann doch schon auf die Nerven.

Was isn das für ein komisches System (welches Target, Compiler, 
Programmer, OS).
Ich würde 7s für angemessen erachten.

Ich sehe das auch so, der Slave kämpft gegen einen falsch 
implementierten SW-Master.


Peter

von Bronco (Gast)


Lesenswert?

@Talisca
Der I2C-Bus arbeitet mit Open-Collector-Ausgängen!
Der High-Pegel ist rezessiv (schwach), d.h. er wird dadurch erzeugt, 
daß alle Ausgänge die Leitung "in der Luft hängen" lassen und dann der 
Pullup die Leitung auf High-Pegel zieht.
Der Low-Pegel ist dominant (stark), d.h. er wird erzeugt, indem 
(mindestens) ein Ausgang die Leitung aktiv per Endstufe auf Low-Pegel 
zieht (und dabei den Pullup überbietet).

Deine Osci-Bilder sagen ziemlich eindeutig, daß Du anstatt mit einem 
Open-Collector-Ausgang mit Push-Pull-Ausgang arbeitest.
D.h. in dem Fall, wo Du diesen halben Pegel hast, zieht legt der Master 
einen starken High-Pegel an (was beim I2C verboten ist!) und der Slave 
legt einen starken Low-Pegel an, und das Resultat ist Murks.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Laie schrieb:
> Und wer sich dann auch noch das Signal im Ausgangspost etwas genauer
> ansieht, kann auch leicht feststellen, dass beim SCL zwei Pegel
> auftreten, beim SDA dagegen drei.
Eine klassische Buskollision: der eine zieht nach GND, der andere nach 
VCC. Der VCC-Zieher ist ein wenig stärker...

Beim I2C darf aber gar keiner aktiv nach Vcc ziehen, das macht ein 
Pullup.

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.