2009-06-05 12 views
15

Estoy usando una tarjeta microSD en un diseño incrustado. La tarjeta está conectada a un microcontrolador utilizando la interfaz SPI. Funcionó bien para todas las tarjetas que he usado antes, pero ahora mi nueva tarjeta no se inicializará. La tarjeta es una tarjeta microSD Transcend 2   GB (TS2GUSD).Inicialización de una tarjeta microSD utilizando una interfaz SPI

Después de enviar el tren inicial del reloj para cambiar al modo SPI, hago lo siguiente:

  1. CMD0 (Argumento 0, CRC 0x95) -> respuesta 0x01 -> OK

  2. CMD8 (argumento 0x000001AA, CRC 0x87) -> respuesta 0x01 0x000001AA -> significa que es SDC V2 + tarjeta, el rango de voltaje de 2,7 V   - 3,6   V es compatible -> OK

Entonces debería enviar el comando ACMD41, pero al enviar el CMD55 (argumento 0, CRC 0) que debe preceder a CMD41, obtengo la respuesta 0x05 -> Comando ilegal. También traté de enviar CMD1 (para tarjetas MMC), pero da una respuesta comando ilegal similar respuesta. El código funciona bien con mi tarjeta microSD Sandisk 2   GB.

¿Cómo puedo solucionar este problema?

Respuesta

14

Parece que he encontrado el problema. Cuando calculo el CRC correcto para CMD55 y lo envío, en lugar de un CRC ficticio, se acepta el comando (resultado 0x01). Si nos fijamos en the physical layer specification en la sección 7.2.2, que dice explícitamente que:

La interfaz SPI es inicializado en el modo OFF CRC en default. (a excepción de los comandos CMD0 y CMD8).

Este no parece ser el caso con esta serie de tarjetas Transcend, violando así las especificaciones. También en caso de un error CRC, la respuesta debería ser 0x09 en lugar de 0x05. Intenté desactivar explícitamente la verificación de CRC con CMD59, pero eso no parece ayudar.

=> El cálculo del CRC correcto para (¿todos?) Comandos hace que la tarjeta funcione.

Estoy en contacto con el soporte de Transcend sobre esto. Si aprendo algo útil, lo sabré aquí.

Tenga en cuenta que he usado otras 2   GB tarjetas Transcend antes, pero fueron hechas en Taiwán, mientras que la nueva se hace en Corea (y parece ser una tarjeta Samsung (MMAGR02GUDCA)).

+1

¡agradable! ¡Bien, entiendes el problema! ... Estoy aturdido porque parece indicar que los lectores de tarjetas USB no usan comandos combinados. Puede/debe marcar su respuesta como la correcta. BTW, sandisk, transcent, etc no tienen fundiciones de semiconductores ... hacen controladores y servicios de diseño digital para sus productos (simplemente no fabrican las fichas) – jpinto3912

+0

Tuve que esperar 48 horas para marcar mi respuesta como correcta por alguna razón. Creo que los lectores de tarjetas USB usarán la interfaz "real" de la tarjeta de memoria SD (tiene velocidades más altas). En ese modo, debe usar CRC y no hay problema. – Ron

+1

¿Alguna vez recibió una respuesta de Transcend? Supongo que enviaste todo el último byte como ceros, haciendo que el bit final sea incorrecto. La tarjeta se conformaría a la especificación e incluso el código de error tendría sentido. (Dejé una respuesta detallando esto un poco más, en si todavía está interesado en la causa después de ... 4 años) –

1

Es normal, es probable que la bomba de carga interna utilizada para hacer que el voltaje de borrado tome más tiempo de lo normal esté listo ... debe insistir en el combo CMD55 + ACMD41 hasta que finalice la inicialización.

El CMD58 también podría ayudarlo a verificar si está suministrando los niveles de voltaje correctos (a veces los enchufes tienen problemas de contacto).

+1

La tarjeta gira indefinidamente en el CMD55 con el resultado 0x05. He esperado más tiempo y nada cambia. CMD58 tiene el mismo resultado 0x05. Mientras tanto, he identificado el problema, vea la respuesta a continuación. – Ron

2

Tuve casi el mismo problema. Al enviar ACMD41, envié CMD55 seguido de CMD41. La respuesta para CMD55 fue 0x01, indicando el estado inactivo y ejecutando el proceso de inicialización (esto es normal, creo). CMD41 respondería con 0x05, lo que indica un comando ilegal. Resulta que mi tarjeta particular hace la verificación CRC por defecto, incluso en modo SPI, y no informa correctamente los errores CRC como comandos ilegales (es decir, no sigue la especificación SD).Cuando calculo el CRC correcto, funciona bien. Aquí está el código de cálculo CRC7 he usado, que ha funcionado bien para mí:

https://github.com/hazelnusse/crc7

A menos que haya tenido la precaución de desactivar la comprobación CRC, creo que es probablemente la mejor manera de asumir que no está desactivada y hacer Asegúrese de calcular el CRC adecuado para cada marco de comando. Por lo que puedo decir, algunas tarjetas lo desactivan de manera predeterminada en el modo SPI y otros lo habilitan, aunque la especificación SD indica que debe estar deshabilitado por defecto en el modo SPI a excepción de CMD8.

+0

En caso de que sea un tipo extremadamente curioso, como yo, y todavía se preocupe por esto después de un año: ¿Recuerda lo que envió como el último byte que contiene CRC? Si lo envió como todos ceros, tenga en cuenta que el último bit no es realmente parte de la CRC y siempre debe ser 1. (También dejé una respuesta con un poco más de detalle sobre esto) –

2

Dijiste que usaste CRC 0 para el comando que falla. Supongo que quisiste decir que enviaste el último byte como 0x00. Tenga en cuenta que el CRC7 es solo los primeros 7 bits del último byte; el último bit llamado end bit siempre debe ser 1. Entonces, si estuviera enviando 0x00 como el último byte, con 0 como último bit, la falla sería comprensible, e incluso el código de error tendría sentido. Si envía 1 como último bit, debería funcionar, es decir. utilice algo como 0x01 o 0xFF como último byte.

1

El envío de CMD0 con la selección de chip (0) por sí sola no inicializa la tarjeta en el modo SPI. Esto solo establece el modo SPI. La tarjeta no se inicializa hasta que se acepten ACMD41. Entonces CRC está desactivado por defecto.

Cuestiones relacionadas