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
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
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.
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.
Ä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).
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.
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...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.