Estoy trabajando con un PIC18F67K22 y veo algunas cosas extrañas en el flujo de datos SPI. Estoy tratando de interactuar con una partición FAT32 usando FatFs y un archivo diskio.c personalizado. Puedo reconocer la partición FAT32, pero cuando intento crear un archivo, la operación disk_read de repente da errores extraños.
Adjunto una captura de pantalla de la lógica entre el PIC18 y la tarjeta SD para mostrar los datos inusuales.
En la captura de pantalla, puede ver que estoy enviando CMD17 (READ_SINGLE_BLOCK) junto con una dirección de 4 bytes de 0x00007D10 y una suma de verificación CRC7 para ese comando.
La respuesta de comando que recibo es 0xC1, seguida de 0x3F, ninguna de las cuales tiene sentido. De acuerdo con la sección Cómo usar MMC/SDC en el sitio web de FatFs, el bit más significativo de la respuesta del comando siempre debe ser 0, pero 0xC1 tiene el bit más significativo establecido en 1. Además, ¿por qué viene después el 0x3F? Eso debería ser 0xFF.
E incluso si asumiera que hubo un pequeño cambio aquí y que el valor real debería ser 0xC13F >> 6 (0x04), sería un comando ilegal. ¿Qué tiene de ilegal CMD17 con esa dirección? ¿La dirección de datos de 0x00007D10 no es válida? La partición debe abarcar todo el medio, excepto el MBR y el registro de arranque.
Editar:
Estos son los sectores devueltos durante la inicialización, con algunas anotaciones en los datos:
Edición 2:
Descubrí que esto solo sucede si llamo a f_mount mucho antes de f_open. Estoy haciendo un f_mount al insertar la tarjeta SD para verificar que la tarjeta sea una partición FAT16/FAT32 adecuada, y luego solo llamo a f_open cuando el usuario comienza a registrar datos. Si llamo a f_mount y f_open en rápida sucesión (o llamo a f_mount con montaje retrasado), entonces la llamada funciona bien y el comando devuelve 0x00 y luego 512 bytes de datos.
Ha pasado un año desde que se hizo la pregunta, pero decidí agregarla porque estaba teniendo problemas similares al incorporar el controlador de la tarjeta SD en FPGA. Estoy de acuerdo con los comentaristas de su pregunta en que debe brindar información sobre lo que estaba sucediendo antes del ciclo SPI fallido y lo que sucede después.
En general, si bien hay una especificación SD para las tarjetas SD, es un poco desconcertante y no me hizo pasar ni una hora entendiendo qué es lo que está mal con mi diseño.
Entonces, comencemos...
Cuando hice estos dos anteriores correctamente, ya no obtuve códigos de respuesta no válidos de la tarjeta SD. Hay algunas otras peculiaridades que manejan las tarjetas SD a través de SPI, pero deben tratarse cuando sea necesario, porque el ciclo de comando en sí, la respuesta y la fase de datos se explican relativamente bien en la especificación, y probablemente no tendrá problemas para implementarlo.
FRob
reycoyote
PkP