¿Restablecimiento completo para la tarjeta SD interconectada con FPGA?

Así que pude conectar con éxito una tarjeta SD Sandisk con Spartan 3 FPGA (usando verilog). La tarjeta después del encendido se inicializa correctamente y es capaz de leer y escribir el sector de datos correctamente. El único problema que queda es que después de encender si presiono el botón de reinicio, la tarjeta se cuelga y deja de funcionar. Tampoco he podido averiguar qué significa un restablecimiento completo para la tarjeta SD. ¿Debería ser reinicializado de alguna manera? ¿Qué comando debo enviar a la tarjeta para eso? Cualquier ayuda es apreciada.

¿SPI o interfaz nativa?
Debería haber mencionado ... es la interfaz SPI.

Respuestas (2)

Tendrá que simular su código Verilog o usar el analizador para ver las cosas que suceden en el sistema en vivo.

En mi opinión, solo hay dos circunstancias en las que la tarjeta SD aparece "colgada":

  • mala implementación de la especificación, cuando la tarjeta no entiende lo que está pasando o no puede entender que el comando anterior debe cancelarse. Sin embargo, la tarjeta debe decirle algo que no sea el 1 durante la ejecución de estos comandos; por ejemplo, durante la lectura de múltiples bloques, se transmite CRC, que contendrá ceros, durante la escritura de múltiples bloques, el host debe transmitir CRC; de lo contrario, la tarjeta responde con error, que también contendrá 0 Su tarea aquí es verificar el conjunto de comandos de la tarjeta SD que usa su controlador y ajustar la secuencia de inicialización (número de ciclos de reloj libres antes de continuar con CMD0) en consecuencia;

  • su máquina de estado FPGA falla después de presionar restablecer. Por ejemplo, el reloj deja de funcionar en el pin de entrada del reloj de la tarjeta SD, MOSI se atasca, etc. información en la línea MOSI.

Una vez que se enciende e inicializa una tarjeta SD, pero luego reinicia su FPGA, es probable que el código inicie una nueva inicialización de la tarjeta ya inicializada. La interfaz SD no tiene ninguna línea de reinicio especial. El único restablecimiento completo en SD es el reinicio de encendido, por lo que la mejor manera de llevar una tarjeta SD al estado preinicializado es apagar y encender.

Entonces, hablando puramente en términos de codificación Verilog, ¿qué debo poner en la if(!reset)parte de mi código? Y si se presiona el botón de reinicio, ¿a qué estado debería ir mi FSM diseñado? ¿Inactivo o CMD0?
@Candy, dado que después de restablecer su FPGA probablemente borre toda la información de configuración/capacidad SD, etc., debe comenzar una nueva inicialización nueva, supongo que CMD0 + CS afirmó (para ingresar al modo SPI), luego CMD8, CMD58, etc. de acuerdo con protocolo de inicialización.
Probé la secuencia afirmada CMD0+CS, pero aún así la tarjeta SD se cuelga si se presiona el reinicio. ¡Estoy pensando en reiniciar de alguna manera y conectar la línea de alimentación de la tarjeta SD para que active el ciclo de alimentación inicial!
@Candy, no sé cómo se inicializa SD en Verilog. El protocolo es terriblemente complejo, tiene tantas condiciones/respuestas para analizar. Por lo general, se requiere una MCU considerable con cientos y cientos de líneas de código C++ para hacer este trabajo. ¿Qué versión de las especificaciones SD está implementando? 2? 3? 4? 5+?
Sí, es complejo, pero de alguna manera logré crear un código Verilog personalizado para él. La tarjeta es SDHC ver 2.
Entonces, lo que entendí es que no puede reiniciar una tarjeta SD que ya se ha inicializado una vez. Causarlo haría que la tarjeta SD entrara en un estado colgado. Solo puede reinicializar la tarjeta SD a través del reinicio de encendido.
@Candy, no estoy seguro de qué quieres decir con "colgar". ¿Tiene un ChipScope para depurar? Pero sí sé que si SD está configurado en modo SPI, solo el ciclo de encendido puede volver a ponerlo en el modo SD predeterminado.
¡Significa que la tarjeta SD deja de funcionar y las líneas MOSI y MISO se disparan!
@Candy, entonces, si su código no hace nada después del reinicio global del hardware, ¿cómo podría ser culpa de alguien?
En mi código después del reinicio del hardware, se supone que debe tener lugar la secuencia de inicialización, ¡pero la tarjeta no sigue eso después del reinicio!
@Candy, cuando está en modo SPI, una tarjeta SD siempre debe responder con algo. Aparentemente, su código no realiza un análisis completo de las respuestas. De nuevo, ¿qué herramientas tienes para depurar? ¿Tiene rastros de lo que está haciendo y cuál es la respuesta de la tarjeta a cada comando?