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?
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.
Zudem ist 0xff als Testdatum etwas ungünstig, da das dem Zustand bei Auslieferung/nach dem Löschen entspricht.
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?
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 | } |
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.