Pregunta

Estoy usando un tarjeta microSD en un diseño integrado. 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).

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 -> Aceptar

  2. CMD8 (Argumento 0x000001AA, CRC 0x87) -> respuesta 0x01 0x000001AA -> significa que es SDC V2 + tarjeta, el rango de tensión de 2,7 V - está soportado 3,6 V -> OK

Entonces debería enviar el comando ACMD41, pero al enviar el CMD55 (argumento 0, 0 CRC) que debe preceder CMD41, recibo respuesta 0x05 -> Comando ilegal. También he intentado enviar CMD1 (para tarjetas MMC), pero le da un comando no válido respuesta similar. El código funciona bien con mi Sandisk 2 GB tarjeta microSD.

¿Cómo puedo solucionar este problema?

¿Fue útil?

Solución

Me parece haber encontrado el problema. Cuando se calcula el CRC correcto para CMD55 y mando que en lugar de un CRC ficticia, el comando es aceptado (0x01 resultado). Si nos fijamos en la especificación de la capa física en la sección 7.2.2 , se dice explícitamente que:

  

La interfaz SPI se inicializa en el modo de CRC OFF en defecto. (A excepción de los comandos CMD8 y CMD0).

Esto no parece ser el caso con esta serie de tarjetas Transcend, violando de esta manera la especificación. También en caso de un error de CRC de la respuesta debe ser 0x09 en lugar de 0x05. He tratado de convertir de forma explícita la comprobación CRC con CMD59, pero eso no parece ayudar.

=> El cálculo de la CRC correcta para (todos?) Los comandos hace que el trabajo de la tarjeta.

Estoy en contacto con el soporte de Transcend acerca de esto. Si me entero de algo útil Yo te conozco aquí.

Tenga en cuenta que he usado otros 2 GB Transcend cartas antes, pero fueron hechos en Taiwan, mientras que el nuevo se hizo en Corea (y parece ser una tarjeta de Samsung (MMAGR02GUDCA)).

Otros consejos

Yo tenía casi el mismo tema. Cuando se envía ACMD41, envié CMD55 seguido por CMD41. La respuesta de CMD55 era 0x01, lo que indica estado de reposo y en funcionamiento el proceso de inicialización (esto es normal, creo). CMD41 respondería con 0x05, lo que indica comando ilegal. Resulta que mi tarjeta en particular hace la comprobación CRC por defecto, incluso en modo SPI, y misreports errores de CRC como comandos ilegales (es decir, no se sigue la especificación SD). Cuando se calcula 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á desactivado y asegurarse de que se calcula el CRC correcto para cada trama de comando. De lo que puedo decir, algunas tarjetas de desactivarlo por defecto en el modo SPI y otros permiten que, a pesar de que la especificación SD indica que debe estar desactivado por defecto en el modo SPI excepción de CMD8.

Usted dijo que utilizó CRC 0 para el mandato que ha fallado. Asumo que significaba que ha enviado todo el último byte como 0x00. Tenga en cuenta que la CRC7 sólo los primeros 7 bits del último byte - el último bit llamado end bit siempre debe ser 1. Así que si usted fuera a enviar 0x00 como el último byte, con 0 como el último bit, el fracaso sería comprensible, e incluso el código de error tendría sentido. Si envía 1 como el último bit, que debería funcionar, es decir. usar algo como 0x01 o 0xFF como el último byte.

Es normal, es probable que la bomba de carga interna que se utiliza para hacer tensión de borrado que lleva más tiempo de lo habitual para estar listo ... hay que insistir en el combo CMD55 + ACMD41 hasta que finaliza la inicialización.

El CMD58 también podría ayudarle a comprobar si se está suministrando los niveles de voltaje correcto (a veces tienen problemas tomas de contacto).

Envío CMD0 con selección de chip (0) por sí solo no inicializar la tarjeta en modo SPI. Esto sólo se establece el modo SPI. La tarjeta no se ha inicializado hasta que vuelva ACMD41 aceptados. Entonces CRC está desactivado por defecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top