mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Schmittchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schmittchen,

Vielen vielen Dank für deine Hilfe !


Gruß
Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo crazy horse,

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


Gruß
Matthias

Autor: Reini (Gast)
Datum:

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

Autor: mikki merten (Gast)
Datum:
Angehängte Dateien:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.