¿Necesita ayuda con la inicialización de la tarjeta SD (sincronización de CLK)

2

EDIT 1: realicé cambios en el código como @Anonymous sugirió en la respuesta. Parece que ha mejorado, pero ahora parece que estoy recibiendo una respuesta incorrecta O LA TARJETA SD está poniendo la respuesta en el momento incorrecto.

El archivo de datos lógicos después de hacer los cambios como Anónimo sugirió en la respuesta

Estoy tratando de hacer bitbang en la interfaz SPI para la tarjeta SD. Al principio estaba confundido con respecto al modo a utilizar. así que le pregunté a con respecto al modo SPI aquí .

Estoy inicializando mi CLK como salida con un pull-up interno y un nivel bajo de conducción. Lo mismo ocurre con el MOSI. mientras que MISO es de entrada, levante hacia arriba y nada conduce eso.

Aquí está mi SPI Enviar y recibir.

int spi_bb_send(spi_bb_config_t *spi_conf,unsigned char data)
{
  int i;
  uint8_t data_in = 0;

  // send bits 7..0
  for (i = 0; i < 8; i++)
  {
      spi_pin_clear(&(spi_conf->clk));

      // consider leftmost bit
      // set line high if bit is 1, low if bit is 0
      if (data & (1<<7))
          spi_pin_set(&(spi_conf->mosi));
      else
          spi_pin_clear(&(spi_conf->mosi));

       data_in <<= 1;
      data_in |= gpio_read(&(spi_conf->miso));

      Delay(SPI_TIME_IN_US(SPI_FREQ_KHZ));

      // pulse clock to indicate that bit value should be read
      spi_pin_set(&(spi_conf->clk));
      Delay(SPI_TIME_IN_US(SPI_FREQ_KHZ));

      //read the miso
      //data_in |= gpio_read(&(spi_conf->miso));

      // shift byte left so next bit will be leftmost
      data <<= 1;       
  }

  Delay(SPI_TIME_IN_US(SPI_FREQ_KHZ));
  spi_pin_clear(&(spi_conf->clk));

  return data_in;
}

int spi_bb_recieve(spi_bb_config_t *spi_conf)
{
    return(spi_bb_send(spi_conf,0xFF));
}

El comando de inicialización se ha intentado de acuerdo con Documento de capa física proporcionado por SD ORD , es decir, siguiendo este flujo de inicialización.

Ademásdelflujodeinicializaciónqueencontréenesta Respuesta relacionada con el flujo de inicialización.

El problema al que me estoy enfrentando es que estoy recibiendo el comando y la respuesta para los primeros dos comandos correctamente, que son CMD0 y CMD8, y no estoy enfrentando ningún problema sin importar cuántas veces lo intente. Cuando envío el tercer comando, es decir:

1) CMD58 según el documento de la organización SD, no recibo ninguna respuesta. 2) CMD55, según la respuesta de la persona en este SE, parece que recibo la respuesta correcta, pero la respuesta que leí obtiene un 0xF antes de la respuesta, por lo que creo que la tarjeta SD comienza a responder desde la mitad del tiempo generado. Así que le conecté un analizador lógico y aquí están los resultados.

Comando 55:

Nohayrespuestaenelprimerreloj:

Respuesta:

Hay algunas ideas proporcionadas en el enlace para responder pegadas arriba que dicen:

  

Tenga en cuenta que las respuestas que tienen el MSB establecido pero no es 0xFF generalmente sugieren que su SPI tiene un cambio en la sincronización del reloj (como resultado de, por ejemplo, la caída de Vcc, que ocurre de manera rutinaria cuando está haciendo hotplugs de SD). Para solucionarlo, puede intentar reiniciar completamente el dispositivo (encender / apagar, desactivar / confirmar SS̲, etc.); por lo general funciona.

Pero no estoy haciendo ningún hotplug y ninguno de los reinicios / ciclos de alimentación funciona, entonces, ¿alguien puede ayudarme? ¿Por favor?

    
pregunta MaNyYaCk

1 respuesta

1

Sus diagramas muestran la selección de chips como siempre activa. No digo que no funcionaría de esta manera, pero al desactivar CS, en la mayoría de los casos, la tarjeta de señales que el host ha terminado con el comando.

La siguiente sugerencia es para usted: cambie la forma en que accede a la tarjeta:

  1. cuando se enciende, debe marcar CLK durante un tiempo (70 veces o algo así) para permitir que la tarjeta se inicialice y sincronice;
  2. cuando desea acceder a la tarjeta, tiene CS como alto (inactivo) y realiza 8 ciclos de reloj de repuesto en la tarjeta. MOSI se mantiene alto;
  3. luego obtienes un CS bajo, y realizas otros 8 pulsos de reloj de repuesto con MOSI alto;
  4. a partir del siguiente ciclo de reloj, cambia el comando a la tarjeta sd. Después de cambiar el comando, espere la respuesta como se indica en la documentación;
  5. después de obtener la respuesta requerida, NO desactiva CS y realiza 8 relojes de repuesto con MOSI alto;
  6. luego desactivas CS, y realizas otros 8 relojes de repuesto con CS high y MOSI high.
  7. y ya está listo para el siguiente acceso.
respondido por el Anonymous

Lea otras preguntas en las etiquetas