Problema de inicialización de la tarjeta SD - CMD8 respuesta incorrecta

4

Estoy intentando conectar una tarjeta microSD a una placa de microcontrolador (FRDM-KE06Z) utilizando código FatFS . Solo modifiqué piezas SPI para mi aplicación. Además de indagar en el código FatFS, también revisé esta guía

Cuando envío CMD0 a la tarjeta, la respuesta es correcta:

PerocuandoenvíoCMD8paraidentificarlatarjeta,larespuestaestotalmenteerrónea(despuésde0xFFdeberíahaberalgoconMSBpuestoacero):

He comprobado:

  1. Diferentes modos SPI 0/1/2/3, velocidades de reloj 75kHz y 150kHz
  2. Dos tarjetas SD diferentes (SanDisk Ultra HC 1 de 32 GB y un SanDisk antiguo de 2GB)
  3. Si envío ciclos de reloj ficticios después de la alimentación, también espero un par de segundos antes de hacer algo con la tarjeta
  4. El cableado es corto, por lo que la integridad de la señal no debería ser el problema
  5. Lo mismo sucede con y sin el analizador lógico adjunto
  6. Enchufando la tarjeta después de que se hayan inicializado los pines de MCU, espere unos segundos y comience el código
  7. La sincronización CS es muy relajada (un par de milisegundos antes de que se envíen los datos, muchos milisegundos entre CMD0 y CMD8)

¿Cuál puede ser la razón por la que mis tarjetas no responden correctamente a CMD8, mientras responden correctamente a CMD0?

    
pregunta filo

1 respuesta

2

Hace aproximadamente un año, diseñé la configuración de FPGA y el controlador de escritura para la tarjeta SD, y detecté un conjunto de problemas muy similar. Mis soluciones a las respuestas incorrectas / mal comportamiento de la tarjeta SD fueron simples:

  • cuando finaliza el comando, no detiene el reloj justo después de completar el comando, sigue suministrando el reloj durante 8 o 16 ciclos de repuesto, con CS activo o inactivo. Creo que proporciono 8 cuando CS aún está activo, y otros 8 después de que se desactiva;
  • cuando inicia el comando, hace lo mismo que antes: antes de activar el CS, suministra 8 relojes de repuesto, después de activar el CS, también suministra 8 relojes de repuesto y, a continuación, inicia el comando, que luego se detecta cuando el primer bit del octeto es 0 (bit de inicio de comando).

La señal del reloj es necesaria para que la tarjeta complete algunas de sus operaciones internas (el ejemplo más obvio es la recuperación del error de datos / comando). Si su diseño proporcionara reloj sin interrupciones, no detectaría este problema.

Actualización: mirando las formas de onda proporcionadas, creo que debería tener MOSI alto cuando CS no está activado y cuando el comando no está en progreso. Mire aquí , puede que le resulte útil (sin embargo no es suficiente) diseñar la interfaz de la tarjeta SD.

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas