Forum: Mikrocontroller und Digitale Elektronik STM32F4: Flash Speicher Zugriff über SPI


von rolla (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich verwende einen STM32F407 und würde damit gerne einen FlashSpeicher 
(Atmel AT45DB161E) über SPI beschreiben und auslesen.

Allerdings bekomme ich bei der geschriebenen Read Funktion keine Daten 
aus dem Flash zurück.

Initialisierung des SPI's sollte passen, da ich das Status Register des 
Flash auch auslesen kann.

Zunächst möchte ich den Flash beschreiben. Dazu muss laut Datenblatt der 
CS Pin am Flash eine fallende Flanke aufweisen und dann folgendes über 
den SPI geschickt werden:
Opcode: 0x82
3-Adress Bytes: 0x00, 0x04, 0x01 (für Buffer Adress 0 und Page Adress 0)
Daten: 0xFF (Testdaten zum speicherm im Flash)

Beim lesen ist laut Datenblatt ein ähnliches Vorgehen nötig:
CS Pin auf low
Opcode: 0x03
3-Adress Bytes: 0x00, 0x04, 0x01 (für Buffer Adress 0 und Page Adress 0)
Jetzt sollten im SPI->DR die Daten aus dem Flash stehen, allerdings 
bekomme ich ständig 0x00 zurück und nicht die zuvor gespeicherten 0xFF.

Kann mir da jemand eventuell weiterhelfen oder hat jemand schon 
Erfahrung mit dem Atmel Flash-Speicher?

von Dirk K. (dekoepi)


Lesenswert?

SPI ist wie ein Schieberegister auf beiden Seiten. Um etwas zu lesen, 
musst du auch etwas schicken. Du bekommst erst etwas in SPI3-DR zurück, 
nachdem du ein Dummy-Byte geschickt hast. Also eigentlich genau wie 
deine WriteData-Routine, nur, dass du vorher als Kommando READ anstatt 
WRITE schickst und dann beachtest, was nach dem Transfer in SPI3->DR 
steht.

von Arc N. (arc)


Lesenswert?

Zudem ist 0xff als Testdatum etwas ungünstig, da das dem Zustand bei 
Auslieferung/nach dem Löschen entspricht.

von rolla (Gast)


Lesenswert?

Also das 0xFF nicht geeignet ist, wusste ich jetzt nicht. Dann schicke 
ich da erst mal was anderes.

Müsste ich dass Dummy Byte zum lesen dann jedesmal schicken bevor ich 
das SPI3-DR auslesen möchte oder reicht es das Byte nach den Adress 
Bytes einmal zu schicken und danach nicht mehr?

von Dirk K. (dekoepi)


Lesenswert?

Für jedes Byte, das du empfangen willst, musst du ein Dummy-Byte 
schicken. Ausnahmslos. :) Daher ist senden/empfangen eigentlich ein und 
dieselbe Funktion.
1
uint8_t spi1_tx(uint8_t tx)
2
{
3
  spixbase = (uint32_t)SPI1;
4
  spixbase += 0x0C;
5
  // write data to be transmitted to SPI
6
  *(__IO uint8_t *) spixbase = tx;
7
  if ( !(SPI1->SR & SPI_I2S_FLAG_RXNE) ) { while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) ); } // wait until receive complete
8
  return ( *(__IO uint8_t *) spixbase );
9
}

von rolla (Gast)


Lesenswert?

Danke für die Hilfe :)

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.