mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Bus


Autor: Michael Lehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Lehr (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Lehr (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Michael Lehr (Gast)
Datum:
Angehängte Dateien:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Lehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Lehr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ! ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.