STM32 SDMMC y SDIO: ¿por qué solo una tarjeta SD como máximo?

Estoy escribiendo un controlador SDMMC para mi C ++ RTOS para microcontroladores y hay una cosa que realmente me desconcierta, lo que dificulta decidir sobre la jerarquía de clases. En el Manual de referencia para STM32F7 (pero lo mismo es cierto para otros chips, tanto para periféricos SDMMC como SDIO) puede leer lo siguiente desde el principio:

La versión actual de SDMMC solo admite una tarjeta SD/SDIO/MMC4.2 a la vez y una pila de MMC4.1 o anterior.

¿De dónde viene esta limitación? Según tengo entendido, las tarjetas SD (lo cual es difícil dada la "calidad" de la documentación SD), usar una tarjeta debería verse exactamente igual que usar diez: desde el punto de vista del periférico SDMMC, esto es solo enviar comandos, recibir respuestas y transferencia de bloques de datos. Para usar más de 1 tarjeta, solo necesita asegurarse de "seleccionar" la adecuada con CMD7 antes de hablar con la tarjeta seleccionada y eso es todo. Pero este proceso de selección se realiza completamente en software, en la capa superior al controlador SDMMC.

Aunque la primera página del capítulo sobre el periférico SDMMC dice que solo se puede usar 1 tarjeta SD, esto es lo que puede leer más:

39.4.4 Proceso de identificación de tarjetas

...

Para la tarjeta SD, el proceso de identificación comienza a la velocidad de reloj F od , y las unidades de salida de línea SDMMC_CMD son unidades de contrafase en lugar de drenaje abierto. El proceso de registro se realiza de la siguiente manera:

  1. El autobús está activado.
  2. El host de la tarjeta SDMMC transmite SD_APP_OP_COND (ACMD41).
  3. Las tarjetas responden con el contenido de sus registros de condiciones de funcionamiento.
  4. Las tarjetas incompatibles se colocan en estado inactivo.
  5. El host de la tarjeta SDMMC transmite ALL_SEND_CID (CMD2) a todas las tarjetas activas.
  6. Las tarjetas devuelven sus números únicos de identificación de tarjeta (CID) y entran en el estado de Identificación.
  7. El host de la tarjeta SDMMC emite SET_RELATIVE_ADDR (CMD3) a una tarjeta activa con una dirección. Esta nueva dirección se denomina dirección de tarjeta relativa (RCA); es más corto que el CID y se dirige a la tarjeta. La tarjeta asignada cambia al estado de espera. El anfitrión de la tarjeta SDMMC puede volver a emitir este comando para cambiar el RCA. El RCA de la tarjeta es el último valor asignado.
  8. El anfitrión de la tarjeta SDMMC repite los pasos 5 a 7 con todas las tarjetas activas.

Entonces, SDMMC solo admite una tarjeta, pero describen cómo detectar muchas...

Encontré alguna pista en la documentación SD mencionada:

4.3.11 Modo de alta velocidad (velocidad de interfaz de 25 MB/s)

...

Debido a que no es posible controlar dos tarjetas o más en el caso de que cada una de ellas tenga un modo de temporización diferente (modo predeterminado y de alta velocidad) y para satisfacer una temporización severa, el host debe manejar solo una tarjeta. La señal CLK/CMD/DAT se conectará 1 a 1 entre el host y la tarjeta.

Pero esto (según tengo entendido) afecta solo al modo de alta velocidad, puede ceñirse al modo de velocidad predeterminada, que es (sorprendentemente (; ) el modo predeterminado después de encender la tarjeta.

La razón por la que hago estas preguntas es porque no puedo decidir si debo modelar la jerarquía de clases con la suposición de que el periférico SDMMC ES la tarjeta de memoria, o tal vez ese periférico SDMMC debería estar representado por una clase dedicada "SD/MMC host", que puede asociarse más tarde con un objeto de tarjeta de memoria. El segundo modelo está mucho más cerca de la situación posible al usar tarjetas de memoria en modo SPI, donde puede tener tantas como desee conectadas al mismo bus SPI.

Gracias de antemano por cualquier información (;

Con toda probabilidad, el código del controlador simplemente no se escribió para poder admitir más de una instancia simultánea. Como ha observado, aparentemente no hay una razón técnica de hardware.
@brhans: el problema aquí es que el Manual de referencia para STM32F7 que mencioné es solo para la parte del hardware, no tiene nada que ver con la parte del software (que está completamente del lado de los desarrolladores).
Me perdí la parte en la que escribes los controladores tú mismo... en ese caso, ni idea.
Si es solo para que usted decida la jerarquía de clases, simplemente buscaría la solución más flexible. Es posible que más adelante desee portar su sistema a otro tipo de microcontroladores que no tengan esta limitación.

Respuestas (1)

Mi humilde 50ct (ya que acabo de investigar un problema con la señal CMD de la tarjeta SD): las tarjetas SD no tienen un modo de drenaje abierto, por lo que la especificación establece que (al menos) las líneas CMD para varias tarjetas deben separarse. Por lo tanto, podría ser posible controlar varias tarjetas cuando proporcione la lógica del multiplexor de señal CMD externamente, que necesita controlar en cada interruptor de tarjeta.

No sé si las líneas IO se pueden conectar entre sí. Tal vez.

La configuración del bus se realiza básicamente en el controlador MCI durante la Inicialización(), seguida de varias llamadas a Control() (activadas por la llamada fmount() del sistema de archivos). Ahí es donde se establecen la velocidad del bus, el modo de operación, etc. en los registros del procesador. Así que supongo que cuando quiera acceder a varias tarjetas, necesitará montar/desmontar la tarjeta respectiva entre los interruptores para configurar los registros correctamente.

Solo algunos pensamientos...

Aunque es difícil encontrar la especificación completa más reciente, puede buscar un manual de producto de tarjeta digital segura filtrado como este que contiene una versión anterior de la especificación completa. En él puede encontrar las secciones omitidas 3.2 "Topología de bus SD" y 3.4.3 "Carga de línea de señal de bus". El diagrama en 3.2 muestra líneas CMD y DAT separadas, pero también es posible usar un solo bus DAT en modo SD (no UHS o PCIE) siempre que se resuelvan los problemas de integridad de la señal.