1 votos

SD FIFO no tiene datos disponibles cuando se monta con FATFS

Edición

Estoy intentando montar una tarjeta SD en mi STM32F407 con FATFS de Elm Chan usando SDIO y f_mount devuelve FR_DISK_ERR .

Desde allí se llama a la siguiente secuencia de funciones:

mount_volume() > check_fs() > move_window() > disk_read()

En última instancia, mi error reside en disk_read más concretamente, cuando el SDIO_STA_RXDAVL un poco de SDIO->STA nunca se levanta, lo que significa que no hay datos disponibles en el FIFO para ser leídos, como se comenta a continuación:

cmd = (count > 1) ? 18 : 17;
t = msTicks;
rd = 0;

SDIO->DCTRL = ((0b1001 << 4) | SDIO_DCTRL_DTDIR);
SDIO->DLEN = (512 * count);
SDIO->DTIMER = (400000);

sta = 0;
if (!send_cmd(cmd, sector, RESP_SHORT, &resp) || (resp & 0xc0580000))   /*!MOD REG?*/
    return RES_ERROR;
SDIO->ICR = (0xFF);
SDIO->DCTRL |= (SDIO_DCTRL_SDIOEN   |
                SDIO_DCTRL_RWSTART  |
                SDIO_DCTRL_DTDIR    |
                SDIO_DCTRL_DTEN
               );

while (elapsed(t) < 1000) {

    sta = SDIO->STA;

    if (sta & (SDIO_STA_DTIMEOUT | SDIO_STA_RXOVERR | SDIO_STA_STBITERR)) {
        err("%s SDIO_STA: 0x%08X\n", __func__, (uint)sta);
        break;
    }

    if (sta & SDIO_STA_RXFIFOE)
        continue;

    if (rd == 0 && !(sta & SDIO_STA_RXDAVL))
        continue;      //<<---No data available, so can't get to FIFO

    data = SDIO->FIFO; //<<---Never gets here

    buf[rd++] = data;
    buf[rd++] = data >> 8;
    buf[rd++] = data >> 16;
    buf[rd++] = data >> 24;

    if (rd == 512 * count)
        break;
}

if (rd < 512 * count || cmd == 18)
    send_cmd(12, 0, RESP_SHORT, &resp);

return SDIO->DCOUNT ? RES_ERROR : RES_OK; //<<---Returns ERROR

Creo que mis tarjetas SD responden bien, sobre todo porque el código devuelve qué tipo de SD es ( SD2 ) y el OCR ( 0x0080FFC0 ). También he comprobado CLK y CMD con el osciloscopio y parecen estar bien. Sin embargo, no hay actividad en ninguna de las líneas D[0:3].

¿Por qué me quedo atascado?


Configurar

1voto

Demonick Puntos 895

Mi problema fue con el hardware. Aunque no puedo precisar cuál era el problema, supongo que el adaptador de la SD estaba roto o tenía un pinout raro. Además, al tener sólo los GPIOs internos pull-ups ( 30k a 50k Ohms ) era suficiente y no necesitaba las resistencias físicas que añadía al circuito.

Además, mis puntos de ruptura generaban resultados extraños ya que la SD es un microprocesador en sí mismo. Por lo tanto, cada punto de ruptura influiría en los relojes y en los acopladores de la SD y estaban desordenando mi depuración. Una vez que los quité de en medio, la respuesta fue positiva usando la ranura de la SD embebida que venía con mi placa.

Otro problema que encontré fue que sólo se aceptaba la tarjeta FAT32. Las tarjetas ExFAT no eran reconocidas, devolviendo siempre FR_NO_FILESYSTEM . A continuación la salida de todas mis condiciones de prueba:

Tipo de tarjeta

Tipo de circuito

GPIO_PUPDR

Respuesta

FAT32

Circuito integrado

Pull-Up

FR_OK

FAT32

Circuito integrado

*Pull-No

FR_NOT_READY

FAT32

*Circuito adaptador de SD

Cualquier

FR_DISK_ERR

*ExFAT

Circuito integrado

Cualquier

FR_NO_FILESYSTEM

* Los principales factores que causaron errores en cada combinación

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X