Matthias K. schrieb:
> Schwierig, ohne Dein Programm genau zu kennen.
>
> Ich häng Dir mal funtionsfähigen Low-Level Code für SPI SDCARD an.
> Vielleicht eine Hilfe.
Hallo Matthias
Vielen Dank für deine Antwort....
Was mir auffält, ist dass du nicht bis zum ende des Transmit wartest.
1 | /*-----------------------------------------------------------------------*/
|
2 | /* Transmit/Receive a byte to MMC via SPI (Platform dependent) */
|
3 | /*-----------------------------------------------------------------------*/
|
4 | static BYTE stm32_spi_rw( BYTE out )
|
5 | {
|
6 | /* Loop while DR register in not empty */
|
7 | /// not needed: while (SPI_I2S_GetFlagStatus(SPI_SD, SPI_I2S_FLAG_TXE) == RESET) { ; }
|
8 |
|
9 | /* Send byte through the SPI peripheral */
|
10 | SPI_I2S_SendData(SPI_SD, out);
|
11 |
|
12 | /* Wait to receive a byte */
|
13 | while (SPI_I2S_GetFlagStatus(SPI_SD, SPI_I2S_FLAG_RXNE) == RESET) { ; }
|
14 |
|
15 | /* Return the byte read from the SPI bus */
|
16 | return SPI_I2S_ReceiveData(SPI_SD);
|
17 | }
|
Ich habe nach meindem SendData ja noch dies hier drinn
1 | while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET);
|
Du schreibst ja in deinem Kommentar, dass das Warten auf das ende des
Sendens nicht nötig ist also auf das flag TXE. Weshalb nicht?
Ich hatte ohne das Warten Probleme.
Der STM hatte dann nämlich sein TX Buffer wieder gefüllt obwohl der alte
noch nicht gesendet war. Mit dem flag TXE konnte ich dies leider nicht
korrekt erkennen ob er leer war oder nicht.
Nach einigem Googlen hab ich herausgefunden dass anscheinend auch andere
dieses Problem haben.
Lösen konnte ich es mit der obigen Codezeile. Das Warten auf das BSY
Flag
Bevor ich jetzt meinen gesamten Code umkremple und mit deinem vereine,
habe ich dir im Anhang noch mein komplettes Projekt angehängt...
Vielleicht siehst du da etwas verdächtiges....
Danke schonmal