Forum: Mikrocontroller und Digitale Elektronik SPI EEPROM M25P05-AV lesen und löschen geht, schreiben nicht


von Heinz M. (subi)


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?

von Code Leser (Gast)


Lesenswert?

Heinz M. schrieb:
> Warum werden keine Daten geschrieben?

Vermutlich weil du vor

txData[0] = 0x02; //Page Programm

vergessen hast den CS zu aktivieren.

von Code Leser (Gast)


Lesenswert?

... opps sorry, hast du doch ...

von Heinz M. (subi)


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?

von pegel (Gast)


Lesenswert?

Heinz M. schrieb:
> Nach dem löschen steht überall ff

Wo steht das?
Beachte das ein Datenpuffer vorgeschaltet ist, der dann mit der 
richtigen Sequenz in den Speicher übernommen wird.

von Heinz M. (subi)


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.

von Heinz M. (subi)


Lesenswert?

EEPROM war vermutlich defekt. Anderer funktioniert so wie er soll.

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.