Grüße!
Ich arbeite im Zuge eines kleinen Projektes daran einen MP3 Player zu
implementieren. Dazu verwende ich folgende Komponennten:
SD Karte (<=2GB) im SPI Modus
µC: XC164CM Easy-Kit (Ein Übungsboard von Infineon)
ein Display
einen MP3 Decoder Chip.
Bis jetzt habe ich es geschafft, auf einem Steckbrett eine brauchbare
Schaltung zu erstellen (Versorgungsspannung der SD Karte ist stabil, es
wird über einen Pegelwandler 5V<->3.3V kommuniziert) und die SD Karte
korrekt zu booten (CMD0 , CMD55 , ACMD41).
Weiters ist es mir auch schon gelungen das CSD (Card Specific Data)
Register auszulesen (CMD9), sowie die Blocklänge von Lese- und
Schreiboperationen auf 512Byte zu fixieren (CMD16).
Der nächste logische Schritt war es, Daten aus der Karte auszulesen
(READ_SINGLE_BLOCK CMD17 , READ_MULTIPLE_BLOCK CMD18).
Ich habe bisher nur CMD17 implementiert, um zu sehen, ob die Karte mir
auch schon Daten sendet, und ich diese korrekt erkenne. Weiters wollte
ich mir auch schon einmal kurz den ausgelesenen FAT Table ansehen... Die
Karte wurde zuvor mit dem "sd-formatter"
(http://www.sdcard.org/consumers/formatter/) formatiert, es wurde 1 MP3
File draufgespielt (keine Ordner oder sonst was).
Soweit, so gut - nun zu meinem Problem. Ich nahm an, dass ich den Boot
Sector, bzw. erste FAT Daten bereits im allerersten Datenblock (Adresse
0x00000000 - 0x0001FF) finde. Allerdings bekomme ich als Rückmeldung von
der Karte einen haufen 0er (ca. die ersten 190) und dann folgende
Bytefolge:
0x02 , 0x0A , 0x00 , 0x06 , 0x3F , 0xFF , 0xBC , 0x87 , 0x00, 0x00 ,
0x00 , 0x39 , 0xE0 , 0x3A
Dies scheint mir aber nicht korrekt zu sein!
Weiters sind die nächsten paar Blöcke (3 oder 4) komplett leer (also 512
mal "0x00")
Das Kommando für die ersten 512Bytes an der Adresse 0x000000, welches
ich sende ist:
1 | ubyte CMD17[6] = {0x51,0x0,0x0,0x0,0x0,0x01};
|
FRAGEN:
-)Auf welcher Adresse finde ich den Boot-Sector, bzw. einen Verweis auf
die eigentliche FAT Tabelle normalerweise?
-)Sollte ich den sd formatter oder eine Windows Formatierung verwenden?
-)Berechnung des Parameters NAC: Es handelt sich um den "Timeout"
Parameter für das Lesen von Datenblöcken (Anzahl der Bytes, bis die
Karte Daten sendet, ab dem letzen Byte des Lesekommandos).
Laut einem im Internet kursierenden Datenblatt berechnet sich dieser zu:
NAC = 100((TAAC*fpp)+(100*NSAC))
Die Werte TAAC und NSAC erhalte ich aus dem CSD Register - allerdings
stimmt meine Berechnung von NAC mit der tatsächlichen "Totzeit" nicht
überein! - ich komme auf <10 Byte, real sind es jedoch 16Byte aufwärts.
Weiters wird NAC in der (sehr bescheidenen) freien SD Spezifikation
einfach als "the sum of TAAC and NSAC" beschrieben - wie berechnet sich
dieser Parameter nun?
Für Kommentare und Hilfe wäre ich sehr Dankbar!
MfG Eagle