SPI EEPROM M25P05-AV lesen und löschen geht, schreiben nicht

OP #5783266
Hallo,

ich versuche mich gerade in EEPROMs einzuarbeiten. Aus einer alten 
Festplatte habe ich mir einen M25P05-AV geklaut.

Schaltung:
1 Chip Select auf GPIO von µC
2 MISO
3 Write Protect mit 10 kOhm auf 3 V
4 GND
5 MOSI
6 Clock
7 Hold mit 10 kOhm auf 3 V
8 VCC 3 V

Lesen funktioniert. Da der Chip vorher in der HDD verbaut war konnte ich 
die Daten die darauf gespeichert waren lesen.
1
//lesen
2
txData[0] = 0x03; //lesen
3
txData[1] = 0x00; //Adresse1
4
txData[2] = 0x00; //Adresse2
5
txData[3] = 0x00; //Adresse3
6

7
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //Slave Select Low (Aktiv)
8
HAL_SPI_Transmit(&hspi1, txData, 4, 100);
9
HAL_SPI_Receive(&hspi1, rxData,8, 100);
10
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //Slave Select High (Inaktiv)

Löschen funktioniert auch. Die Daten vom ersten Sektor sind jetzt alle 
0xFF. Die vom zweiten Sektor noch vorhanden.
1
//löschen
2
txData[0] = 0x06; //Write enable
3

4
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //Slave Select Low (Aktiv)
5
HAL_SPI_Transmit(&hspi1, txData, 1, 100);
6
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //Slave Select High (Inaktiv)
7

8
txData[0] = 0xD8; //Page Erase
9
txData[1] = 0x00; //Page Addr0
10
txData[2] = 0x00; //Page Addr1
11
txData[3] = 0x00; //Page Addr2
12

13
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //Slave Select Low (Aktiv)
14
HAL_SPI_Transmit(&hspi1, txData, 4, 100);
15
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //Slave Select High (Inaktiv)
16

17
HAL_Delay(10000); //jaja, das hässliche Delay kommt später noch weg

Nur schreiben funktioniert nicht und ich weiß einfach nicht warum.
1
//beschreiben
2
txData[0] = 0x06; //Write enable
3
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //Slave Select Low (Aktiv)
4
HAL_SPI_Transmit(&hspi1, txData, 1, 100);
5
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //Slave Select High (Inaktiv)
6

7
HAL_Delay(100);
8

9
txData[0] = 0x02; //Page Programm
10
txData[1] = 0x00; //Page Addr0
11
txData[2] = 0x00; //Page Addr1
12
txData[3] = 0x00; //Page Addr2
13

14
txData[4] = 0x01; //Page Data1
15
txData[5] = 0x02; //Page Data2
16
txData[6] = 0x03; //Page Data3
17
txData[7] = 0x04; //Page Data4
18

19
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //Slave Select Low (Aktiv)
20
HAL_SPI_Transmit(&hspi1, txData, 8, 100);
21
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //Slave Select High (Inaktiv)
22

23
HAL_Delay(1000);

Das Statusregister (RDSR 0x03) spuckt mir 0x02 aus. Also nach Datenblatt 
sämtliche Protections aufgehoben und Schreibmodus aktiviert. Warum 
werden keine Daten geschrieben?
OP #5783495
Ich habe mich mal am zweiten Sektor vergriffen. Dort funktionierte das 
schreiben, so wie es sollte. Aber halt nur so lang, bis alles 0 ist. 
Nach dem löschen steht überall ff, aber lässt sich nicht beschreiben. 
Also ist der Fehler beim Löschen, nicht beim Schreiben. Muss ich noch 
etwas freigeben?
OP #5783642
Im Speicher steht in jeder Page 0xFF.

Datenpuffer dürfte nicht interessieren, weil:
1. Vor dem löschen ging das schreiben.
2. Wenn man beim löschen zu früh auf den Speicher zugreift gibt 0x00. 
Wenn er fertig ist mit löschen, dann 0xFF. An dem Puffer komme ich 
ungewollte nicht vorbei.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.