Hallo, Ich möchte mit einem PIC18LF4620 Daten in ein EEPROM (ST M24C08W) schreiben und auslesen. Das ganze über einen I2C-Bus. Da ich schon einen Funk-Empfänger am SPI hängen hab, bin ich gezwungen den I2C in Software zu emulieren. Mein Problem ist nun folgendes: Ich lege die Adresse des EEPROMs auf den Bus, aber erhalte im 9. Takt kein ACK (SDA bleibt auf High). Timing stimmt soweit mit dem Datenblatt über ein und da EEPROM wird auch richtig adressiert. Als Pull-up Widerstände benutze ich 10kOhm. Hat jemand noch Ideen woran das Problem liegen könnte? Mit freundlichen Grüßen Marc
1. Schon mal den Takt ganz langsam gestellt ? 2. Oszilloskop zur Hand ? 3. weiteren Baustein zum Tauschen ? Gruß Sven
Hat der Bus vor dem Start der Kommunikation einen definierten Zustand? Evtl. vorm Start mal eine Stop-Condition senden.
1. Takt wurde auch schon langsamer gesetzt - ohne Erfolg. 2. Ja, mit einem Oszilloskop arbeite ich schon die ganze Zeit, um zu schauen, was auf dem Bus passiert. 3. Hab schon 3 EEPROMs durchprobiert, davon waren 2 erst heute gekauft. Immer das gleiche Ergebnis. 4. Ja, vor der Start-Condition liegen SCL und SDA auf High. Eine Stop-Condition vor dem Start einzufügen hilft auch nicht.
Kannst einen Screenshot von dem dem Oszilloskop machen und hier einstellen, damit man mal sieht, wie dein Timing aussieht. Außerdem noch die Ansteuerroutinen und die die Beschaltung der Anschlusspins des EEPROMs und wir hätte allles, was man sich mal dazu ansehen könnte. Mike
>Als Pull-up Widerstände benutze ich 10kOhm
Vielleicht wird die Rise-Time zu lang, versuch mal 2.2k als Pull-Up.
MfG Olaf
Hat der µC eine Hardware I2C Schnittstelle, oder per Software über normale Portpins nachgebildet?
Wie sendest Du denn die Daten, schreibst 0 und 1 aktiv auf den Bus, oder schaltest um zwischen Ein- und Ausgang?
Hi, @Oliver: ich schalte um zwischen Ein- und Ausgang, um den Bus auf HIgh oder Low zu ziehen. @Mike: Einen Screenshot vom Oszi kann ich leider nicht machen, weil ich den Oszi nicht mit dem Rechner verbinden kann. Die Zugriffsmethoden hab ich mal angehängt (sind leider noch nicht mit kommentaren versehen). Einen Shcaltplan kannich heute Abend posten, wenn ich wieder zu Hause bin. Gruß Marc
Diese Informationen sind vielelicht noch nützlich den Programmcode zu verstehen: #define DATA_LOW TRISDbits.TRISD0 = 0; // define macro for data pin output #define DATA_HI TRISDbits.TRISD0 = 1; // define macro for data pin input #define DATA_LAT LATDbits.LATD0 // define macro for data pin latch #define DATA_PIN PORTDbits.RD0 // define macro for data pin #define CLOCK_LOW TRISDbits.TRISD2 = 0; // define macro for clock pin output #define CLOCK_HI TRISDbits.TRISD2 = 1; // define macro for clock pin input #define SCLK_LAT LATDbits.LATD2 // define macro for clock pin latch #define SCLK_PIN PORTDbits.RD2 // define macro for clock pin
Ich hoffe doch, der zweite Pull-Up der Schaltung hat einen Fehler :-)
Der Pull-up für Scl ist nicht angeschlossen, brauchst dich nicht wundern wenns nicht tut.
Welche Zeit liegt zwischen dem Umschalten auf Eingang und überprüfung auf ACK?
Hi, @dernixwois: Ist nur ein Fehler auf der Zeichnung. Auf der Platine ist ein Pull-up mit SCL und einer mit SDA verbunden. @Michi B: ca. 600 ns.
Wie schnell ist eigentlich deine Taktrate für den Bus, welche Geschwindigkeit kann das EEPROM maximal und wie groß ist der Abstand zwischen SDA-High und der positiven Clock Flanke? Der C-code sagt mir leider nicht so viel, warscheinlich weil mir die Feinheiten der PIC programmierung fehlen.
Chip Enable (E0, E1, E2) abhängig von der Größe des Bausteins korrekt angeschlossen?
Hallo, @Mike: Das EEPROM kann maximal mit 400 MHz angesteuert werden. Der Abstnad zwischen SDA High und der SCL Flanke beträgt 160 Mikrosekunde. @Oliver: E0, E1, und E2 sind korrekt angeschlossen und eingestellt. Mit einem ARM läßt sich das EEPROM auch mühelos beschreiben, nur mit dem PIC klappt's nicht. Gruß Marc
Hallo, nachdem ich jetzt so ziemlich alles an der software rumprobiert hab, was nur geht, denke ich das es ein Problem bei der Schlatung sein müsste. es hat den Anschein, als könnte der Slave den Bus beim ACK nicht auf Low ziehen. Woran könnte das liegen? Könnten andere Pull-up Widerstände Abhilfe schaffen? Gruß Marc
Zwischen 4k7 und 10k sollte es auf jeden Fall funktionieren. Wie lang ist denn die Leitungslänge, sind die Signale "sauber"?
Die Signale sind auf dem Oszi sehr sauber. Leitungslänge sind ca. 5-10 cm.
Moin, welche Slaveadresse übergibst du deiner Senderoutine ? Hast du dich vielleicht ein wenig verzählt mit der Adresse ? Die möglichen Adressen des M24c08 liegen ja zwischen 0x50 .. 0x57. Berücksichtigst man aber das R/W-Bit bei der Übergabe verschiebt sich das zu übergebende Datum auf 0xA0 .. 0xAE. Ich frage nur, weil ich genau das Gleiche bei einem sehr erfahrenen Kollegen erlebt habe :)
Hallo, ein Speicherbaustein erfordert schon ein umfangreicheres Bus-Protokoll. Versuch doch es erst einmal mit einem einfachen PCF8574. Wenn Du diesen ordnungsgemäss ansteuern kannst, Wert setzen und Wert lesen, dann liegt es an der Programmierung. Gruss KLaus.
also ich übertrage als Adresse 0xA0. Und das sollte auch stimmen.
Hallo Marc, konntest Du dem EEProm inzwischen ein ACK entlocken?
Nimm doch mal als Adresses 0x00, da sollten sich laut I2C Protokoll jeder Slave melden. Wenn du dann ein ACK bekommst kannst du schon mal einen Fehler bei der Startsequenz aussschließen.
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.