Forum: Mikrocontroller und Digitale Elektronik I²C - EEPROM's (24C04 ...)


von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe Probleme mit I²C-EEPROM's vom Typ 24C04 (der Firma "ST").

Es funktioniert alles, bis auf den "Page Write" von mehr als 8 Byte.

Im Datenblatt (in Anhang) steht, daß das EEPROM eine "Page" von 16 Byte 
schreiben kann.


Hat von euch schon mal jemand ähnliche Probleme gehabt ?


Gruß
Matthias

von Schmittchen (Gast)


Lesenswert?

Die "Page" beginnt nicht irgendwo im Speicher, sondern nur an Adressen, 
die ganzzahlige Vielfache von 16 (oder 0x10) sind.
Daran mußt du dich halten. Z.B. Wenn du 10 Bytes am Stück ab 0x09 
beginnst zu schreiben, dann sieht dein Speicher danach nicht so (wie 
erwartet) aus:
0x00: xx xx xx xx  xx xx xx xx  xx 00 01 02  03 04 05 06
0x10: 07 08 09 xx  xx xx xx xx  xx xx xx xx  xx xx xx xx

sondern so:
0x00: 07 08 09 xx  xx xx xx xx  xx 00 01 02  03 04 05 06
0x10: xx xx xx xx  xx xx xx xx  xx xx xx xx  xx xx xx xx

Um oberes Ergebnis zu erhalten, zuerst ab Adresse 0x09 beginnend, bis 
0x0F, und ein zweites Mal ab 0x10 beginnend bis 0x12, schreiben.

Was schreib ich hier eigentlich alles? Steht doch im (von dir 
angehängten) Datenblatt S.6. ;)

Schmittchen.

von Matthias (Gast)


Lesenswert?

Hallo Schmittchen,

Vielen vielen Dank für deine Hilfe !


Gruß
Matthias

von Matthias (Gast)


Lesenswert?

Hallo Schmittchen,

nachdem ich die Adresse welche ich zum schreiben benutzte kotrolliert 
habe, wurde ich stutzig: ich habe immer Adressen verwendet die durch 16 
teilbar sind !

Ich habe mir nun Funktionen geschrieben, die folgendes erledigen:

- das EEPROM mit 0xFF füllen
- das EEPROM ins SRAM kopieren

Die Funktionen benutzen nur Byte lesen/schreiben und kein Page 
read/write ...


Mit diesen Funktionen ist die Fehlersuche etwas leichter ...


hier nun einige Speicherauszüge (zum schreiben verwende ich immer den 
String "0123456789ABCDEF")

8 Byte schreiben auf Adr. 0x20: (alles ok)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 30 31 32 33 34 35 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

9 Byte schreiben auf Adr. 0x20: (1. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 31 32 33 34 35 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

10 Byte schreiben auf Adr. 0x20: (1. & 2. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 32 33 34 35 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

11 Byte schreiben auf Adr. 0x20: (1. - 3. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 73 33 34 35 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

12 Byte schreiben auf Adr. 0x20: (1. - 4. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 73 73 34 35 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

13 Byte schreiben auf Adr. 0x20: (1. - 5. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 73 73 77 35 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

14 Byte schreiben auf Adr. 0x20: (1. - 6. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 73 73 77 75 36 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

15 Byte schreiben auf Adr. 0x20: (1. - 7. Byte falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 73 73 77 75 77 37 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

16 Byte schreiben auf Adr. 0x20: (alles falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 38 39 73 73 77 75 77 77 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

8 Byte schreiben auf Adr. 0x23: ("alles ok")
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 35 36 37 30 31 32 33 34 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

16 Byte schreiben auf Adr. 0x23: (alles falsch)
0x10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x20: 75 77 77 38 39 73 73 77 FF FF FF FF FF FF FF FF
0x30: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF


Bei dem letzten Speicherauszug handelt es sich um den von dir 
beschreiben Effekt. Der bei mir aber bei 8 Byte auftritt !


Meiner Meinung nach hat das EEPROM nur eine Page von 8 Byte !



kann diese Ergebnisse irgendjemand reproduzieren ?


Gruß
Matthias

von crazy horse (Gast)


Lesenswert?

An einem ähnlichen Problem bin ich auch schon mal fast verzweifelt, Hast 
du wirklich exakt den EEPROM-Typ, für den du auch das Datenblatt hast? 
Ich hatte damals verschiedene Hersteller-Typen, bei einem gings, beim 
anderen nicht (ST ging, Atmel nicht, wenn ich mich recht erinnere, die 
waren in Bezug auf page-write nicht kompatibel, trotz gleicher 
Bezeichnung) Im Datenblatt der Hersteller war jedoch alles richtig 
beschrieben, einmal 8Byte, einmal 16Byte.

von Matthias (Gast)


Lesenswert?

Hallo crazy horse,

ja, ich habe mehrere 24C04 der Firma "ST" und auch das passende 
Datenblatt dazu ...


Gruß
Matthias

von Reini (Gast)


Lesenswert?

Ich hab da sone Idee,
ist genug Zeit zwischen dem Senden der Bytes ?
Wir nach jedem Byte-Write die Stop-Condition gesendet ?

von mikki merten (Gast)


Angehängte Dateien:

Lesenswert?

Schau dir das Datenblatt im Anhang mal die Funktion von PIN7 genau an. 
Scheinbar gibts bei ST verschiedene Versionen.

von Matthias (Gast)


Lesenswert?

Hallo Reini,

Der "Byte Write" Modus funktioniert.

Das Problem ist der "Page Write" von mehr als 8 Byte.

Im Datenblatt steht, daß das EEPROM eine 16 Byte große Page hat ...


Gruß
Matthias

von mikki merten (Gast)


Lesenswert?

Dazu muss laut Datenblatt PIN 7 auf L (GND) liegen. Ist dieser PIN offen 
oder mit VCC verbunden, wird der Multi Byte Mode mit maximal 8 Byte 
ausgeführt.

von Matthias (Gast)


Lesenswert?

Hallo miki,

Laut deinen Datenblatt (Februar 1999) kann das EEPROM eine Page von max. 
8 Byte schreiben. So wie es bei funktioniert. Ich habe den Pin7 auf 0V.

Laut meinem Datenblatt (July 2002) kann das EEPROM eine Page von max. 16 
Byte schreiben.

In deinem Datenblatt heißt das EEPROM 24C04, in meinem M24C04.

Auf meinem EEPROM steht:

"ST Logo" TAI  F
24C04  1
4A9BK722

Ich glaube dein Datenblatt ist zutreffend.


Vielen Dank euch allen !!!


Gruß
Matthias

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.