Forum: Mikrocontroller und Digitale Elektronik Speicherplatzadressierung SPI EEPROM


von Thomas (Gast)


Lesenswert?

Hallo,
ich habe eine Verständnisfrage zur Adressierung der Speicherplätze in 
einem SPI EEPROM an einem Atmega 8. Ich nutze ein 4K 25LC040 EEPROM von 
Mikrochip mit 512 x 8-bit organization und 16 byte page.
Die Adresse besteht aus 16 Bit und wird mit einem MSB und LSB gesendet.
Im Datasheet steht "A page address begins with XXXX 0000 and ends with 
XXXX
1111." Das ist also Platz für 16 Byte.
Wo kann ich nun aber die Nummer der page angeben? Das EEPROM müsste ja 
32 pages haben. Wie sieht meine Adresse aus als MSB und LSB, wenn ich 
zum Beispiel auf page 5 Byte 10 lesen möchte? Oder verstehe ich die 
Adressierung komplett falsch?
Ich möchte kein page writing machen sondern byte write.
Danke für alle Tipps!
Viele Grüße
Thomas

von Stefan ++ (Gast)


Lesenswert?

Thomas schrieb:
> Im Datasheet steht "A page address begins with XXXX 0000 and ends with
> XXXX 1111." Das ist also Platz für 16 Byte.
> Wo kann ich nun aber die Nummer der page angeben?

Die gibt man an Stelle der XXXX an, steht doch klar im Datenblatt.
Das 5. Bit der Page Adresse ist im "Instruction Byte" (A8) codiert.

Der Unterschied zwischen Byte-Write und Block-Write besteht nur in der 
Anzahl der angehängen Daten-Bytes. Wobei man niemals über eine 
Page-Grenze hinweg schreiben darf !!!! (der interne Adressen-Zähler 
beginnt sonst wieder am Page-Anfang)

von Sascha W. (sascha-w)


Lesenswert?

Thomas schrieb:
> Ich möchte kein page writing machen sondern byte write.
dann übergibst du einfach die Byte-Adresse die in deinem Beispiel also 
90 währe.

Sascha

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, danke für die Antworten. Es ist mir jetzt etwas klarer geworden. 
Die Page gebe ich bei xxxx an. Ein kleines Beispiel um mein Verständnis 
zu überprüfen. Byte 4 in Page 3 sieht so aus: 0011 0100  ??

Ich habe mal mein Programm angehängt, da es noch nicht richtig läuft.
Ich will einfach ein Zeichen A in Adresse MSB 0x00, LSB 0x40 speichern, 
das Zeichen um eins erhöhen auf B und das in Adresse MSB 0x00, LSB 0x60 
speichern. Anschließend möchte ich beide Zeichen auslesen und ausgeben. 
Auf dem Display müsste dann ja A und B stehen, im nächsten Durchlauf B 
und C usw. Aber irgendwie stehen immer nur 2 gleiche Buchstaben da, also 
immer A und A, B und B usw. Es scheint als ob immer nur die erste 
Adresse ausgelesen wird?

Warum ist das so? Wo liegt mein Fehler?
Danke für alle Tipps!

von Stefan ++ (Gast)


Lesenswert?

Hallo,

es liegt wohl daran dass du sowohl beim Schreiben als auch beim Lesen 
stets die Adresse falsch an gibst. Du beginnst immer bei Adresse 0 und 
...

Schau dir das mit der Adresse noch einmal genau an !!!

von Sascha W. (sascha-w)


Lesenswert?

@Thomas

hab mir mal das Datenblatt angesehen - und das solltest du auch tun.
1. Die Adresse wird nicht in 2 Bytes übermittelt, da man für 512 Byte 
nur 9 Adressbits braucht, wird das Bit8 in das Instuction-Commando 
eingebaut (Byte1), dann kommen die Adressbits 7..0 im 2.Byte, dann die 
Daten!

2. CS ist im Ruhezustand immer High!
Also:
Schreiben
---------
CS=0
Write(0x06)    ;Enable
CS=1

CS=0
Write(0x02 | ((ADDR & 0x100)>>5)) ;ADDR-MSB Bit8 nach CMD Bit 3
Write(ADDR & 0xFF)
Write(Data)
CS=1
delay()

Lesen
-----
CS=0
Write(0x03 | ((ADDR & 0x100)>>5)) ;ADDR-MSB Bit8 nach CMD Bit 3
Write(ADDR & 0xFF)
Data=Read()
CS=1


Und grübel nicht über die Page's!
Das Ding hat 512Byte die Adressen gehen von 0x000 (0) bis 0x1FF (511) !


Sascha

von Thomas (Gast)


Lesenswert?

Herzlichen Dank für diese ausführliche Hilfe!
Das Programm läuft jetzt! Ich habe mich durch verschiedene Dinge 
verwirren lassen. Ich hatte am Anfang ein 1024 kBit EEPROM und diese 
Application Note
http://ww1.microchip.com/downloads/en/AppNotes/01193A.pdf
Die hat dann natürlich nicht zu dem kleinen EEPROM gepasst.
Ich denke ich hab einiges über die Adressierung gelernt.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo Thomas,

möchtest du dein fertiges Programm zur Verfügung stellen?


MfG

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.