I2C EEPROM: Auslesen liefert nie logische Null

Gast #2883374
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
Angehängte Dateien:
Gast #2883384
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
Gast #2883399
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.
Moderator (Firma: Titel) Persönliche Seite #2883402
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?
Persönliche Seite #2883404
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?
Gast #2883418
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.
Angehängte Dateien:
Gast #2883427
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.
Gast #2883447
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 :-)
Angehängte Dateien:
Gast #2883448
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.
Gast #2883452
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.
Gast #2883457
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
Gast #2883462
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
Gast #2883486
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.
Gast #2883798
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.
Gast #2883865
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
Gast #2883917
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.
Persönliche Seite #2883935
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?
Gast #2884509
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.
Moderator (Firma: Titel) Persönliche Seite #2884534
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren