Hallo
Ich versuche nun schon seit einigen Tagen eine SD Karte (1GB) an mein
Mikrocontroller Board anzuschliessen (STM32F103RB Controller)
Ich verwende die Sourcen von Ulrich Radig (www.ulrichradig.de)
Es hat ein weilchen gedauert bis die Kommunikation einwandfrei lief
(hardware SPI) doch dies ist nun kein problem mehr...
Ich kann problemlos Blöche a 512 bytes lesen sowie die adresse für den
Volumen Master Boot Record holen und auch diesen problemlos auslesen.
Nur zeigt mir das beispiel keine Dateien an welche auf der Karte sind :(
Ich hab mir mal über den UART einfach die ersten 1000 Blöcke auslesen
lassen und auf inhalt der bytes geprüft also ob das byte etwas
beinhaltet und nur diese dan ausgegeben... Ich hab über den UART alle
Dateien empfangen
Es muss also irgendwo am code vom ulrich liegen das es nicht klappt
denke ich mal...
Ich habe etwas am code geändert
ursprünglich hiess die funktion für das Speichern der daten So:
1
voidCluster_Data_Store(void)
da ich dann jedoch probleme mit dem buffer hatte, weshalb weiss ich bis
jetzt nicht. Hab ich mich entschieden den buffer aus der Main mittels
pointer zu übergeben.
1
voidCluster_Data_Store(unsignedchar*Buffer)
Ich sehe mit dem Debugger, das es die
1
structBootSec*bootp;//Zeiger auf Bootsektor Struktur
Bootsektor Struktur korrekt befüllt.
Doch leider bekomme ich keine Daten aus dem Root Directory
1
//Ausgabe des Root Directory <-------------------------------------------------------------
Hallo,
wenn du Debuggen kannst, schau dir doch mal an ob der richtige Sektor
des Root-Dirs geladen wird. Ist die Karte vielleicht Partitioniert oder
so?
Meist ist es wenig hilfreich auf andere Libs zu verweisen, aber du
könntest zum Vergleich auch mal diese Lib probieren :
http://www.mikrocontroller.net/articles/AVR_FAT32
Grüße
Hallo Zerrome
Ich habe die Library angepasst und getestet...
Doch leider klappt es nicht :(
Initialisieren geht problemlos doch er belibt an dieser Stelle hängen:
1
//Wartet auf Start Byte von der MMC/SD-Karte (0xFE/Start Byte)
2
while(mmc_read_byte()!=0xFE){};
mmc_read_byte und mmc_write_byte sieht so bei mir aus:
Hallo,
ich bin mir da noch nicht so sicher, dass die Initialisierung korrekt
ist. Probier mal die Initialisierung ohne eine Karte im Slot zu haben,
wenn das auch geht, ist da schon ein Fehler.
SPI_I2S_XXX diese Funktionen kenne ich nicht. Wenn aber sicher ist das
sie das machen was sie sollen sieht das auf den ersten blick schon Ok
aus.
Das define RESET ist das richtige?
Versuche mal die SPI Geschwindigkeit nach der Initialisierung nicht auf
Maximalen Speed zu setzen.
Grüße
Hallo Zerrome
Danke für deine antwort...
Also ohne karte im Slot klappts nicht... es kommt auch wirklich 0x01
nach CMD0 zurück... somit sollten die Funktionen SPI_I2S_XXX auch
klappen...
Diese sind übrigens aus der Library von ST (also ST Microelectronics)
diese sind für die STM32 Cortex M3 controller....
Ich erhöhe den speed nacht dem initialisieren auch nicht...
Habe inzwischen mit einer 8GB SDHC Karte getestet.... Genau das
gleiche... Initialisieren klappt der rest jedoch nicht mehr :(
Hm, nach cmd0 ist die Karte ja noch nicht fertig initialisiert.
Da fehlt noch cmd1 bei Standard mmc/sd Karten, aber soweit wohl in
Ordnung.
Wenn das Initialisieren Klappt, muss eigentlich auch der Rest gehen,
weil ja die Kommunikation soweit schon klappt.
Was bekommst du denn auf ein cmd17 nach der Initialisierung zurück?
Quasi nach so einem Kommando:
Ok, das Problem ist,
wenn fat_loadFatData false zurück liefert, funktioniert mmc_read_sector
nicht richtig. Sonst würde die Fat Initialisierung durchlaufen.
Was du da in der write command geändert hast ist letztens erst
rausgeflogen, muss aber wohl doch bei einigen Karten sein.
Hab aber auch nicht so recht eine Idee warum read sector nicht
funktionieren sollte...
Grüße
Hmmm was würdest du an meiner stelle tun?
Andere lib verwenden?
Alles neu schreiben?
Debuggen? wenn ja wo?
Ich blick da langsam echt nicht mehr durch... hab jetzt schon sooo viel
energie in diese dooofe SD karte investiert :(
Hoffe jemand hat nen geistesblitz :P
Wenn du die Möglichkeit hast, versuch mal ein paar unterschiedliche
Karten, vielleicht ne kleine SD oder MMC Karten oder so. Ich mach mir
mal Gedanken was man da machen kann.
Also immer Stück für Stück probieren bis man an die Stelle kommt wo es
hakt.
Wenn die Initialisierung wirklich richtig geklappt hat, sollte der Rest
kein Problem sein.
Grüße
Ok vielen dank für deine Hilfe :)
Ich hoffe gemeinsam kriegen wir raus was da schiefläuft :)
Meld dich sobald dir was durch den kopf gegangen ist :)
Also bei anderen karten ists genau das selbe...
Ich werd nochmal versuchen mit dem Debugger was rauszukriegen
Danke schonmal
Morgen Zerrome...
Ich hab kleinere neuigkeiten...
So wies aussieht liegt das problem beim Schreiben eines blockes...
Wen ich nach dem senden der Daten die nächsten bytes empfange, kommt nie
das Response byte zurück... also hier:
1
//Fehler beim schreiben? (Data Response XXX00101 = OK)
Moin :)
Schön das es Fortschritte gibt.
So wie ich das grad sehe, ist das wohl eine Lücke in der Spezifikation
?!?
Ich habe mal ein Bild angehangen und die Stelle über die wir reden Rot
markiert. Da ist Tatsache eine Lücke wo die Spezifikation nix zu sagt.
Werde damit mal ein wenig rumprobieren. Seltsamerweise habe ich hier
eine Toshiba SDHC die nicht meckert und mehrere SD/MMC Karten die das
alles so schlucken. Seltsame Sache.
Werde heute abend genaueres sagen können.
Grüße
Hab das problem lösen können
>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>//CRC-Byte schreiben> mmc_write_byte(0xFF); //Schreibt Dummy CRC> mmc_write_byte(0xFF); //CRC Code wird nicht benutzt> //Fehler beim schreiben? (Data Response XXX00101 = OK)> 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...>while((mmc_read_byte()&0x1F) != 0x05);
Ich kann nun also problemlos Sektoren lesen und schreiben...
Doch nun habe ich ein anderes Problem
Wen ich nun load_Fat_Data ausführe, dan belibt er bei dieser Zeile
hängen:
1
mmc_read_sector(secOfFirstPartition,fat.sector);// lesen von fat sector und bestimmen der wichtigen berreiche
Genauer gesagt im code beim mmc_read_sector nach dem senden der Adresse
welche ich folgendermassen verpacke:
1
addr=addr<<9;//addr = addr * 512
2
3
cmd[1]=((addr&0xFF000000)>>24);
4
cmd[2]=((addr&0x00FF0000)>>16);
5
cmd[3]=((addr&0x0000FF00)>>8);
6
cmd[4]=(addr&0x000000FF);
Er bekommt nach dem mmc_send_command ein 0x00 zurück
jedoch sendet danach die Karte kein startbyte (0xFE).
Hier der Code abschnitt:
1
if(0!=mmc_write_command(cmd))return0;
2
3
//Wartet auf Start Byte von der MMC/SD-Karte (0xFE/Start Byte)
4
while(a!=0xFE){
5
a=mmc_read_byte();
6
};
Wenn ich beim ursprünglichen code
1
mmc_read_sector(secOfFirstPartition,fat.sector);// lesen von fat sector und bestimmen der wichtigen berreiche
secOfFirstPartition durch 0 ersetze, dann kommt er durch... (der rest
klappt dann jedoch dennoch nicht!)
Somit hat es denke ich mit der übergebenen Adresse zu tun
secOfFirstPartition ist beim übergeben 0x6964654d
Bei meiner Karte Steht übrigens im Sektor 0 der MBR also wo auch MSDOS
FAT16 etc.. steht...
Vor diesem Ausschnitt wird der Sektor 0 geladen. dann werden 4 Bytes ab
Stelle 454 des Sektors rausgepikt und geprüft ob sie 0x6964654d
entsprechen. Wenn ja, ist bereits der MBR geladen. Wenn nicht steht auf
secOfFirstPartition die Sektor Nummer mit der die 1. Partition beginnt.
Wenn du jetzt aber versuchst Sektor Nummer 0x6964654d = 1768187213 zu
laden wirst du warscheinlich Pech haben weil es den Sektor nicht gibt...
Diese Funktion ist so richtig. Wenn es da Probleme gibt, vermute ich
immer noch Probleme bei deinen MMC/SD Routinen zum lesen.
Grüße
Ah was mir grad einfällt, für welche Plattform portierst du das? Ist das
ein Big Endian System? Wenn nicht gibt das dann Probleme wegen den
ganzen void Pointern und der Art und Weise wie die benutzt werden...
Sooo eeendlich :)
Also wegen Big Endian...
Ich verwende einen STM32F103RB Cortex M3 Controller...
Der ist laut ST standardmässig im little endian format kann jedoch beim
Resetten auf big endian gestellt werden...
Was genau ist eigentlich big und little endian?
Es hat endlich geklappt :)
Ich kann nun Dateien lesen und schreiben :)
Vielen Dank an alle!!!
Ich werde ein ZIP schnüren und es in der section zur verfügung
stellen...
Das war jetzt echt ein riesen energie aufwand.. hat viel nerven
gekostet...
Dies war nun das letzte problem