Hallo zusammen,
ich hab' mein Programm nun so weit, dass ich mehr oder weniger mit der
SD-Karte plaudern kann. Initialisierung funzt, SET_BLOCKLEN funzt, CID
und CSD lesen geht auch. Allerdings bereitet mir das Lesen der
eigentlichen Daten Probleme. Das Startbyte (0xFE) bekomme ich, aber
danach kommen nur noch Nullbytes und zwar genau so viele, wie der Block
eben lang ist. Als Blocklänge habe ich 128 Bytes eingestellt, es
funktioniert aber auch mit 512 (Default-Einstellung) nicht. Die Karte
ist mit FAT32 formatiert, ob mit oder ohne Dateien, immer nur
Nullbytes. An Adressen hab' ich bereits alle Sektoren (128 Bytes) bis
ca. 50 probiert. Irgendwo da drin müsste doch wohl der Inhalt von der
FAT liegen. Ausprobiert hab' ich eine 512MB-Karte von SanDisk und eine
128er von Apacer, bei beiden das gleiche Ergebnis.
Kennt das jemand und/oder woran kann das liegen, bzw. was muss man tun,
damit's funktioniert?
Die betreffenden zwei Funktionen sehen so aus:
1 | U08 SD_Read_Block(U08 *CMD, U08 *Buffer, U16 Bytes)
|
2 | {
|
3 | if (SD_Write_Command(CMD) != 0) {
|
4 | SD_Disable();
|
5 | return CMD[0];
|
6 | }
|
7 |
|
8 | //Wait for Startbyte (0xFE)
|
9 | U16 Timeout = 0;
|
10 | while (SD_Read_Byte() != 0xFE) {
|
11 | if (Timeout++ > 1000) {
|
12 | SD_Disable();
|
13 | return CMD[0];
|
14 | }
|
15 | }
|
16 |
|
17 | //Read the block
|
18 | for (U16 i = 0; i < Bytes; i++) {
|
19 | *Buffer++ = SD_Read_Byte();
|
20 | }
|
21 |
|
22 | //Discard CRC
|
23 | SD_Read_Byte();
|
24 | SD_Read_Byte();
|
25 |
|
26 | SD_Disable();
|
27 |
|
28 | return 0;
|
29 | }
|
30 |
|
31 | U08 SD_Read_Sector(U32 Address, U08 *Buffer)
|
32 | {
|
33 | U08 CMD[] = {0x51, 0x00, 0x00, 0x00, 0x00, 0xFF};
|
34 |
|
35 | Address <<= 7; //Address = Address * 128
|
36 |
|
37 | CMD[1] = (Address & 0xFF000000) >> 24;
|
38 | CMD[2] = (Address & 0x00FF0000) >> 16;
|
39 | CMD[3] = (Address & 0x0000FF00) >> 8;
|
40 |
|
41 | return SD_Read_Block(CMD, Buffer, 128);
|
42 | }
|
Danke schonmal im Voraus für alle (konstruktiven) Antworten!