Ocasionalmente, el primer byte de datos de una tarjeta SD SPI leído es malo

7

El dispositivo que estoy desarrollando es un complemento de almacenamiento en tarjeta SD para una computadora retro, la tarjeta SD SanDisk Ultra II de 1.0 GB en un zócalo de tarjeta SD (no tengo idea si la marca es importante, simplemente es lo que Tengo).

La tarjeta SD es el único dispositivo en el bus SPI; un cambiador de nivel asegura que la tarjeta reciba señales de 3.3 V; MISO se alimenta a través de un interruptor de bus a un FPGA de 3.3 V. El FPGA implementa un mecanismo de registro de cambios cronometrado, que se sincroniza ocho veces, desviando los datos de salida a MOSI y capturando los datos de entrada de MISO.

Muchos dispositivos conectados a muchas computadoras funcionan bien.

Yo uso el modo SPI. Inicializo la tarjeta, la acelero a 4 MHz y envío el comando de lectura de bloque único.

Observo que el primer byte de datos devuelto ocasionalmente tiene una corrupción de un bit. Normalmente, el bit 0 se establece cuando no debería estarlo, pero también he visto el bit 1 cuando no debería estarlo. Todos los demás bytes son perfectamente correctos, siempre.

Se probaron varios dispositivos y se conectaron a varios equipos host. El problema solo se vio con un dispositivo conectado a una computadora. El dispositivo o la computadora funcionan bien con otras computadoras o dispositivos.

Sospeché errores de tiempo en mi código de controlador, pero estoy seguro de que he hecho los ocho ciclos de reloj (enviando 0xFF , leyendo el primer byte de datos) antes de leerlo.

Me pregunto, ¿esto podría estar relacionado con el voltaje o los niveles de corriente, que podrían ser sutilmente diferentes según el dispositivo o la computadora?

Me pregunto si una tarjeta SD de repente necesita extraer una corriente adicional, justo cuando comienza a generar datos.

    
pregunta Andy Key

1 respuesta

5
El análisis

con un analizador lógico USB barato a 16MHz mostró que en ocasiones parecía haber solo 7 ciclos de reloj agrupados. Desde el hardware VHDL, sé que esto es imposible: una vez que se inicia una transferencia de bytes, intercambiará bits en los siguientes 8 relojes.

Teoricé que había ruido en la señal SCLK, lo que provocó un reloj que fue demasiado rápido para que lo viera el analizador, y demasiado rápido para que la computadora se activara, pero que la tarjeta SD realmente cambió un poco.

Así que agregué la lógica de desconexión a la fuente de la señal SCLK, y el problema desapareció.

Nota al margen: la computadora host es una computadora retro que funciona a 4MHz. es probable que una cierta cantidad de ruido en el reloj no sea visible para la mayoría de los componentes de esa computadora, pero para mi complemento moderno basado en FPGA (que puede ejecutar fácilmente diseños con fMax > 50MHz), esas cosas de repente se convierten en un problema.

Gracias a los que han respondido.

    
respondido por el Andy Key

Lea otras preguntas en las etiquetas