7 votos

Ocasionalmente el primer byte de datos de una lectura SPI de una tarjeta SD es malo

El dispositivo que estoy desarrollando es un complemento de almacenamiento en tarjeta SD para un ordenador retro, tarjeta SD SanDisk Ultra II de 1,0 GB en un zócalo para tarjetas SD (no tengo ni idea de si la marca es significativa, simplemente es lo que tengo).

La tarjeta SD es el único dispositivo en el bus SPI; un conmutador de nivel garantiza que la tarjeta reciba señales a 3,3 V; MISO se alimenta a través de un conmutador de bus a una FPGA de 3,3 V. La FPGA implementa un mecanismo de registro de desplazamiento con reloj, que se sincroniza ocho veces, desplazando los datos de salida a MOSI y capturando los datos de entrada de MISO.

Muchos dispositivos conectados a muchos ordenadores funcionan bien.

Utilizo el modo SPI. Initalizo la tarjeta, la acelero a 4 MHz y envío el comando de lectura de un solo bloque.

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

Se probó la conexión de varios dispositivos a varios ordenadores anfitriones. El problema sólo se observó con un dispositivo conectado a un ordenador. El dispositivo o el ordenador funcionan bien con otros ordenadores o dispositivos.

Sospeché que había errores de sincronización en el código de mi 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 si esto podría estar relacionado con los niveles de tensión o de corriente, que podrían ser sutilmente diferentes según el dispositivo o el ordenador.

Me pregunto si una tarjeta SD tiene que consumir de repente una corriente extra, justo cuando empieza a emitir datos.

5voto

Sulaiman Puntos 16

El análisis con un analizador lógico USB barato muestreando a 16MHz mostró que ocasionalmente parecía haber sólo 7 ciclos de reloj agrupados. Por el VHDL del hardware, sé que esto es imposible - una vez que se inicia una transferencia de bytes, intercambiará bits en los siguientes 8 relojes.

Yo teoricé que había ruido en la señal SCLK, causando un reloj que era demasiado rápido para ser visto por el analizador, y demasiado rápido para que el ordenador lo captara, pero que la tarjeta SD sí intercambiaba un poco.

Así que añadí lógica deglitching a la fuente de la señal SCLK, y el problema ha desaparecido.

Nota al margen: El ordenador anfitrión es un ordenador retro que funciona a 4MHz. Una cierta cantidad de ruido en el reloj probablemente no es visible para la mayoría de los componentes de ese ordenador, pero para mi moderno complemento basado en FPGA (que puede ejecutar fácilmente diseños con fMax > 50MHz) tales cosas se convierten de repente en un problema.

Gracias a los que han respondido.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X