FatFs: ¿Por qué no puedo leer correctamente el sector 0?

1

Antecedentes: estoy usando un nRF52832 Kit de desarrollo con esta tarjeta microSD en este panel informativo . La tarjeta se alimenta a 3 V (he probado que funciona con el regulador del kit de desarrollo y una fuente de alimentación externa). Estoy usando resistores de la serie de 22 ohmios en las líneas SCLK, SDO, SDI, CS y un resistor pullup de 10k ohmios en el SDO.

Estoy usando FatFs para montar la tarjeta SD y escribir en un archivo. Puedo inicializar la tarjeta, pero mi llamada a f_open devuelve el código de error 13 ( FR_NO_FILESYSTEM ).

Después de algunas excavaciones, pude determinar que FR_NO_FILESYSTEM se está devolviendo desde una llamada a find_volume , que intenta encontrar una partición FAT en la unidad. Entiendo que esto significa leer el sector 0 de la tarjeta y leer los bytes 510 y 511. Para un volumen FAT válido, esos bytes deben ser 0x55 0xAA. Sin embargo, mirando las transacciones SPI, mi tarjeta parece devolver 0x00 0x00.

He intentado formatear mi tarjeta SD como FAT32 usando el Formateador de tarjetas SD , la herramienta de formato de Windows, La Utilidad de Disco de OS X, Ubuntu gparted y dd, pero para asegurarme, usé Hex Workshop para leer el sector de arranque de la tarjeta SD en mi computadora portátil y vi a 0x55 0xAA en la posición apropiada:

EstoyusandounSaleaeLogicProparacapturarlasecuenciaSPI.Noestoysegurodecuáleslamejorformadecompartirlacapturacompleta,peroaquíhayunatablaquemuestratodoslosvaloresdecodificados: enlace

Puede ver que la inicialización funciona bien (responde a CMD0, CMD8, etc.), y hacia el final devuelve 0xFE (¿entiendo que indica un token de datos válido?), pero luego 0x00 0x00 en lugar de 0x55 0xAA.

Mi ffconf.h está aquí: enlace - Mi sdmm.c se modificó ligeramente para usar la API SPI de Nordic ( nrf_drv_spi_transfer ) y función de retardo ( nrf_delay_us ). Estoy usando un pin GPIO separado como mi CS ( nrf_gpio_pin_set y nrf_gpio_pin_clear ).

¿Alguien tiene alguna idea sobre por qué esta lectura no funciona?

    
pregunta Jason Wright

1 respuesta

4

Resulta que la respuesta tenía que ver con la forma en que implementaba las transacciones SPI utilizando el SDK de Nordic.

Mi función rcvr_mmc se veía así:

static
void rcvr_mmc (
    BYTE *buff, /* Pointer to read buffer */
    UINT bc     /* Number of bytes to receive */
)
{
    nrf_drv_spi_transfer(&spi, NULL, 0, buff, bc);
}

Supuse que mi rcvr_mmc estaba funcionando porque estaba analizando correctamente las respuestas de los comandos. Sin embargo, las lecturas del sector no funcionaban en absoluto. Ni siquiera vi un ciclo completo de 512 * 8 ciclos.

Una vez que me di cuenta de que sucedió, miré más de cerca el controlador Nordic SDK SPI y descubrí esto:

enlace

Dado que las lecturas de sector pasan bc = 512, esto resultó en que no se leyera realmente nada. Mi truco muy ineficiente por ahora para obtener este trabajo es:

int i;
uint8_t small_buf[1];
for (i = 0; i < bc; i++) {
    nrf_drv_spi_transfer(&spi, NULL, 0, small_buf, 1);
    buff[i] = small_buf[0];
}
    
respondido por el Jason Wright

Lea otras preguntas en las etiquetas