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?
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?
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.
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...
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.
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;
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.
Mit welchem Kommando kann man prüfen ob das Write Enable Bit gesetzt wurde oder nicht?
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.
dev schrieb: > Welches Status Register? Das Status Register ist das Status Register, so wie im Datenblatt benannt.
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.
Bevor das WriteEnable Kommando gesendet wird steht im STATUS REGISTER 0 drin. Danach 0x2.
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.
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.
Nachdem ich nun das STATUS REGISTER auslese funktioniert das SPEICHERN und AUSLESEN immer noch nicht richtig.
Wenn ich die erste Page sende dann erhalte ich nach dem Auslesen auch die Daten korrekt. Beim zweiten mal nicht mehr.
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. ---------^^^^^^^^^^^^^^^^^^^^^^^-------------
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
Wartest du denn nun durch Pollen des Status Registers ob nach dem Schreiben und Löschen das Busy Bit wieder weg geht oder nicht?
1 | WriteEnable(); |
2 | |
3 | do
|
4 | {
|
5 | status = ReadStatus(); |
6 | }
|
7 | while(status == 0x02); |
Das Bit1 wird nicht auf null gesetzt.
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
|
Zwischen WriteEnable und ReadStatus wird nichts ausgeführt. Vor WriteEnable steht erhalte ich den Wert 0x00 und nach WriteEnable 0x02
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 .....
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
|
Nachtrag: Nach einem Schreibvorgang muss das Kommando WriteDisable ausgeführt werden?
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(); |
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?
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.
Gibt es bei diesem Bausteine eine Möglichkeit einen Software Reset auszulösen? Im Datenblatt konnte ich dazu nichts finden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.