SDcard schnell beschreiben, Problem

Gast #518051
Lesenswert?

Hallo,
ich möchte mit einem Sam7 eine SDKarte beschreiben, das funktioniert 
auch ganz gut. Meine writebyte routine so aus:


inline char mmc_write_byte (char Byte)
//###################################################################### 
######
{
  while( !( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE ) ); // Wait until 
the character can be sent
  AT91C_BASE_SPI->SPI_TDR = Byte;

  while( !( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF ) );  // Wait until 
the character can be received
  return (char)( AT91C_BASE_SPI->SPI_RDR ); // it's important to read 
RDR here!
}

Hierbei dauert das Auslesen des Empfangsregisters (RDR) sehr lange, so 
daß ich diesen Teil beim Übertragen der 512 Byte hintereinander 
weggelassen habe.
Leider schreibt die Karte dann nur sehr unzuverläßig die Daten in ihren 
Speicher.

Wieso dauert das Auslesen des Empfangsregisters solange und wieso ist es 
"important" dieses bei jeder Übertragung auszulesen?

Danke
Gast #518052
Lesenswert?

Auslesen des RDR beim schreiben (egal durch Pollen oder PDC) = alles IO 
aber "langsam"

Ohne Auslesen des "unwichtigen" Empfangsregisters läufts instabil dafür 
aber mit bis zu 1MB/sek.
Admin Persönliche Seite #518511
Lesenswert?

Ich bezweifle dass es das Auslesen des Empfangsregisters ist das so 
lange dauert. Zitat aus Datenblatt:

• RDRF: Receive Data Register Full
0 = No data has been received since the last read of SPI_RDR
1 = Data has been received and the received data has been transferred
from the serializer to SPI_RDR since the last read of SPI_RDR.
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Wenn du SPI_RDR nicht liest, dann wird deine While-Schleife also beim 
nächsten Mal sofort abgebrochen, weil RDRF noch von der letzten 
Übertragung high ist:

while( !( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF ) );

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