Forum: Mikrocontroller und Digitale Elektronik Serial flash memory N25q032


von dev (Gast)


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?

von mmm (Gast)


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?

von dev (Gast)


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.

von mmm (Gast)


Lesenswert?

Mit "funktioniert nicht" kann hier niemand was Anfangen.
Wie äußert sich denn das nicht-funktionieren?

Was sendest Du? Welche Antwort erhältst Du? Wie schnell taktest Du das 
SPI Interface...

von Mitlesa (Gast)


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.

von dev (Gast)


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;

von Mitlesa (Gast)


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.

von dev (Gast)


Lesenswert?

Der Quellcode ist zu komplex. Das ist quasi der Ablauf.

von dev (Gast)


Lesenswert?

Mit welchem Kommando kann man prüfen ob das Write Enable Bit gesetzt 
wurde oder nicht?

von Christian R. (supachris)


Lesenswert?

Status Register lesen fehlt anscheinend. Erst mal um zu verifizieren 
dass das WREN Bit gesetzt wurde (ich glaube das ist da drin) und dann 
musst du natürlich pollen ob das Löschen bzw Schreiben fertig ist, das 
dauert recht lange.

von dev (Gast)


Lesenswert?

Welches Status Register? Du meinst das Write Status Register oder?

von Mitlesa (Gast)


Lesenswert?

dev schrieb:
> Welches Status Register?

Das Status Register ist das Status Register, so wie im
Datenblatt benannt.

von dev (Gast)


Lesenswert?

Ok stimmt. Es ist natürlich das READ STATUS REGISTER.

von Mitlesa (Gast)


Lesenswert?

Bei diesem Chip gibt es auch noch das "Flag Status Register".

Dort kann man sich interessante Dinge anschauen, und man
weiss dann auch besser wo man mit seiner Programmierung steht.

von dev (Gast)


Lesenswert?

Bevor das WriteEnable Kommando gesendet wird steht im STATUS REGISTER 0 
drin. Danach 0x2.

von Mitlesa (Gast)


Lesenswert?

dev schrieb:
> Es ist natürlich das READ STATUS REGISTER.

Nein, es gibt kein READ STATUS REGISTER.

Es gibt nur ein STATUS REGISTER das man lesen und schreiben kann.

von Mitlesa (Gast)


Lesenswert?

dev schrieb:
> Bevor das WriteEnable Kommando gesendet wird steht im STATUS REGISTER 0
> drin. Danach 0x2.

Einfache logische Schlussfolgerung daraus ist dass es darauf-
folgend möglich ist zu schreiben.

von dev (Gast)


Lesenswert?

READ FLAG STATUS REGISTER hat bei mir immer den Wert 0x80

von dev (Gast)


Lesenswert?

Nachdem ich nun das STATUS REGISTER auslese funktioniert das SPEICHERN 
und AUSLESEN immer noch nicht richtig.

von dev (Gast)


Lesenswert?

Wenn ich die erste Page sende dann erhalte ich nach dem Auslesen auch 
die Daten korrekt. Beim zweiten mal nicht mehr.

von dev (Gast)


Lesenswert?

Ich habe nun keine Idee mehr wo ich nun nachschauen könnte.

von Mitlesa (Gast)


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.
---------^^^^^^^^^^^^^^^^^^^^^^^-------------

von dev (Gast)


Lesenswert?

Ich sehe keine Auffälligkeiten beim Auslesen vom STATUS REGISTER

von dev (Gast)


Lesenswert?

Ist alles soweit in Ordnung

von Arc N. (arc)


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

von dev (Gast)


Lesenswert?

Ich betreibe den Baustein im Single Modus

von Christian R. (supachris)


Lesenswert?

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

von dev (Gast)


Lesenswert?

1
  WriteEnable();
2
3
  do
4
  {
5
    status = ReadStatus();
6
  }
7
  while(status == 0x02);

Das Bit1 wird nicht auf null gesetzt.

von Arc N. (arc)


Lesenswert?

dev schrieb:
1
  WriteEnable();
2
  // Was steht zwischen WriteEnable und ReadStatus?
3
  do {
4
    status = ReadStatus();
5
  } while(status == 0x02);
6
  // Wieso == 0x02? Table 9: Status Register Bit Definitions...
7
  // Bit 0 ist Write in Progress, Bit 1 ist Write Enable Latch

von dev (Gast)


Lesenswert?

Zwischen WriteEnable und ReadStatus wird nichts ausgeführt.

Vor WriteEnable steht erhalte ich den Wert 0x00 und nach WriteEnable 
0x02

von Mitlesa (Gast)


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 .....

von Arc N. (arc)


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

von dev (Gast)


Lesenswert?

Hallo,

welchen Wert hat WriteInProcess?

von dev (Gast)


Lesenswert?

Nachtrag: Nach einem Schreibvorgang muss das Kommando WriteDisable 
ausgeführt werden?

von dev (Gast)


Lesenswert?

Ok WriteInProcess hat den Wert 0.

von dev (Gast)


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();

von Christian R. (supachris)


Lesenswert?

Vielleicht hast du die Reihenfolge der Adressbytes vertauscht?

von dev (Gast)


Lesenswert?

Hab nochmals nachgeschaut. Die Adressen sind nicht vertauscht.

von dev (Gast)


Lesenswert?

Die Manufacturer ID = 0x20 kann ich erfolgreich auslesen.

von dev (Gast)


Lesenswert?

Ein anderes serielles Flash (EPCS) funktioniert ohne Probleme.

von dev (Gast)


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?

von Bülent C. (mirki)


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.

von dev (Gast)


Lesenswert?

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

von Bülent C. (mirki)


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?

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.