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.