PIC32 a SDkarta - PIC32MX695F512H: Unsupported MMC or SD 1.x

Ahoj, pracuji s procesorem PIC32MX695F512H a snažím se na něm inicializovat SD kartu. Protoře se mi to nedaří tak jsem si zprovoznil DEBUG UART a tak mi procesopr posílá do terminálu stav inicializace. Zde přidávám log:

Initializing Media
Media successfully processed CMD0.
CMD8 Unsupported: Media is most likely MMC or SD 1.x device.
CMD1 failed.
CMD1 response R1 byte = FF
CMD9 Successfully processed: Read CSD register.
CMD9 response R1 byte = 00
CSD data structure contains: 0000000000000000000000000000000000000000
Returning from MediaInitialize() function.

Nedokážu přijít na to kde je problém, protože SPI komunikace funguje bez problémů. Ověřil jsem, že data která tam posílám tam skutečně jdou. Také vím, že na jiném procesoru res. PIC32MX795F512L ta karta funguje bez problémů a podporuje i režim CMD8. Takže už v tomhle logu co posílám už na třetím řádku musí dojít k nějaké chybě při inicializaci.

Nemátě někdo podobné zkušenosti? Dík

:arrow_right: administrator: přejmenováno z "PIC32 a SDkarta"

To je sice hezké, že tam ty data po SPI posíláš,
ale jak je to s daty v opačném směru?
Podle mého odhadu bude chyba už v inicializaci (CMD0).
Po úspěšné inicializaci by měla karta vrátit hodnotu 0x01 (IDLE).
Zkontroluj nejdříve tuto hodnotu.

Dále být tebou zkontroluji napájení té SD karty.
Během inicializace si totiž dokáže špičkově cucnout až 150mA.
Pokud jí to však stabilizátor nepustí, tak se nemusí karta
správně inicializovat a bude ti dělat psí kusy.

Pokud odešlu SendMediaSlowCmd(GO_IDLE_STATE, 0x0); tak mi do response.r1._byte naplní 0x01…toto je podle mě ještě správně.
Pokud odešlu SendMediaSlowCmd(SEND_IF_COND, 0x1AA); tak mi do responde naplní už toto:
address = 0xA0000504, response.r1._byte = 0xFF
address = 0xA0000504, response.r2._word = 0x00FF
address = 0xA0000504, response.r7.bytewise._byte = 0xFF
address = 0xA0000508, response.r7.bytewise.argument._returnVal = 0xFFFFFFFF
address = 0xA0000504, response.r7.bitwise.bits.IN_IDLE_STATE = 0x01
address = 0xA0000504, response.r7.bitwise.bits.ERASE_RESET = 0x01
address = 0xA0000504, response.r7.bitwise.bits.ILLEGAL_CMD = 0x01
address = 0xA0000504, response.r7.bitwise.bits.CRC_ERR = 0x01
address = 0xA0000504, response.r7.bitwise.bits.ERASE_SEQ_ERR = 0x01
address = 0xA0000504, response.r7.bitwise.bits.ADDRESS_ERR = 0x01
address = 0xA0000504, response.r7.bitwise.bits.PARAM_ERR = 0x01
address = 0xA0000504, response.r7.bitwise.bits.B7 = 0x01
address = 0xA0000508, response.r7.bitwise._returnVal = 0xFFFFFFFF

ten ILLEGAL_CMD mi zřejmě nabourá podmínku správné inicializace, protože musí být nula.

IN_IDLE-STATE, ELLEGAL_CMD, atd… jsou významy jednotlivých bitů odpověďi r1.
V tomto případě to znamená, že máš někde prů…r.
Tipuji, že sis to napájení překontroloval, tak budu pokračovat dál.

Další možností je, že tato karta je jedna z těch co nesnášejí CMD1.
(osobně jsem na žádnou takovou nenarazil, ale údajně takové existují)
V tom případě budeš muset preferovat příkaz ACMD41.
Jak na to:
1.) Příkaz CMD1 nějkým způsobem deaktivuj.
2.) Zašli příkaz CMD55 pro ohlášení, že bude následovat specifický příkaz.
3.) Zašli ACMD41 pro aktivaci karty.

Oba příkazy vracejí jednobytovou odpověď r1.
(u CMD55 by odpověď měla být opět 0x01,
po ACMD41 by se však každopádně měla změnit na 0x00)
Jde v podstatě o ekvivalent příkazu CMD1 avšak určený pro SD karty.
CMD1 byl původně určen čistě pro MMC karty.

P.S. CMD55 by mohl být pojmenován jako APP_CMD
a ACMD41 jako SEND_OP_COND.