Soy nuevo en este foro, pero creo que este es el foro correcto para hacer mi pregunta. Estoy trabajando en un proyecto, donde necesito almacenar datos en una tarjeta SD. Yo uso un microcontrolador STM32L443. El controlador se comunica con otro dispositivo a través de la comunicación UART y guarda los datos en la tarjeta SD. El programa funciona correctamente con una tarjeta SD sin nombre (no conozco al fabricante, porque la obtengo de smoebody). Si cambio la tarjeta SD a una tarjeta SD de Sony de 8 GB o a una tarjeta SD de 4 GB de Maxell, el controlador no reconoce la tarjeta a veces. Algunas veces reconocen, algunas veces no reconocen. Cuando me conecto al depurador y voy al modo de depuración, el programa funciona bien y reconoce las tarjetas cada vez. En esta situación, no depuro el problema porque el problema no se presenta en el modo de depuración. Si el programa se ejecuta libremente sin el depurador, y tire del pin NRST manualmente a tierra para reiniciar el dispositivo, siempre reconozca las tarjetas. ¿Me puedes ayudar? Creo que el PIN NRST influye en ello, pero si este PIN influye, ¿por qué no influye en la tarjeta SD sin nombre?
El proyecto se generó desde STM32CubeMx y el entorno de programación es System Workbench para STM32. Sé que existe una pregunta similar en este foro, pero él responde que llegué allí, no me ayuda.
Por favor, ayúdame.
Gracias por las respuestas,
Szabolcs
P.s. Lo probé con un zumbador que fallaba el programa. Dentro de la función SD_PowerON existe un bucle while. Cuando las tarjetas no reconocen esto, el bucle se ejecuta infinitamente y nunca sale de allí.
/* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
while(validvoltage == 0)
{
if(count++ == SDMMC_MAX_VOLT_TRIAL)
{
return HAL_SD_ERROR_INVALID_VOLTRANGE;
}
/* SEND CMD55 APP_CMD with RCA as 0 */
errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
if(errorstate != HAL_SD_ERROR_NONE)
{
return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
}
/* Send CMD41 */
errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_STD_CAPACITY);
if(errorstate != HAL_SD_ERROR_NONE)
{
return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
}
/* Get command response */
response = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
/* Get operating voltage*/
validvoltage = (((response >> 31) == 1) ? 1 : 0);
}