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

OP #5783266
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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