
En uno de mis proyectos, había una necesidad de grabación secuencial de conjuntos de datos digitalizados de 3 canales del ADC. Los resultados de la medición tuvieron que almacenarse a una velocidad de 6 KB / s, mientras que la duración del ciclo de recolección de datos podría ser de un día o más. Por lo tanto, la cantidad total de información que debía almacenarse era de 500 MB o más. Como dispositivo de almacenamiento, se decidió elegir una tarjeta SD.
La tarea se complicó por el hecho de que las características de diseño del dispositivo creado no permitían extraer una tarjeta para leer datos. El controlador XMega128A4U , en el que se estaba implementando la tarea en ese momento, no tenía soporte de hardware SDIO, pero se le permitió trabajar con la tarjeta a través de la interfaz SPI, cuyo ancho de banda era bastante posible escribir a la velocidad requerida, pero leyendo una cantidad de datos en la computadora a través de la cadena de la tarjeta SD a través de SPI -> controlador -> USB-Com convertidor era bastante triste y tomó un tiempo considerable.
Después de pensarlo (e intentos fallidos de overclockear ligeramente el paquete anterior), se decidió utilizar un controlador de lector de tarjeta SD de hardware, para el cual se eligió el chip GL823 que admite USB 2.0. Ahora era necesario proporcionar un acceso separado a la tarjeta SD desde el controlador a través de SPI durante la recopilación de datos y desde la computadora a través de SDIO, a través de GL823 durante la lectura de alta velocidad. Esta separación se implementó utilizando dos multiplexores 2x1 de 4 canales.

Las líneas de los interruptores U2, U3 con el prefijo STM están conectadas al controlador, las líneas con el prefijo SD están conectadas a la tarjeta SD. Para controlar el circuito, se utilizan las señales SD2MCU, cambiando la tarjeta SD entre MCU y GL823 y GL823_PWR, cambiando la alimentación de GL823 a través del mosfet .
Inicialmente, consideré este enfoque como una especie de "muleta", pero, para mi gran sorpresa, resultó ser bastante funcional para mí y fue confirmado por la práctica de operar con éxito el dispositivo durante varios años.
Además, en los siguientes desarrollos basados en STM32F407 , que tiene soporte SDIO para acceder a la tarjeta, y la posibilidad de elevar USB 2.0 HS MSD (aunque a través de una interfaz ULPI paralela), se considera la posibilidad de usar una solución GL823 basada en bus .
Utilizando un paquete de STM32F407 con un PHY USB3300 externo, fue posible alcanzar una velocidad de lectura de tarjeta de ~ 41 Mbit / s, mientras que cuando se usa un lector de tarjetas de hardware, la velocidad alcanza ~ 150 Mbit / s, todas las demás cosas son iguales. Las mediciones se realizaron leyendo un archivo de 128 MB de una tarjeta SD formateada en FAT32. Ambos enfoques tienen sus propios matices de uso, pero me parece que ambos tienen "derecho a la vida". En cuanto a los matices: en mi caso, en la próxima iteración del desarrollo de este dispositivo, el hardware debía colocarse en una placa de 26 mm de ancho.
El diseño de PCB para el LQFP100 del caso STM32F407 en este caso es algo difícil, pero su "hermano menor" STM32F405 en el caso LQFP64 incluso se localizó. Pero STM32F405 carece de ULPI, por lo tanto, USB 2.0 HS no está disponible para ello, y la implementación de MSD FS pierde mucho en la velocidad de lectura de datos de la tarjeta. Usando la misma solución descrita anteriormente, puede obtener una velocidad suficiente de acceso a SD desde la computadora mientras lee datos del dispositivo.
Me alegraría si mi experiencia es útil para alguien.