Hallo, ich möchte gerne von meiner SD-Karte blockweise (denke das sind 512B/Block) Daten lesen. Ich habe das Olimex AT91SAM7P256. Auf dem Board ist schon der SD-Karten-Slot vorhanden. Angesteuert wird das Ganze über SPI. Dazu habe ich mir den Democode von Olimex heruntergeladen und mal probiert, den ersten Block zu laden. Vorher habe ich das Buffer-Array geleert. Es kommt scheinbar was an (Daten im Array nach Leerung und Lesen des ersten Blocks). Allerdings nicht das, was ich in HxD sehe, wenn ich die Karte direkt am PC ansehe. (eigentlich sollte so FAT16-Gedöns zu begin stehen). Nur nochmal zur Erinnerung: mir reicht das blockweise Lesen. Ich brauche kein Filesystem. Nachdem der Buffer (512B) nur am Anfang Zeichen aufweist, habe ich das gefühl, dass es sich ähnlich zu RS232 verhält, wenn ich eine zu hohe oder zu niedrige Baudrate einstelle. Gibt es bei SPI auch sowas ähnliches wie ne Baudrate, die ggf. falsch eingestellt sein könnte? Hat jemand ein Minimalbeispiel um SD zu initialisieren und den ersten Block von Karte zu lesen? Ansonsten bin ich froh um jeden Hinweis. Hat es irgendwelche Auswirkungen, wenn ich das Board zum Entwickeln via USB am PC hängen habe? Weil bei mir ist es so, dass ich immer via SAM-BA die Binaries "hochlade" und dann im Speicher ausführe, um nicht jedesmal das EEPROM zu programmieren. Viele Grüße, Peter
Frohe Weihnachten an alle! ich habe jetzt mal die MMC-Funktionen aus dem MP3 Playerprojekt hier getestet. Leider ohne Erfolg. Was ich getestet habe:
1 | // Initialisieren
|
2 | uart0_init(); |
3 | disk_initialize(); |
4 | |
5 | // Buffer löschen
|
6 | for (x=0; x<512; x++) |
7 | {
|
8 | mmc_buffer[x] = 255; |
9 | }
|
10 | |
11 | // ersten Block lesen
|
12 | if (disk_read(mmc_buffer, 0, 1) == RES_ERROR) |
13 | {
|
14 | uart0_puts("error"); |
15 | }
|
16 | else
|
17 | {
|
18 | uart0_puts("ok"); |
19 | }
|
Leider kommt im Buffer lange 00 00 00 00 und zwischendurch sind ein paar andere Werte vorhanden (die allerdings so nicht auf der SD-Karte sind). Die disk_read gibt "ok" zurück. Wenn ich die Karte rausziehe und das Selbe mache, kommt richtigerweise "error" an. Hmm, weiß jetzt nicht so recht, wie ich weiter vorgehen kann. Habe schon mit verschiedenen Einstellungen in den MMC-Funktionen "gespielt". Allerdings hat sich nichts geändert. Kann mir bitte jemand einen Tip geben, welche Schritte ich unternehmen könnte, um den Block zu lesen? Kann es sein, dass der AT91SAM7S256 sich anders verhält, wenn das Programm aus dem SRAM ausgeführt wird und die USB-Verbindung zum PC besteht. Muss die MMC-Funktion im EEPROM ausgeführt werden? Kann ich an SPI auch so ne Art Baudrate einstellen? Würde gerne ein paar "Schrauben" zum drehen haben... Ciao und schöne Feiertage! Peter
Hallo NG, das Thema SD-Karte scheint auch "gegessen" zu sein. Allerdings habe ich noch ein paar Fragen zu dem Thema offen: @Michael: habe den Link von Dir probiert. Was ich seltsam fand: die SD-Karte hat genau das Selbe wie bei meinem ursprünglichen Code zurückgegeben. Im Nachhinein nach ein paar Tests fand ich heraus, dass die Rückgabe wohl richtig war. Hier nun zu meiner Frage: Wieso bekomme ich wenn ich den 1. Sektor (oder Block oder wie man das auch immer nennen möchte) mit sd_readsector(y, mmc_buffer, 0, 0); y ist ja scheinbar LBA? Hat das was besonderes zu bedeuten? Fängt doch bei 0 an, oder? in den Buffer lese etwas anderes, als ich mit HxD sehe, wenn ich die Karte "Low-Level" öffne und mir 0x00000000 - ansehe? Das Komische ist, dass scheinbar ganz zu Beginn Daten auf der Karte stehen, die ich mit HxD so nicht auf der Karte finden konnte. Ich hab mal testweise ein paar mehr Blöcke eingelesen und via Terminal zugesehen. Dann kamen auch irgendwann die Daten, die mir HxD als Sector 0 verkaufen möchte. Wie kann denn sowas sein? Die Blöcke auf der SD-Karte sind doch immer 512 Bytes groß, oder? Und die liegen doch nacheinander auf der Karte, oder ist das nicht so? Falls ein Block von der SD-Karte als fehlerhaft markiert wird, würde der dann überhaupt gelesen werden können? (Ich frage nur, um auszuschließen, dass die ersten Ausgaben, die ich über HxD nicht finden konnte nicht etwa fehlerhafte Blöcke sind) Also es wäre sehr nett, wenn der Ein oder Andere hier noch ein wenig Licht ins Dunkle bringen könnte. Vielen Dank, Peter
>in den Buffer lese etwas anderes, als ich mit HxD sehe, wenn ich die >Karte "Low-Level" öffne und mir 0x00000000 - ansehe? Lies mal was zum Thema Bootsektor, MBR Master Boot Record und Partitionstabelle. Dann wird dir einiges klar.
Hallo Holger, ich glaube nicht, dass mich diese Antwort zufrieden stellt. Will mich auch gar nicht beklagen, aber für mich hört sich das unterm Strich so an wie "machs richtig, dann funktionierts auch". Damit kann ich leider nix anfangen, sorry. Daten hin oder her. Auf der Karte sollten Daten stehen. Sektor 0 in HxD ist scheinbar nicht das Gleiche wie Sektor 0 via AT91SAM7 - Code. Gruß, Peter
>Sektor 0 in HxD >ist scheinbar nicht das Gleiche wie Sektor 0 via AT91SAM7 - Code. Genau so ist es;) Der AT91SAM7 liest den richtigen Sektor 0. HxD den Sektor 0 des logischen Laufwerks. Das ist aber nicht unbedingt Sektor 0 der SD sondern oft irgendwas so ab Sektor 32. Wie gesagt, mach dich mal zu den Themen die ich oben angegeben habe schlau.
Hallo Holger, wenn das so ist, wie Du es geschrieben hast, dann reicht mir das schon als Info, da ich sowieso nur Sektoren lesen möchte. Wenn die dann auch noch "in Reihe" liegen, dann ist das alles OK für mich. Ich will ja kein Filesystem. Kennst Du zufällig ein PRG, das auf einer Windows-Kiste auch "den richtigen Sektor 0" lesen kann? Danke und Viele Grüße, Peter
Nimm das Programm "Winhex", damit kannst du dir unter Windows sowohl physikalische Laufwerke als auch logische Laufwerke anschauen. Was du suchst ist ein Editor, der physikalische Laufwerke anzeigen kann. Es macht aber schon Sinn, sich mal mit der Materie Filesystem zu beschaeftigen, auch wenn du es vielleicht nicht brauchst.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.