¿Cuál es el cuello de botella de una tarjeta SD a una transferencia USB a través de un microcontrolador?

0

Estoy usando un microcontrolador (PIC32MZ) para transferir los datos de una tarjeta SD a USB, con esta configuración:

simular este circuito : esquema creado usando CircuitLab

Logré que todo funcionara con el framework Harmony v1.09, y pude obtener una velocidad de transferencia de aproximadamente 1.5 MBytes / s, lo cual es bastante bueno, pero ... cuando utilizo tarjetas SD con memoria grande, esta tasa aún parece ralentizar Por ejemplo, se requieren 6h para transferir 32GB !!!!

Mirando los componentes uno por uno, no puedo ver por qué la tasa de transferencia no es más alta:

  • La tarjeta real que estoy usando para mi prueba alcanzó la velocidad de 20 MBytes / s cuando la conecté a mi computadora. Probablemente usó 4 cables, pero luego sería de unos 5 MBytes / s en cada cable
  • El PIC puede admitir USB de alta velocidad, que tiene una velocidad de transferencia de 60 MB / s (480 Mbits / s)
  • El bus SPI entre la tarjeta y la micro está funcionando a 50MHz, lo que corresponde a una velocidad máxima de 6.25MBytes / s

¿Por qué no puedo acercarme al menos a 5 MBytes / s, que parece ser la tasa más baja del sistema? ¿Cuál es el cuello de botella aquí? ¿Es posible mejorarlo?

Hojas de datos:

pregunta Edesign

2 respuestas

1
  

El bus SPI entre la tarjeta y el micro funciona a 50MHz, lo que corresponde a una tasa máxima de 6.25MBytes / s

La especificación de la tarjeta SD solo permite hasta 25 MHz en modo SPI; no me arriesgaría a velocidades más altas en caso de que uno use tarjetas diferentes.

Pero esto podría producir unos 3MByte / sec. Tenga en cuenta que es posible que deba usar transferencias de múltiples bloques para obtener el máximo rendimiento, ya que de lo contrario habría espacios para las actividades de comando. La mayoría de los códigos de ejemplo de MCU solo usan transferencias de un solo bloque para simplificar.

    
respondido por el Turbo J
0

De acuerdo con Turbo J para acercarse a su máximo (spi limit) debe usar el bloque mutli rd / write.

La mayoría de los usb de middleware y código de ejemplo comúnmente hacen un paquete simple y bloquean la escritura de usb a sd. Para mantener la velocidad de datos completa en SPI y alcanzar el último% faltante, debe hacer acceso sd y usb en paralelo o siempre tendrá una brecha en SD que es el momento para que usb envíe la siguiente parte de los datos de escritura (a una velocidad de datos de 480MBps) . Es un 5% -10% de la pérdida de ancho de banda de SPI, suponiendo 25-50 Mbps.

Una interfaz de controlador sd de 4 líneas de datos será de gran ayuda, pero su mcu no lo tiene, supongo.

tenga en cuenta que las tarjetas SD pueden ser lentas, no espere obtener 6MB / s de un dispositivo de clase 2, incluso la clase 6 puede hacer solo 6MB / s.

    
respondido por el Michel Sanches

Lea otras preguntas en las etiquetas