Serial flash memory N25q032

Gast #5209445
Lesenswert?

Hallo,

für das Speichern von Daten wird ein externer Flash eingesetzt. Das 
Beschreiben von Daten sowie Lesen funktioniert nicht.

Folgender Ablauf für das Speichern und Lesen von 256 Bytes:

--> WriteEnable
--> EraseBulk
--> WriteDisable

--> WriteEnable
--> WritePage
--> WriteDisable

--> ReadPage

Was für eine Bedeutung haben die Register WriteLock und ReadLock?
Muss für ein Schreibvorgang sowie Lesevorgang noch ein Bit gesetzt 
werden?
Gast #5209476
Lesenswert?

Manual kaputt?
Die sind einfa dazu da, die entsprechenden Zugriffe auf Sektoren zu 
sperren. Ein Blick ins Manual hätte dir verraten, dass diese Bits per 
default auf "Unlocked" stehen. Sofern Du daran nichts änderst, musst Du 
mit den Bits auch nichts machen.

Warum löscht Du den ganzen Flash, wenn Du nur 256 Bytes schreiben 
willst?
Gast #5209571
Lesenswert?

Ja den ganzen Flash muss ich nicht löschen. Hab das abgeändert indem ich 
nur noch den Sektor lösche. Das Speichern und Lesen funktioniert noch 
nicht korrekt. Die SPI Schnittstelle funktioniert. Ich kann die Device 
ID von dem Baustein erfolgreich auslesen.
Gast #5209604
Lesenswert?

dev schrieb:
> Das Speichern und Lesen funktioniert noch
> nicht korrekt.

Frühere Probleme dieser Art zeigten dass die einzelnen
Operationen immer mit einem CS-Zyklus eingerahmt werden
müssen, was nicht jeder streng befolgt.

Daher:

mmm schrieb:
> Mit "funktioniert nicht" kann hier niemand was Anfangen.

Source zeigen.
Gast #5209613
Lesenswert?

SPI Clock = 18 Mhz

Kommando: WriteEnable
 1.Byte=0x06;
 ChipSelect=0;
 Sende 1 Byte über die SPI Schnittstelle
 ChipSelect=1;

Kommando: Erase Sector
 SectorNumber = 0;
 1.Byte=0xD8;
 2.Byte=(uint8_t)(SectorNumber >>16);
 3.Byte=(uint8_t)(SectorNumber >>8);
 4.byte=(uint8_t)SectorNumber;
 ChipSelect=0;
 Sende 4 Bytes über die SPI Schnittstelle
 ChipSelect=1;

Kommando: WriteDisable
 1.Byte=0x04;
 ChipSelect=0;
 Sende 1 Byte über die SPI Schnittstelle
 ChipSelect=1;



Kommando: WriteEnable
 1.Byte=0x06;
 ChipSelect=0;
 Sende 1 Byte über die SPI Schnittstelle
 ChipSelect=1;

Kommando: WritePage
 Address = 0;
 1.Byte=0x02;
 2.Byte=(uint8_t)(Address >>16);
 3.Byte=(uint8_t)(Address >>8);
 4.byte=(uint8_t)Address ;
 ChipSelect=0;
 Sende 4 Bytes + 256 Datenbytes über die SPI Schnittstelle
 ChipSelect=1;

Kommando: WriteDisable
 1.Byte=0x04;
 ChipSelect=0;
 Sende 1 Byte über die SPI Schnittstelle
 ChipSelect=1;


Kommando: ReadPage
 Address = 0;
 1.Byte=0x03;
 2.Byte=(uint8_t)(Address >>16);
 3.Byte=(uint8_t)(Address >>8);
 4.byte=(uint8_t)Address ;
 ChipSelect=0;
 Sende 4 Bytes + 256 Datenbytes über die SPI Schnittstelle
 Lese Daten und speichere Daten in einen Puffer
 ChipSelect=1;
Gast #5209620
Lesenswert?

Das ist keine Source, das ist eine Krankheit.

Beim Schreiben wird man eine Wartezeit einhalten müssen.
Beim Write Enable sollte man prüfen ob man es geschafft
hat das entsprechende Bit zu setzen.

Beim Konfigureien des SPI sollte man sicherstellen den
richtigen Modus gewählt zu haben.
Gast #5209742
Lesenswert?

Nachdem du so offenherzig deine Sourcen zeigst bin ich raus.

Nur soviel noch(mal):

Mitlesa schrieb:
> Beim Schreiben wird man eine Wartezeit einhalten müssen.

Nach dem Schreiben ist es möglich (auch innerhalb des Self-
Programming-Zyklus) die diversen Status Register abzufragen
und sich damit schlau zu machen was los ist.
---------^^^^^^^^^^^^^^^^^^^^^^^-------------
#5209756
Lesenswert?

Der übliche Ablauf bei solchen Flash-Bausteinen ist eigentlich immer 
derselbe:
0. Falls noch mehr gelockt ist wie bspw. bei einigen von SST/Microchip, 
unlocken

1. WREN
2. PP oder SE oder BE
3. Statusregister lesen bis Ready
4. Fehlerbehandlung oder was auch immer als nächstes kommt

Wie das Flash hier darauf reagiert, wenn während eines Schreibvorgangs 
Write Disable ausgeführt wird: Keine Ahnung...

Edit: Falls hier benutzt: Die Befehle für das Lesen und Schreiben im 
Single, Dual oder Quad-IO-Modus sind u.U. unterschiedlich bzw. muss man 
aufpassen, was in welchem Modus erlaubt ist
Gast #5209831
Lesenswert?

Christian R. schrieb:
> Wartest du denn nun durch Pollen des Status Registers ob nach dem
> Schreiben und Löschen das Busy Bit wieder weg geht oder nicht?

Das Antworten auf Fragen zur Diagnose scheint nicht zu
den Stärken des TOs zu gehören.

Aus den ganzen Reaktionen folgere ich dass der TO absolut
nicht weiss was er tut.

Oder Trollverdacht .....
#5209832
Lesenswert?

dev schrieb:
> Zwischen WriteEnable und ReadStatus wird nichts ausgeführt.
>
> Vor WriteEnable steht erhalte ich den Wert 0x00 und nach WriteEnable
> 0x02

Das sollte auch so sein. Man braucht (siehe DB Timing für genaueres) 
allerdings nach WriteEnable nicht zu pollen.

Jetzt fehlt nur noch ein Schreibtest...
1
WriteEnable();
2
SectorErase();
3
for (to = 0; to < TIMEOUTLOOPS; to++) {
4
   status = ReadStatus();
5
   if (0 == (status & WriteInProgress)) break;
6
} 
7
// Fehlerbehandlung usw. usf
Gast #5210405
Lesenswert?

Nachdem die Daten übertragen wurden wird das Read Status Register 
ausgelesen. Sobald das Bit0 = 0 ist sollte das Schreiben funktioniert 
haben. Nach WriteDisable kann ich auch die erste Page auslesen. Wenn ich 
den Schreibvorgang für die nächste Page mache werden falsche Werte 
ausgelesen.
1
WriteEnable();
2
WritePage(0, &Buffer[0]); // Address = 0
3
do
4
{
5
  status = ReadStatus();
6
}
7
while(status&0x01 == 0x01);
8
WriteDisable();
Gast #5210439
Lesenswert?

Mit dem READ ID Kommando können noch weitere Daten ausgelesen werden.
Das 4. Byte hat bei mir den Wert = 0x00. Laut Datenblatt bedeutet dies, 
dass der Flash im HOLD Zustand befindet. Kann ich per Software einen 
RESET auslösen?
#5210440
Lesenswert?

wieso machst du eigentlich ein writeDisable? Das ist quatsch. Man macht 
einmal ein write enable und schiebt die Daten Page per page rein.

Zudem, ohne zu wissen was DU für ein uC verwendest und Dein Code nicht 
zeigst (was auch totaler quatsch ist), wird man Dir nicht helfen können.

Ich glaube vielmehr das Du nicht mal ansatzweise verstehst was Du da 
versuchst zu machen.
#5210645
Lesenswert?

dev schrieb:
> Gibt es bei diesem Bausteine eine Möglichkeit einen Software Reset
> auszulösen? Im Datenblatt konnte ich dazu nichts finden.

was erwartest Du hier eigentlich? Das man Dir hier das DB vorkaut?
Wenn Du das mit dem SW-Reset nicht gefunden hast, dann hast Du wikrlich 
keinen Schimmer von dem was Du hier machst..Oder bist Du ein Troll?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren