Problemas al leer el Delkin Micro SD de 16 GB con SPI

3

He estado trabajando con tarjetas SD y tarjetas micro SD durante un tiempo.

Estoy usando Part1_Physical_Layer_Simplified_Specification_Ver6.00 para referencia.

Soy capaz de hacer una inicialización exitosa de la tarjeta, leer y escribir para otros micro SD como ATP 8GB SLC, Panasonic 8GB SLC, etc. Sin embargo, cuando estoy usando Delkin 16 GB SLC (y también Swissbit 8GB SLC), aunque tengo éxito en la inicialización y escritura de la tarjeta, cuando intento leer, no obtengo el token de inicio 0xFE y hay alrededor de 512 bytes de datos de correo no deseado antes de que vuelva a ser normal.

El patrón es el siguiente (utilizando el analizador SPI de Beagle):

Después de escribir lo siguiente (solo se muestran los primeros 24 bytes, pero el patrón es el mismo):

Siestoyescribiendo0xA0.Porfavor,consultelasiguienteimagen:

Sicambiolosbytesescritos,losbytesleídostambiénsecambianytambiénhaycorrespondenciaunoaunoentrelosbytesescritosylosbytesleídos.Perolosbytesnosonlosmismos.

EstoyverificandoquelosdatosseescribencorrectamenteusandoellectordetarjetasSDconelvisorhexadecimalHxD.

Paraelprimercaso:

Paraelsegundocaso:

NoparecequeelvoltajedelatarjetaSDestévariando,yaqueloverifiquéenelosciloscopioypermanecea3.3voltiosdurantelalectura.

EstoyutilizandoelLaunchpadF28377sdeTIcomomicrocontrolador.

Megustaríarecibirtuscomentarios.¿Quépuedotratarexactamentedesolucionaresteproblema?

Edit1:SeobservaexactamenteelmismocomportamientoparaSwissbit8GBSLC.LasmismasimágenesdearribasepuedenaplicaraSwissbit.LosdatosleídosparaSwissbitsonlosmismosqueparaDelkin.ElrelojSPIantesdelainicializaciónesde200kHzydespuésdequelainicializaciónsecambiaa1MHz.

Edit2:mirelasimágenesdelosciloscopioacontinuación(hecambiadolafrecuenciadelreloja225KHz):

Edit3: la segunda imagen del osciloscopio sigue inmediatamente a la primera imagen del osciloscopio. La primera imagen es el comando de lectura y la respuesta, mientras que la Segunda imagen está enviando 0xFF y esperando el token del bloque de datos de inicio, que es 0xA8 en la segunda imagen, ya que 0xFE se desplaza en 2 bits. Puede mirar los datos hexadecimales decodificados del osciloscopio en la parte inferior de las imágenes del osciloscopio. Son los mismos que los datos de depuración de mi analizador Beagle SPI Analyzer, por ejemplo 2 (donde escribo 0xA0 y leo 0x28).

Edit4: De acuerdo con la sugerencia de Anonymous, he actualizado mi código de modo que antes de cada comando y después de CS LOW, envío 8 relojes antes de cualquier transmisión SPI prevista real. Después de completar la respuesta de comando, envío 8 ciclos de reloj justo antes de CS HIGH y 8 ciclos de reloj justo después de CS HIGH. La finalización de la respuesta del comando en el caso de Lectura SD significa cuando recibimos el último byte CRC. La finalización de la respuesta del comando en SD Write significa cuando la tarjeta deja de enviar la señal de ocupado después de escribir. Del mismo modo, he aplicado a otros comandos también. Además, no hago CS HIGH hasta que se complete el comando y su respuesta. Por ejemplo en el caso de lectura SD, hago CS LOW y envío el comando, obtengo la respuesta del comando, obtengo el token de bloque de inicio (0xFE), obtengo el CRC y luego hago el CS HIGH.

Gracias.

    
pregunta Ankit Srivastava

1 respuesta

2

Creo que deberías haber notado el patrón:

fe 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 01 02 03 ...

cambiando esta secuencia dos bits a la derecha, obtienes

ff 80 00 40 80 c1 01 41 81 ...

Así que exactamente la secuencia que tienes. Ha agregado dos bits de repuesto en la secuencia, y los bytes se desalinearon. ¿Por qué? Sin diagramas exactos que muestren el reloj no se puede decir. Lo más probable es que tenga problemas con la sincronización del reloj o de los datos.

Esta desalineación puede ocurrir ya sea en escritura o lectura, por lo que puede parecer que usted escribe una secuencia incorrecta porque su comando de escritura tiene bytes desalineados, y luego lee esa secuencia incorrecta (por supuesto), o simplemente puede ser un problema de comando de lectura . La conclusión de que usted debe verificar qué tarjeta SD ha escrito realmente en ella, utilizando otro dispositivo que funcione (p. Ej., La PC descargue su tarjeta en el archivo y verifique la imagen), antes de entrar en el comando de lectura o escritura de depuración ejecución.

Editar: mirando los diagramas de alcance, veo / recomiendo lo siguiente:

  1. cambia la polaridad del reloj cuando está inactivo a bajo. Actualmente es alta. Consulte aquí . En otras palabras, use el modo SPI 0;
  2. antes de que comience el comando (antes de poner el primer 0 en la línea MOSI) realice 8 ciclos de reloj de repuesto con CS bajo. Lo ideal es que hagas lo mismo al final del comando: coloca 8 relojes de repuesto con CS bajo cuando se completa el comando y otros 8 relojes de repuesto con CS alto;
  3. no estoy seguro de entender la segunda foto: ¿envía FFs como comando a la tarjeta? Y parece que la tarjeta informa continuamente 0x05 (comando no válido).

Edición 2:

  

La segunda imagen del osciloscopio sigue inmediatamente a la primera imagen del osciloscopio.

Tenga mucho cuidado al deseleccionar la tarjeta: sus imágenes muestran que usted emite un comando a la tarjeta, la deselecciona elevando el CS alto y luego la vuelve a seleccionar enviando continuamente 0xFF a la tarjeta. Parece que la tarjeta no entiende eso, y envía 0x28s de vuelta, que en realidad son 0x05 - la respuesta de "comando inválido" R1 cambió. Solo hay circunstancias específicas en las que puede deseleccionar la tarjeta, se explica en la especificación SD simplificada y sigue un protocolo muy específico:

  

Cuando la tarjeta está señalizada como ocupada, el host puede deseleccionarla (elevando el CS) en cualquier momento. La tarjeta lanzará la línea DataOut un reloj después de que el CS esté alto. Para verificar si la tarjeta aún está ocupada, es necesario volverla a seleccionar mediante la confirmación (bajo) de la señal CS. La tarjeta reanudará la señal de ocupado (bajando el valor de DataOut) un reloj después del borde descendente de la CS.

Con respecto a mi segundo comentario

  

Además, su comentario 2, ¿es necesario para todos los comandos? Actualmente, solo he aplicado tu sugerencia al comando de lectura.

Los ciclos de repuesto, aunque tomarán algún tiempo, asegurarán que la tarjeta haya completado / cancelado correctamente la operación anterior y esté lista para la siguiente. Así que te recomiendo que lo implementes para todos los comandos si es posible.

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas