www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Adressierung 24C08 mit Fleury i2c-lib


Autor: Richard B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Leute,

ich beschreibe grad ein 24C08 EEPROM über die i2c schnittstelle meines 
mega8 - dazu habe ich mir die i2c library von Peter Fleury 
runtergeladen.
Leider ist dort alles auf ein 24C02 EEprom ausgelegt. Ich kann deshalb 
mein 8kBit EEprom leider nur bis zur Adresspage 0xFF beschreiben. (Bis 
dorthin funktioniert jedoch alles wunderbar)

die Funktion lässt leider nicht die Übergabe einer höherwertigen Adresse 
zu:
unsigned char i2c_write( unsigned char data )

Ist von euch einer vielleicht schon vor dem selben Problem gestanden 
oder kennt einen Workaround?

mfg
Richy

Autor: Richard B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

hab mittlerweile im Forum etwas gefunden, das in die richtige Richtung 
zur Lösung meines Problems führen könnte.
Unter Beitrag "AVR; i2c Problem, avrlib von peter fleury" hat Jörg X. ein paar 
Zeilen Beispielcode geschrieben, in dem es u.a. heisst:
....
/* Hier musst du dem EEPROM _wahrscheinlich_
   eine Speicheradresse schicken, damit das weiß wohin mit den bytes.
   schau aber lieber nach, in welcher reihenfolge */

unsigned int eineadresse 0;
i2c_write((unsigned char)(eineadresse>>8));
i2c_write((unsigned char)eineadresse);

// daten:
i2c_write(0x05); 
....

So hundertprozentig versteh ich nicht was er da macht, aber es schaut so 
aus, als ob er die Adresse in zwei Hälften aufteilt und damit dann mehr 
als nur die ersten 256 (0xFF) Speicherstellen ansprechen kann. Lieg ich 
da richtig ?

gruß
Richy

Autor: möp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey,

ich hab einen treiber für das M24C04 (4 kBit) und M24C64 (64 kBit) 
Eeprom geschrieben.

Die Adressierung ist nicht schwer (wenn man es mal verstanden hat).

Wenn man den Device Code auf den IIC Bus schiebt gibt es die Bits E2 E1 
E0... Bei der 4 Kbit Variante wird das Bit E0 als "9" Adressbit 
verwendet...

so, dass man statt nur 256, dann 512 Bytes adressieren kann.
Bei größerem Speicher verhält es sich dazu analog.

Bei 64 Kbit - 8 KByte, werden die Bits E2,E1,E0 nicht angetastet.
Hier muss man statt einem Adress-Byte immer 2 Adress-Byte 
rüberschrieben.

Ich erwähne, dass nur deshalb, denn vielleicht willst du mal deinen 
Treiber erweitern (auf 64 Kbit) und dann bist du dankbar, wenn du dir da 
den Weg nicht schon vermauert hast.

Gruß

Autor: Elbegucker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
die EEPROM's sind intern anders organisiert. Das 24c02 benötigt 8-Bit 
zur Adressierung.

AT24C02, 2K SERIAL EEPROM: Internally organized with 32 pages of 8 bytes 
each, the 2K requires an 8-bit data word address for random word 
addressing.  2K(256x8)=32x8x8

Peter Fleury übergibt diese 8-Bit mit dem ersten i2c_write -Befehl. Hier
i2c_write(0x00); Es wird also die Speicherstelle 0x00 ausgewählt. Mit 
den nächsten Befehlen werden dann Buchstaben aufs EEPROM geschrieben.

        i2c_start_wait(Dev24C02+I2C_WRITE);
        i2c_write(0x00);                  // write start address = 0
        i2c_write(0x70);                  // write data to address 0
        i2c_write(0x71);                  //    "    "   "    "    1
        i2c_write(0x72);                  //    "    "   "    "    2
        i2c_write(0x74);                  //    "    "   "    "    3
        i2c_stop();



Die Auswahl der Speicherstelle bei 24c08 hingegen geschieht über 10 Bit.

AT24C08, 8K SERIAL EEPROM: Internally organized with 64 pages of 16 
bytes each, the 8K requires a 10-bit data word address for random word 
addressing. 4K(512x8)=64x16x8

Dabei sind zwei Bits in der Device Adresse. Hier P1 und P0
1010 A2 P1 P0 R/W

Du übergibst somit mit der Device-Adresse schon ein Teil und mit 
i2c_write(0x00) den Rest der Speicheradresse.


Aufpassen musst du auch beim Page-write Modus, du kannst nur 16 Byte 
übertragen. Danach musst du eine Pause machen, damit die Daten aufs 
EEPROM geschrieben werden. Weiterhin musst du dann eine neue 
Speicheradresse übergeben. Das EEPROM wird nicht automatisch von vorne 
bis ganz nach hinten überschrieben.
Es gibt sozusagen 64 Schubladen mit 16 Fächern. Ist ein Fach voll wird 
das nächste Fach der selben Schublade vollgemacht. Sind dann allerdings 
alle Fächer einer Schublade voll, wird wieder das erste Fach der selben 
Schublade vollgemacht. Es werden also Daten überschrieben.
Darauf musst du achten!!!
Die 64 Schubladen werden über die Speicheradresse ausgewählt.
Beim Lesen ist das anders, da wird tatsächlich von vorne bis ganz hinten 
gelesen.

Hoffe das hilft dir

Autor: Richard B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke vielmals,

das passt schon mal recht gut - schätze aber ich werd mich auch mal nach 
anderen Bibliotheken zum EEPROM beschreiben umschauen.

danke nochmal und gruß
Richy

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.