Forum: Mikrocontroller und Digitale Elektronik SD Karte Lesen und Schreiben klappt NICHT nacheinander


von C. H. (hedie)


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

von C. H. (hedie)


Lesenswert?

Vielleicht hat ja jemand heute morgen eine idee :)

von C. H. (hedie)


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

von Olaf (Gast)


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

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.