Lector de tarjetas SDXC con LPC1822

0

en mi aplicación tengo un lector de tarjetas SD que utiliza el microcontrolador NXP LPC1822. Funciona muy bien con todas las tarjetas SD y SDHC que he probado hasta ahora. Lo único que no funciona es SDXC.

Ya contacté con algunos Distribuidores y FAE de NXP sobre ese problema, pero todo lo que pudieron decir fue "Aún no hemos probado SDXC en un microcontrolador". Así que primera pregunta: ¿hay alguien en el Universo SE que ya haya hecho eso? No importa si con NXP u otros.

Más información sobre mi solicitud:

Es básicamente un lector de tarjetas SD "tonto". Solo canalizo las solicitudes procedentes de una máquina con Windows 7 a través de USB (MassStorageDevice of LPCUSBLib) y SCSI a la interfaz de la tarjeta SD. Todos los datos solicitados se conectan de nuevo a través de USB al host. Así que no hay sistema de archivos FAT ni manejo de datos en mi controlador. Simplemente paleando masas de bytes. Uso LPCOpen (muy modificado para obtener un mejor rendimiento) para hablar con la interfaz de la tarjeta SD. Esto funciona perfectamente como ya se ha dicho.

Cuando conecto una tarjeta SDXC de 64 GB, se enumera y se muestra en el explorador de Windows como una tarjeta SDHC sin formato con 32 GB. Si lo formulo, obtengo una tarjeta SDHC de 32 GB que normalmente se puede utilizar.

Siguiente pregunta:

No soy miembro de la Asociación SD, así que lo único que tengo es la especificación simplificada. Y esto no dice nada de SDXC. Debido al comportamiento mencionado anteriormente, me pregunto si hay algunas banderas de bit de estado que identifican que una tarjeta sea sdxc. hay un poco para sdhc, pero no puedo encontrar nada acerca de xc.

    
pregunta jwsc

2 respuestas

2

Lo verifiqué con mi cliente, tengo permiso para publicar el error.

La funcionalidad SDXC con los controladores LPCOpen y LPC18xx / LPC43xx sufre un error en sdmmc_18xx_43xx.c. También encontré el mismo error en las implementaciones para LPC17xx, por lo que es seguro asumir que NXP tiene ese problema en todas las implementaciones de interfaces de tarjeta SD. La versión actual de LPCOpen que estoy viendo es la 2.15 para LPC18xx.

Alrededor de la línea 228 en sdmmc_18xx_43xx.c hay esto:

c_size = prv_get_bits(48, 63, (uint32_t *) g_card_info->card_info.csd) + 1;

Esto debería extraer información de tamaño del registro CSD de la tarjeta SD. De acuerdo con la Especificaciones de SD, Parte 1, Especificación simplificada de capa física, versión 4.10 , en la página 122:

la información de C_SIZE no abarca desde el bit 48 hasta el bit 63. Se extiende desde el bit 48 hasta el bit 69. Esto significa que el NXP Lib elimina los bits más altos de la información de tamaño. Esto funciona bien para tarjetas SD de hasta 32 GB, pero si tiene tarjetas más grandes, tiene un tamaño truncado que hace que el controlador de Windows asuma que algo tiene que estar mal con la tarjeta.

Si cambia la línea anterior 228 en sdmmc_18xx_43xx.c a lo siguiente, las tarjetas SD más grandes también funcionan bien:

c_size = prv_get_bits(48, 69, (uint32_t *) g_card_info->card_info.csd) + 1; //BUGFIX

¡Arregla tu software, NXP!

EDIT:

Debido a la solicitud, mostraré otro error en la biblioteca: la función Chip_SDMMC_GetDeviceSize() devuelve un entero de 32 bits con signo. Este número entero se desbordará con tarjetas de más de 4 GB. Una solución alternativa sería cambiar el valor de retorno a 64 bits sin firmar, o solo usar Chip_SDMMC_GetDeviceBlocks() .

    
respondido por el jwsc
2
  

La tarjeta SDXC de 64 GB, se enumera y se muestra en el explorador de Windows como una tarjeta SDHC sin formato con 32 GB [...]

Comprueba el código de almacenamiento masivo USB. Puede haber otro límite.

  

[...] especificación simplificada. Y esto no dice nada sobre SDXC.

Descargue una copia actualizada de sdcard.org. Las versiones más recientes tienen información sobre SDXC en ellas.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas