Ich verwende FatFS . Nachdem ich das Karteninitialisierungsproblem gelöst habe, versuche ich, Sektor 0 zu lesen, aber die Karte gibt Junk-Daten zurück.
Dies ist mein Lesevorgang: Ich sehe, dass die Karte mit 0x00 geantwortet hat, was bedeutet, dass sie gelesen wird, um Daten zu liefern.
Natürlich sieht mein nullter Sektor, der mit einem USB-Kartenleser ausgegeben wurde, korrekt aus:
Dies ist mein Debug-Protokoll (CMD-Nummern sind in Hex):
388:mmc_disk_initialize: SPI initialized
366:send_cmd_INTERNAL: call 401 Cmd 00 response 01
403:mmc_disk_initialize: CMD0 okay
366:send_cmd_INTERNAL: call 405 Cmd 08 response 01
406:mmc_disk_initialize: CMD8 okay - this is an SDv2 card
409:mmc_disk_initialize: CMD8 response 000001AA
413:mmc_disk_initialize: Waiting for leaving idle state
366:send_cmd_INTERNAL: call 309 Cmd 37 response 01
366:send_cmd_INTERNAL: call 415 Cmd 29 response 01
366:send_cmd_INTERNAL: call 309 Cmd 37 response 01
366:send_cmd_INTERNAL: call 415 Cmd 29 response 01
366:send_cmd_INTERNAL: call 309 Cmd 37 response 01
366:send_cmd_INTERNAL: call 415 Cmd 29 response 01
366:send_cmd_INTERNAL: call 309 Cmd 37 response 01
366:send_cmd_INTERNAL: call 415 Cmd 29 response 01
366:send_cmd_INTERNAL: call 309 Cmd 37 response 01
366:send_cmd_INTERNAL: call 415 Cmd 29 response 01
366:send_cmd_INTERNAL: call 309 Cmd 37 response 01
366:send_cmd_INTERNAL: call 415 Cmd 29 response 00
419:mmc_disk_initialize: Checking CCS bit in OCR
366:send_cmd_INTERNAL: call 420 Cmd 3A response 00
423:mmc_disk_initialize: CMD58 response 80FF8000
452:mmc_disk_initialize: Init okay
40:disk_initialize: status = 0
58:disk_read_INTERNAL: Call from 27
366:send_cmd_INTERNAL: call 494 Cmd 11 response 00
60:disk_read_INTERNAL: buf=20001588 sector=0 count=1
27:test_task1: Read result 0
28:test_task1: dump len 512
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FE000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000000000000000001B3DAFBF000080
0101008311F4FD3E000000C2EF3A0000
00000000000000000000000000000000
00000000000000000000000000000000
Was sollte ich überprüfen/ändern, damit der Lesebefehl zuverlässig funktioniert?
Was Sie vom µC ablesen, ist der MBR (Master Boot Record) mit der Partitionstabelle. Diese Daten können Sie auf einem Betriebssystem wie Windows ohne Administratorrechte nicht lesen! Die Daten des USB-Kartenlesers zeigen deutlich den ersten Sektor des "Laufwerks" (Partition) - der nicht Sektor 0 (Null) ist.
Einige Hex-Editoren können Ihnen den MBR anzeigen, wenn Sie als Administrator gestartet werden - aber Sie müssen das richtige physische Gerät verwenden, das keinen Laufwerksbuchstaben hat.
fdisk
ob Sie den richtigen Gerätenamen verwenden?0
mit dem 0x00
Byte nach dem 0xFE
Token beginnt.Schauen wir uns die Dumps an:
Ihr SD-Karten-Hex-Dump zeigt die korrekte Befehlsausführung. Daten beginnen mit Datentoken (FE), und wie TurboJ sagte, scheint es eine Partitionstabelle zu sein, aber es gibt einige Artefakte darin (1B3DAFBF0000). Informationen zum ersten Band von MBR:
80 01 01 00 83 11 F4 FD 3E 00 00 00 C2 EF 3A 00
Aktive Partition, Typ 83 (native Linux-Partition), Volume First LBA ist 0000003E und Größe 003AEFC2 (1.977.582.592 ~ 2 GB Partition).
Fazit: Es ist schwer, eine Schlussfolgerung zu ziehen. Lesen Sie die gesamte SD-Karte auf Ihrem Windows/Linux-Host (z. B. mit Image Writer) und sehen Sie sie sich mit dem Hex/Binär-Viewer an. Die Struktur der Karte kann durch ein spezielles Werkzeug erstellt werden, daher kann ihr Inhalt unvorhersehbar sein. Aber was ich mit Sicherheit sagen kann, dass der Bootsektor, den Sie im ersten Dump angegeben haben, unter normalen Umständen nicht dem Volumen des Geräts mit MBR im zweiten Dump entsprechen sollte.
Das Problem war, dass ich anfing, Daten, die direkt nach 0x00 von der Karte kamen, als Sektornutzlast zu behandeln. Ich habe das behoben, indem ich nach dem Senden des Befehls zuerst auf 0x00 gewartet habe und dann auf 0xFE (das ist der Beginn des Datenbytes) gewartet habe. Jetzt kann ich das Dateisystem lesen und Dateien auflisten.
JimmyB