Forum: Mikrocontroller und Digitale Elektronik I2C EEprom Speicherverwaltung


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe hier zwei I2C EEproms. Eins 24c256 8x32 und eins mit 8x256. 
Beim 8x32 kann ich wunderbar mit AT24WriteByte(adr,wert); und mit 
AT24ReadByte(adr); (siehe Anhang)auslesen und wieder einlesen. Beim 
8x256 bekomme ich nur kryptische Zeichen, obwohl gleicher Code. Woran 
kann das liegen? Wird der Speicher beim 8x256 anders angesprochen?
Frank

von Pete K. (pete77)


Lesenswert?

Falsche Geräte-Adresse ?

von Frank (Gast)


Lesenswert?

Hallo

Ne, die ist immer gleich. Ich nehme für beide das gleiche Programm. Nur 
das ich das EEpromm tausche. Es hängt also immer nur ein EEprom am 
Atmega32.

von crazy horse (Gast)


Lesenswert?

hm, den Chiptyp hast du nicht verraten...
8x256 heisst 256kByte? Wenn ja, lässt der sich nicht mit 2 Byte 
adressieren.

von Frank (Gast)


Lesenswert?

Hier nochmal die Typen: 24C02 EEPROM DIP8/S Conrad Best.Nr. 160962 und 
ST42568WP (der funzt).

von crazy horse (Gast)


Lesenswert?

also 2kBit.
Der bekommt nur ein Adressbyte gesendet.
also:
start
device-adresse (i.a. 0xA0)
byteadresse

von Frank (Gast)


Lesenswert?

was meinst Du mit Device Adresse 0xA0? Ich habe die Adressbits alle auf 
0 gelegt und spreche das EEprom Softwaremäßig auch mit 0 an. Oder geht 
das beim dem von Conrad nicht?

von crazy horse (Gast)


Lesenswert?

doch, das geht.
0b1010 //highteil der Devivceadresse
xxx    //lowteil der deviceadresse, hat verschiedene Funktionen. 
Teilweise abhängig von der Hardwareverschaltung des Chips 
(Adresseingänge), teilweise als weiteres Adressbit(s) genutzt
x  schreib/lese bit.

Und wenn nun beim 24C02 A0,A1 und A2 auf Masse liegen, brauchst du als 
Device-Adresse 0xA0 bzw 0xA1

Das Problem bei dir: du sendest device-Adresse, high-Adresse, 
low-Adresse.
Der 2402 bekommt aber nur ein Byte Adresse - mehr braucht man ja für 256 
Byte auch nicht.
Du musst also das Programm entsprechend ändern, dass nur ein Byte 
Adresse gesendet wird.

//Random Byte Write
uint8_t AT24WriteByte(uint16_t dataaddress, uint8_t data)
{
  uint8_t deviceaddress = AT24Addr;
  uint8_t SLA_W = deviceaddress + AT24Command;

  AT24Poll(0);

  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  while ((TWCR & 0x80)!= 0x80);
  TWDR = SLA_W;
  TWCR = (1<<TWINT) | (1<<TWEN);
  while ((TWCR & 0x80)!= 0x80);
  if (TWSR != 0x18){
    return 1;
    //Keine Antwort vom EEPROM
  }
  TWDR = ((dataaddress>>8)&0xFF);

//hier nur den lowteil senden
//was soll eigentlich &0xFF?? Bringt gar nichts
//das zweite Adressbyte muss entfallen
//beim Lesen analog verfahren

von Frank (Gast)


Lesenswert?

noch mal zum Verständnis für mich: Wenn ich ein EEprom mit 8x32 = 256b
habe, muss die Adresse ein Byte sein. Und bei einem 8x256 = 2K ein int 
als Adresse?

von crazy horse (Gast)


Lesenswert?

irgendwie haust du Bit und Byte durcheinander.
Die Speicherkapazität wird bei EEPROMs i.a. in kbit angegeben.
2kbit (24C02)=2048/8=256 Byte -> 8bit-Adresse.
Grösser als 256 byte erfordert mehr als eine 8Bit-Adresse. Das kann 
durch verschiedene Verfahren realisiert werden. Entweder werden 2 Byte 
Adresse gesendet (I2C ist immer Byteorientiert) oder es wird ein Teil 
bereits in der Device-Adresse mitgeteilt (sieht man daran, dass das IC 
nicht 3 sondern weniger Hardwareadresseingänge hat.
Äqivalent geht es bei Speichergrössen >64kByte zu. 16 Adressbits reichen 
nicht -> Codierung in der Device-Adresse oder 3-Byte-Adressteil (habe 
ich zwar noch nicht gesehen, aber wer weiss).
Datenblätter lesen!

von Frank (Gast)


Lesenswert?

was mich nur wundert ist, dass der code unverändert wie oben mit 
St4256bwp, funktioniert. Ich schreibe mit  AT24WriteByte(10,55);,die 
Zahl 55 auf die Adresse 10. Beim 24c02 mit 8x256 braucht man demnach 
doch auch nur eine 8Bit Adresse. Also müßte der Code auch hier gehen? 
Oder mache ich immer noch einen Denkfehler?

von crazy horse (Gast)


Lesenswert?

ich geb auf.

von Frank (Gast)


Lesenswert?

Bitte nicht Aufgeben! Wie Du sagst sende ich in meinem Code ja eine low 
und eine high Adresse. Aber wieso geht das dann beim 256er und beim 2kb 
nicht?

von Denny (Gast)


Lesenswert?

Hallo!

Vielleicht hilft dir die Seite weiter:
http://www.roboternetz.de/wissen/index.php/Bascom_und_I2C_EEprom

Ist zwar für Bascom, aber dort steht genau wie das mit dem High und Low 
Byte
zusammen hängt.



Gruß Denny

von crazy horse (Gast)


Lesenswert?

halt dich doch einfach an die Datenblätter.
Warum es bei einem funktioniert, obwohl es nicht korrekt angesteuert 
wird, ist doch irrelevant. Steuere es mit EINEM Adressbyte an, fertig.
Bleibt die Frage - was willst du überhaupt mit einem 32Byte-EEPROM? Das 
gibts doch eh nur noch antiquarisch. Weil du es gerade da hast?

von Frank (Gast)


Lesenswert?

Also ich habe es jetzt mit nur einem Byte als Adresse hinbekommen.
Danke noch mal an Crazy Horse für die Geduld!! Ich habe hier den 8x32 = 
256 Kb und den 24c02. Sind schon ein wenig älter. Welche maximalen 
Größen gibts denn? Ich habe bei Reichelt und Co. nur bis 512 Kb 
gefunden.

von Falk B. (falk)


Lesenswert?

@ Frank (Gast)

>Größen gibts denn? Ich habe bei Reichelt und Co. nur bis 512 Kb
>gefunden.

Reicht das nicht? Das sind 64kByte. VOn Atmel gibts bis 2 Mbit, also 256 
kByte. Wenns noch grösser sein soll gibt es, auch von Atmel, Flash mit 
SPI, bis zu sagenhaften 32 Mbit zum Wahnsinnspreis.

AT45DB041B bei

http://www.csd-electronics.de/de/index.htm

IC's -> Speicher -> Flash

MFG
Falk

von Jörg T. (brause)


Lesenswert?

Hallo,

bin gerade auf der Suche nach großen I2C-EEPROM's
und zwar >16 kByte. Habe bei Reichelt nichts gefunden
schon gar nicht 64 kByte.
Könnt Ihr mir da einen Hinweis geben?

Vielen Dank
Grüße
Jörg

von Johannes K. (Gast)


Lesenswert?

Der "AT24C512B" hat 512K, also 64KByte.
Gibts bei Reichelt für 1.50€ im DIP-8 Package.

von Jörg (Gast)


Lesenswert?

Hallo Johannes,

vielen Dank für die Info.
Danke und Gruß
Jörg

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.