Forum: Mikrocontroller und Digitale Elektronik I2C Bus


von Michael Lehr (Gast)


Lesenswert?

Hallo,

wer kennt sich super mit dem I2C Bus aus?

Folgendes Problem:

Ich versuche mehrere Bytes nacheinander zu lesen.
Dabei passiert folgendes:
Das erste Byte kommt korrekt raus.
Alle folgenden sind Null. Wenn ich die Bytes einzeln auslese
ist alles OK ( nicht null ).

Ich sende nach jedem Byte ACK, sieht auf dem DSO und Logik Analyser
alles korrekt aus.

Ich habe schon mehrere Softwaretreiber ( unter anderem von Atmel )und
Versionen getestet.
Ist immer dasselbe Ergebniss. ??????????????????????

Ach ja ich teste mit AT90S8535 und DS1621 oder AT24C256 oder PCF8573

von Matthias (Gast)


Lesenswert?

Hi

solche Routinen schreibt man selber. Dann weiß man was sie machen und
braucht nicht lange mit dem DSO zu debuggen. So ein I2C-Master ist doch
in einer halben Stunde zusammengeklappert.

Matthias

von Michael Lehr (Gast)


Lesenswert?

Hey,
hab auch meine eigenen Routinen !   Funzt aber trotzdem nicht !!!

von thkais (Gast)


Lesenswert?

Sendet der Master dem Slave beim lesen auch brav ein ACK ?
Die ersten ACK kommen vom Slave, die weiteren muß der Master senden
(beim Lesen). Nur wenn das letzte Byte gelesen wird, muß ein nACK
gesendet werden, da sonst der Master das Stop-Bit nicht auf den Bus
kriegt.

von Michael Lehr (Gast)


Angehängte Dateien:

Lesenswert?

Ack kommt korrekt. Danach sendet der Slave nur noch Nullen obwohl die
Bytes definitiv nicht Null sind ( wenn ich einzeln lese, bekomme ich
die richtigen Werte).  Ich glaube das es ein Timing Problem sein
könnte. Auf dem DSO sieht alles ok aus.

von thkais (Gast)


Lesenswert?

Ähm, ich meinte nicht den ACK, den der Slave nach Erkennen der Adresse
sendet -
Der MASTER muß dem SLAVE nach jedem Byte ein ACK senden. Die Richtung
des ACK ist also umgekehrt, wie zu Beginn der Übertragung (da sendet ja
der Slave dem Master das ACK).

von Michael Lehr (Gast)


Angehängte Dateien:

Lesenswert?

Ähm , das meinte ich auch so. Im Anhang mal ein Bild von meinem ACK.
Sieht OK aus .

von thkais (Gast)


Lesenswert?

Hoffentlich sprechen wir von der gleichen Sache... g
Ich glaube, so kommen wir nicht weiter. Poste doch bitte mal Deinen
Code für den Master, vielleicht sehe ich etwas.
Wenn ichs aber recht überlege, solltest Du bei dem fehlenden ACK aber
eher eine Dauer-"1" lesen.... seltsam. Irgendetwas zieht den Datenbus
auf "0", das darf eigentlich nicht sein.
Schonmal durchgecheckt, ob irgendwo die Datenrichtung des SDA falsch
gesetzt wird? Wie hast Du die Funktion der SDA / SCL-Pins ("open
collector") simuliert? Da kann man sich schnell mal verhaspeln.

von Michael Lehr (Gast)


Lesenswert?

Hast du mal in den Screenshot geschaut ?

Zwischen den Time-Markern ist der Acknolegde des
Master ( logisch Null) korrekt zu sehen.

An der Software kanns also eigentlich nicht liegen.

Wenn ich den Bustakt auf ca. 500 Hz lege, funktioniert es auch
richtig.

Im Moment versuche ich die Größe der PullUps an die Buskapazität
anzupassen, der I2C Bus verlangt eine hohe Flankensteilheit.
Ich denke es liegt an den zu flachen steigenden Flanken.

Mal sehen...

von Oliver (Gast)


Lesenswert?

Hallo Michael,
hast mal nach den Portspezifikationen der Ausgangsports des µC's
geschaut. Diese müssen in der Lage sein einen Strom von, glaube ich 30
mA zu treiben (schau lieber nochmal im I2C Protokoll nach). Kleiner
Tipp, versuche mal 2 Ports des µC's gleichzeitig an den I2C zu hängen
und schalte sie parallel.

Gruß Oliver

von Peter D. (peda)


Lesenswert?

Der I2C-Bus ist nur für max 3mA ausgelegt, also die Pull-Ups nicht
kleiner als 1,8kOhm machen.

Ich habe den I2C schon sehr oft verwendet ohne Probleme sowohl auf dem
8051 als auch auf dem AVR.


Beim AVR muß man jedoch beachten, daß man dort den Open-Drain-Pin
simulieren muß, d.h. niemals den Pin auf 1 setzen !

Der Pin bleibt ständig auf 0 (PORTx = 0).
Will man eine 1 senden, setzt man den Pin als Eingang (DDRx = 0), will
man eine 0 senden, setzt man ihn als Ausgang (DDRx = 1).


Hier mal Beispiele in C / Assembler für den 8051:

http://www.specs.de/users/danni/appl/hard/i2c/index.htm

Da der 8051 aber schon Open-Drain-Ausgänge hat, kann man dort den Pin
direkt setzen.


Peter

von Michael Lehr (Gast)


Lesenswert?

Danke für die Hilfe !!!!!

Funktioniert jetzt einwandfrei.

PullUps bei 2K2 und 100µF um die Bus-Spannung ein wenig zu
unterstützen, das war´s !

Offenbar ist der DS1621 ein bisschen sensibel, wenn die
steigende Flanke nicht steil genug ist.

Nochmals Danke an alle ! ;)

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.