Forum: Mikrocontroller und Digitale Elektronik Problem mit Data Flash


von Steff (Gast)


Lesenswert?

Hallo,
habe folgendes Problem: Hab einen uC und einen externes Data 
Flash(AT45DB161D). uC schickt die Daten über SPI erstmal in den Buffer 
(RAM(528Byte))
Ist der Buffer voll werden die Daten in die gewünschte page geschrieben.

Kann mir hier jemand vielleicht sagen wie die Daten aus dem buffer 
kommen?
Die Daten vom uC in den Buffer gehen ja über SPI und da schick ich die 
daten ja nur byteweise. Wird das aus dem Buffer in eine page genauso 
gemacht oder hat das dann garnichts mehr mit SPI zu tun wenn ich vom 
Buffer in eine page schreiben will?

Die daten die ich vom uC in den Buffer schicke ist eine Struktur, 
insgesamt werden 12 Strukturen in den buffer geschreiben bis er voll ist 
und dann komplett in eine page geschreiben werden soll.

Kann mir bei diesem problem evtl jemand weiterhelfen?
Grüße

von Michael U. (amiga)


Lesenswert?

Hallo,

was soll da passieren? Du schickst das Kommando, daß er z.B. Buffer 1 in 
Page x schreiben soll und er macht das intern. Inzwischen kannst Du gern 
den anderen Buffer nutzen usw. Busy zeigt an, wenn er mit dem internen 
Programmieren fertig ist.

Oder habe ich Deine Frage nicht verstanden?

Gruß aus Berlin
Michael

von Steff (Gast)


Lesenswert?

Schick ja die daten so byteweise in den buffer:
S0SPDR = (unsigned char)(data.battery_mode >> 8);             // High 
Byte Daten an SPI
    while (!(S0SPSR & (SPI_SPIF)));                         // Warten 
bis Daten gesendet
    S0SPDR = (unsigned char) (data.battery_mode & 0xFF);          // Low 
Byte Daten an SPI
    while (!(S0SPSR & (SPI_SPIF)));

so mach ich das mit der ganzen struktur.Davor schicke ich noch den 
opcode ab 0x84 und die 3 dummy bytes:


for (uint8_t k=0; k<3; k++)
  {
    S0SPDR = adressfeld[k];                                 // Daten an 
SPI
    while (!(S0SPSR & (SPI_SPIF)));                         // Warten 
bis Daten gesendet
  }

muss man dann auch so vorgehen um vom buffer in eine page zu schreiben 
oder nehmm ich einfach den befehl das er den inhalt des buffers nimmt 
und direkt in eine page schreibt??
Man kann auch nur einen Buffer verwenden,oder?
Wozu ist denn der 2. buffer und warum ist der kleiner als der 1.?

von Steff (Gast)


Lesenswert?

Wozu ist denn der 2. buffer und warum ist der kleiner als der 1.?
sorry, das stimmt garnicht, hab es falsch gelesen. hab eigentlich fragen 
wollen, wozu die binary page size(512 bytes) verwendet wird?

von Steff (Gast)


Lesenswert?

Schon wieder hab ich was falsches geschrieben.

>Davor schicke ich noch den
>opcode ab 0x84 und die 3 dummy bytes:

das sind nicht die dummy bytes, sondern da geb ich ja die pageadresse 
vor und ein paar don't care bits

von Steff (Gast)


Lesenswert?

Hast mir einer einen Tipp wie man dabei vorgehen könnte?
Hat eigentlich so ein buffer auch noch irgendwie so untergeordnete pages 
oder sowas?Wenn ich die 1. Struktur in buffer geschreiben hab, an welche 
Stelle schreib ich dann die 2.?Wie bekommt man dazu den freien, noch zur 
verfügung stehenden Speicherplatz heraus?oder schreibt es die neuen 
Daten einfach automatisch hinter die Daten, die schon im buffer stehen?

Wäre echt nett wenn mir jemand weiterhelfen könnte

von Heiko S. (heiko_s)


Lesenswert?

Hallo,

mit einem (84H) Buffer 1 write sendet man Daten (bis zu 528 Byte) in dem 
Buffer 1. Also musst Du anschliessend (ohne CS zwischenzeitlich zu 
verändern) noch die zu sichernden Daten senden!!
Danach sendet man dem Flash (Buffer to Main Memory Page Program) den 
Befehl, den Buffer 1 im Flash an die mitgegebene Adresse zu speichern.

von Steff (Gast)


Lesenswert?

ja so hatte ich es bis jetzt auch so vor. also erst den 84er opcode und 
dann den 83er.

weiß nur nicht wie man das mit der Übergabe der Werte macht. In den 
Buffer schreib ich ja die daten byteweiße hinein:
S0SPDR = (unsigned char)(data.battery_mode >> 8);   // High Byte Daten 
an SPI
    while (!(S0SPSR & (SPI_SPIF)));              // Warten bis Daten 
gesendet
    S0SPDR = (unsigned char) (data.battery_mode & 0xFF);// Low Byte 
Daten an SPI
    while (!(S0SPSR & (SPI_SPIF)));

genauso mach ich es mit den restlichen strukturen ebenfalls.

nur wenn ich jetzt die daten wieder herausholen möchte um in eine page 
zu schreiben weiß ich nicht wie man da vorgeht.
kannst du mir da weiterhelfen?

von Michael U. (amiga)


Lesenswert?

Hallo,

Steff wrote:
> Hast mir einer einen Tipp wie man dabei vorgehen könnte?
> Hat eigentlich so ein buffer auch noch irgendwie so untergeordnete pages
> oder sowas?Wenn ich die 1. Struktur in buffer geschreiben hab, an welche
> Stelle schreib ich dann die 2.?Wie bekommt man dazu den freien, noch zur
> verfügung stehenden Speicherplatz heraus?oder schreibt es die neuen
> Daten einfach automatisch hinter die Daten, die schon im buffer stehen?
>
> Wäre echt nett wenn mir jemand weiterhelfen könnte

Irgendwie bringst Du da ein paar Sachen durcheinander.
Wo und wie Du die Daten im Flash ablegen willst, ist letztlich Dein 
Problem.
Du kennst Deine Datenstruktur, deren Platzbedarf usw.

Die Buffer sind ja vor allem, damit man ohne Verrenkungen eine ganze 
Page programmieren kann.

Also Bufferzeiger auf den Anfang setzen, Deine Daten nach und nach 
reinschreiben und wenn der Buffer voll (oder Du nicht weiter willst) den 
Buffer per Kommando in die gewünschte Page flashen lassen.
Der 2. Buffer hilft ja nur, um die maximale Geschwindigkeit zu 
erreichen.
So kann man seine nächsten Daten schon in den anderen Buffer schreiben, 
während der Flash intern noch die Daten des ersten ins Flash kopiert. 
usw.

Wieviel Daten Du schreibst, weißt Du (bzw. Dein Programm) doch. Solange 
Du /CS aktiv läßt, schreibt er einfach nacheinander Deine Bytes in den 
Buffer. Wie voll der ist, darauf muß Du selbst achten, wenn Du das Ende 
erreichst macht er kommentarlos wieder ab Anfang weiter und 
überschreibt, was da schon stand.

zur binary Pagesize: die Meinungen gehen da sicher auseinander, ich 
programmiere meine AT45DBxxxD immer auf binary Pagesize. Einfach, weil 
meine Gewohnheiten mit 512 Byte besser klarkommen als mit 528. ;)
Das Umprogrammieren ist allerdings eine Einbahnstraße. Einmal auf binary 
Pagesize gesetzt bleibt es auch für immer so.

Gruß aus Berlin
Michael

von Steff (Gast)


Lesenswert?

>Also Bufferzeiger auf den Anfang setzen, Deine Daten nach und nach
>reinschreiben und wenn der Buffer voll (oder Du nicht weiter willst) den
>Buffer per Kommando in die gewünschte Page flashen lassen.

Bin noch relativ unerfahren was dies angeht. Wie würde denn sowas 
aussehen, einen Zeiger auf den Anfang setzen.
Ich vertausch glaub einiges, was das SPI angeht mit dem was das flash 
angeht.

Im S0SPDR stehen ja meine daten drinn wenn ich mit 0x84 in den buffer 
schreib. wenn ich aus dem buffer die daten an das flash weitergeben 
möchte, wie greif ich dann darauf zu? Könntest du mir nicht ein kleines 
Beispiel dazu geben?

von rene (Gast)


Lesenswert?


von Steff (Gast)


Lesenswert?

echt nett von dir, aber bei dem programmcoden komme ich nicht weiter.

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.