Forum: Mikrocontroller und Digitale Elektronik 24C16 EEPROM I2C in C-code


von Holger (Gast)


Lesenswert?

Hallo,

ich will Werte auf einem 24C16 von ST speichern und wieder auslesen.
Dazu habe ich den C-code aus dem i2c Ordner von Hi-tech genommen.
EEPROM habe ich so angeschlossen. pin1-pin3: nc
                                  pin4     : Vss
                                  pin5     : SDA
                                  pin6     : SCL
                                  pin7     : Vss
                                  pin8     : Vdd

SCL und SDA sind an PORTC (RC3,RC4) an einem PIC16F877 dran.

Mein Problem: Ich bekomme beim Auslesen immer nur den
              Wert 255 zurück.

Was läuft hier nur falsch???
Vielleicht weiß ja jemand Rat.

MFG
Holger

von Mr. X (Gast)


Lesenswert?

24Cxx verwende ich schon seit vielen Jahren, das Schreiben und Lesen ist 
wirklich einfach.

Tip: Pin 1-3 auf Gnd (Vss) legen, damit die Adresse, auf die der 24Cxx 
antworten soll, klar ist.

Den Hi-Tech Code hab ich nicht, vielleicht hast Du einen Link parat?

oder den Code als Anhang.

von crazy horse (Gast)


Lesenswert?

teilweise haben die EEPROMS einen Hardware-write-protect-Eingang, damit 
kann man Schreibzugriffe auf deas EEPROM unterbinden, muß auf Gnd 
liegen, um schreiben zu können, aber hast du ja gemacht
Ansonsten würde ich mal einen schon programmierten Test-EEPROM 
einsetzen, um zu erfahren, ob das Problem in der Lese- oder 
Schreibroutine liegt.
Beide Leitungen sollten übrigens einen Pullup-Widerstand (3k3) nach +5V 
haben.

@Mr.X: beim 24C16 gibt es keine Adresseingänge.

von thkaiser (Gast)


Lesenswert?

Bei der I²C- Kommunikation meldet der Slave (das EEPROM) dem Master (dem 
uC) mit einem Acknowledge-Bit den Status zurück. Wenn Du das Adressbyte 
sendest, empfängst Du eine "0" oder eine "1" als Acknowledge? Wenns eine 
"1" ist, dann stimmt die Adresse nicht. Bei einer "0" erkennt das EEPROM 
schonmal, daß es gemeint ist. In der Adresse ist das Bit 0 als R/W 
belegt. Hast Du eine "1" gesendet? Falls nicht, ist das EEPROM im 
"Write-Modus", legt den SDA hochohmig und dann ist die $FF kein Wunder.

von Fernando Heitor (Gast)


Lesenswert?

Holger schau mal hier rein:

http://www.microchipc.com/sourcecode/#i2c

MFG
Fernando

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

zunächstmal habe ich den Code hier als Dateianhang.

- Den Write-Protection-Eingang (PIN 7) habe ich auf Masse   gelegt.

- Auch mit einem Pullup-Widerstand von 3k3 funktioniert es 
nicht.(Vorher hatte ich 1k8 dran)

- Ich glaub, ich krieg kein Fehler beim Ack auf die     Adressierung 
zurück. (siehe Dateianhang)

- Ich spreche das EEPROM mit der Adresse 0xA0 an. =>   Schreibmodus.

- @Fernando: bei dem Link wird leider nicht der 24c16   verwendet

MFG
Holger

von Holger (Gast)


Lesenswert?

Kleiner Nachtrag!

Kann es vielleicht an der Portinitialisierung liegen?
(Siehe Anhang)

MFG
Holger

von Jürgen Weber (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich weiß nicht ob' seuch noch interessiert, aber beim seriellen 27c16
muß man unbedingt bestimmte Timings einhalten, sonst wird's nix mit
dem lesen und schreiben! Detaillierte Info's siehe Anhang. Der 27c16
benutzt die Adressleitungen A0-A2 nicht und zumindest A2 sollte auf 0V
gelegt werden. Pin 7 ist ein Write-protect Eingang und er muß ebenfalls
auf 0V liegen, wenns mit dem schreiben klappen soll.

MFG,

Jürgen

von Alex (Gast)


Lesenswert?

Hallo,
wenn immer noch nicht geht maile mir.
Ich habe die Code für I2C (PIC16F876)selbs geschafft.
Und es fuktioniert.

Nachhilfe:
1.)AN735 (DS00735) von Microchip holen dort ist alles gut erklärt.

Tschüß,
Alex

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.