Software I2C Problem - kein ACK

Gast #355959
Lesenswert?

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
Gast #355962
Lesenswert?

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.
Gast #355968
Lesenswert?

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
Angehängte Dateien:
Gast #355970
Lesenswert?

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
Gast #355983
Lesenswert?

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 :)

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