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
- Junta: STM32F407ZGT6
- Tarjetas SD: MicroSD 32GB HCI y 256GB XCI + 4GB HC
- Formatos: FAT32, exFAT y exFAT
- Biblioteca FATFS: Olmo Chan
- Manipulador de bajo nivel: Aurelio Colosimo
- Inicialización a 400kHz y lectura/escritura a 4MHz
- Circuito para MicroSD (10k Ohms):