Forum: Mikrocontroller und Digitale Elektronik SDcard schnell beschreiben, Problem


von Pete Danneberger (Gast)


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

von Pete Danneberger (Gast)


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.

von holger (Gast)


Lesenswert?

Ist das beim SAM7 wirklich so mies ?

Beim LPC2136 sieht das so aus:

S0SPCR=(a);
while(!(S0SPSR & (SPIF)));

Ohne Probleme. Lohnt sich nicht mal ne Subroutine daraus zu machen ;)

von Andreas S. (andreas) (Admin) Benutzerseite


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 ) );

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.