SD Karte Lesen und Schreiben klappt NICHT nacheinander

OP #1534694
Lesenswert?
• ▲
▼
Hallo

Ich bin nun recht verzweifelt, da ich schon seit soooooooooooo vieeelen 
stunden versuche die SD Karte am STM32F103 Hardware SPI zum laufen zu 
kriegen

Nun habe ich ersten "erfolg"

Ich verwende diese "Librarys" 
http://www.mikrocontroller.net/articles/AVR_FAT32

Ich habe dort alles an meinen Controller abgeändert...

Ich habe es nun endlich geschafft hinter ein grundlegendes problem zu 
kommen.

Ich kann problemlos 512 Byte Schreiben und auch alle Sektoren von 0 - 
1000 nacheinander auslesen und per UART ausgeben solange ich dies NICHT 
im programm vereine (also zb zuerst schreiben und dann lesen)

Doch sobald ich versuche etwas zu schreiben und danach irgend ein sektor 
auszulesen, klappts nicht mehr...

Dan hängt er mir bei folgender Zeile ewig fest
1
//Wartet auf Start Byte von der MMC/SD-Karte (0xFE/Start Byte)
2
   while (mmc_read_byte() != 0xFE){};

In meinem Versuch ist dies in mmc_read_sector

Ich habe versucht einen x beliebigen Sektor zu beschreiben und danach 
sektor xyz auszulesen. Dabei ist es egal welchen sektor ich auslesen 
möchte... Es gibt immer den gleichen fehler...

Merkwürdigerweise meldet die Karte einen Schreibfehler bzw der Code 
meldet dies
1
//Fehler beim schreiben? (Data Response XXX00101 = OK)
2
  if((mmc_read_byte()&0x1F) != 0x05) return 2;

Ich bekomme ein return 2
Die Daten sind jedoch auf der Karte Vorhanden und können auch mittels 
mmc_read_sector ausgelesen werden, sofern zuvor mmc_write_sector 
nirgends aufgerufen wurde!


ich hoffe irgend jemand hat eine idee woran das liegen könnte...


Danke schonmal
OP #1534807
Lesenswert?
• ▲
▼
So hab das problem nun selbst gefunden und gelöst...

In der AVR Library hier aus dem Forum hat es Fehler drinn...

Es sollte nicht heissen
1
//CRC-Byte schreiben
2
  mmc_write_byte(0xFF); //Schreibt Dummy CRC
3
  mmc_write_byte(0xFF); //CRC Code wird nicht benutzt
4

5
  //Fehler beim schreiben? (Data Response XXX00101 = OK)
6
  if((mmc_read_byte()&0x1F) != 0x05) return FALSE;


Sondern man muss Abwarten bis der Respond kommt! Nicht jede karte hat 
gleich lange...

Obige zeilen sind also komplett durch diese hier zu ersetzen...
Da mmc_read_byte() auch dummy clocks sendet entfällt das separate sender 
dieser für die CRC abfrage...
1
while((mmc_read_byte()&0x1F) != 0x05);

Hoffe es hilft jemandem
Gast #1534818
Lesenswert?
• ▲
▼
> Sondern man muss Abwarten bis der Respond kommt! Nicht jede karte hat
> gleich lange...

Aber das weiss man doch. Das unterschiedliche Verhalten dieser
@#$@$#-Karten hat mich auch schon Nerven gekostet.

> while((mmc_read_byte()&0x1F) != 0x05);

Ich wuerde darauf achten keine Endlosschleifen zu produzieren. Daher 
decrementiere ich normalerweise bei solchen Schleifen einen Zaehler und 
breche auf jedenfall ab wenn der auf Null ist. Dann bleibt dein Programm 
nicht einfach wortlos stehen wenn du mal wieder eine neue Karten mit 
abartigen Verhalten reinsteckst.

Olaf

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.