Ich versuche gerade einen SST25VF010A Flash zu schreiben. Die Hersteller ID erhalte ich Korrekt also SPI funktioniert perfekt. Auch das auslesen des Status Register funktioniert (0x0C). Zum Schreiben in den Speicher müssen die Protect BP0 + BP1 auf 0 gesetzt werden, das erledige ich mit SPI_Erase_Block_Prot(); lese ich danach das Status register erhalte ich nach wie vor 0xC0. Über SPI_Write_Data(0x0000,10); werden nun versucht den Speicher (10 Zeichen) aus TxBuffer in den Flash zu Speichern. Leider ohne erfolg. Auch Google hilft in diesem Fall eider nicht. Hat jemand Erfahrung mit dem Baustein. Im Anhang der Programmcode. Microcontroller Atmega64, Quarz 8 MHZ grüssle
Versuchs mal so:
1 | //=================================================
|
2 | // Block Protection Aus
|
3 | //=================================================
|
4 | void SPI_Erase_Block_Prot() |
5 | {
|
6 | |
7 | SPI_Write_Enable(); |
8 | |
9 | CHIP_SELECT // _S Low |
10 | DELAY
|
11 | SPI_Write_Byte(WRITE_EWSR); |
12 | CHIP_UNSELECT // _S High |
13 | DELAY
|
14 | |
15 | SPI_Write_Enable(); //<------------------------- |
16 | |
17 | //Entferne BlogProtection
|
18 | CHIP_SELECT // _S Low |
19 | DELAY
|
20 | SPI_Write_Byte(WRITE_WRSR); |
21 | SPI_Write_Byte(0x00); |
22 | CHIP_UNSELECT // _S High |
23 | DELAY
|
24 | |
25 | SPI_Write_Disable(); |
26 | |
27 | WaitUntilDone(); |
28 | |
29 | }
|
Vor dem Schreiben des Status Registers muss das WriteEnable Bit gesetzt werden. Dafür gibts ein extra Kommando. Achtung, wird beim Schreiben des SR wieder zurück gesetzt.
Ich habe es 2x gemacht und geht auch nicht wenn ich den status nach dem ersten mal lese steht 0x0E also ist es gesetzt auch wenn ich es vor SPI_Write_Disable(); lese ist es 0x0E
>>Mache ich doch SPI_Write_Enable(); > >Du machst es aber nur einmal. Hmm, das zweite ist laut der Sequenz im Datenblatt nicht notwendig bzw. sogar komplett falsch. Lass das erste doch mal weg. Das braucht man wohl auch nicht. Vieleicht stört das ja sogar.
User schrieb: > Ich habe es 2x gemacht und geht auch nicht wenn ich den status nach dem > ersten mal lese steht 0x0E also ist es gesetzt auch wenn ich es vor > SPI_Write_Disable(); lese ist es 0x0E Das WREN ist fürs Schreiben ins Status-Register überflüssig, da reicht das EWSR. Und das WRDI ist eigentlich immer überflüssig, da es nach einer Schreiboperation automatisch zurückgesetzt wird. Hm, wenn es immer 0x0E bzw. 0x0C bleibt, und WP und HOLD sicher auf VCC liegen, bleibt eigentlich nur ein Hardware-Problem. Takt zu hoch wird es ja wohl auch nicht sein. Kaputt?! Ähm, nur zur Sicherheit: VCC ist durchgehend sauber im Bereich 2,7 bis 3,6V? Keine kurzen Einbrüche oder so???
Du musst vor jedem Daten schreiben in das flash zuvor das write enable senden. Beim Byte Programm wird der WREN zurückgesetzt.
:
Bearbeitet durch User
Ich hab den Fehler gefunden. Hier falls jemand das gleiche Problem hat. Der CE gemessen mit Osz ging auf GND, das reicht aber nicht aus vermutlich zu langsam. ein 100K Wiederstand von CE auf Masse und alles läuft perfekt.
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.