www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SDcard schnell beschreiben, Problem


Autor: Pete Danneberger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pete Danneberger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.