Forum: Mikrocontroller und Digitale Elektronik SDCard antwortet immer mit 0x20 auf CMD24


von Oliver L. (ollil)


Lesenswert?

Hallo zusammen,

eigentlich habe ich keine Probleme mit meinem AVR in Zusammenarbeit mit 
SD und SDHC Karten. Ich habe hier jedoch eine Apacer 60x 2GB, welche 
sich als SDHC ausgibt (CMD8 wird beantwortet mit 0x01), aber bei CMD24 
z.B. nur bei den Adressen 0x000, 0x200, 0x400 als Response 0x00 sendet. 
Alle anderen Adressen zwischen 0x000 unx 0x400 werden mit 0x20 (Address 
Error) beantwortet (höhere Adressen habe ich nicht getestet).

Wenn ich die Karte jedoch als SD-Karte betreibe, also die SDHC-Auskunft 
einfach ignoriere funktionieren die Schreibzugriffe ohne Probleme.
1
CMD: 5800cffe005a
2
Response: ff, 00,

Wenn die Karte eine SDHC-Karte wäre, könnte ich diese Adresse ja gar 
nicht adressieren (cffe00 -> wäre Block-Nr. 13630976, wäre irgendwo bei 
6.5GB).

https://github.com/OlliL/P8000_WDC_Emulator/blob/master/P8000_WDC_Emulator/wdc_drv_mmc.c

Es geht um die Funktionen
mmc_cmd() und mmc_write_sector().
Die SDHC Abfrage ist in mmc_do_init().

Weiss einer was hier los ist - warum behauptet die Karte SDHC zu sein? 
Was mache ich bei der CMD8 Auswertung falsch? Meine DSLR und Laptop 
können mit der Karte problemlos arbeiten (aber die machen sicherlich 
SDIO).

Lt. Amazon ist die auch SDHC:
http://www.amazon.com/Apacer-60X-Secure-Digital-Memory/dp/B000RWGD02

Ich habe aber z.B. eine 8GB SDHC Disk von PNY die Problemlos im 
SDHC-Modus arbeitet.

von Jim M. (turboj)


Lesenswert?

Wieso spuckt die überhaupt eine 1 bei CMD8 aus? Die Checksumme ist 
flacsh,
ich benutze für CMD8 mit 0x1AA Parameter die Checksumme "0x87". 
Eventuell ist die Karte aber schon im SPI Mode ohne Checksumme, da geht 
das je nach Typ auch gut.

Die SD ist sicher eine SD 2.0 Card, die will u.U. normale Addressen und 
keine 512 Byte Blockaddesse sehen.

Siehe folgenden Code in MMC_disk_initialize():
https://github.com/ajhc/demo-cortex-m3/blob/master/lpcxpresso-lpc1769/lpc1769/fat_sd/spi_sd_lpc17xx.c

Dort gibts für SD 2.0 Karten CMDD0->CMD8 -> ACMD41 ->CMD58. Das CMD58 
Kommando gibt im OCR ein Bit zurück ob die Karte 512 Byte oder 1 Byte 
Addressen haben will.

von Oliver L. (ollil)


Lesenswert?

Jo das mit dem CRC ist in der Tat "falsch" - macht aber komischerweise 
keinen Unterschied. Habe es nun mal auf 87 gesetzt. Das mit CMD58 war 
der fehlende Hinweis.
Ich bin echt davon ausgegangen, SD 2.0 (SDHC) heisst automatisch 
blockweise Adressierung und nicht Byteweise.... Aber - es scheint echt 
so zu funzen:

Apacer 80, ff, 80, 00, ff, ff
1000 0000

PNY    c0, ff, 80, 00, ff, ff
1100 0000

Meine 8GB PNY liefert in Bit 7 1, meine Apacer 0. Und genau das ist das 
Bit laut deinem verlinkten code:
1
ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;

Sehr gut! :)

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
Noch kein Account? Hier anmelden.