Hola
Tengo una SD Card de 2GB sin formato usada como una EEPROM muy grande y un PIC32 leyéndola.
He tenido muchos problemas usándola porque en nuestro primer diseño de la PCB nos equivocamos en el pin SDI de la tarjeta y tuvimos que poner un alambre para corregirlo. La SD Card es inicializada a 125kHz y la máxima velocidad que pongo una vez inicializada es de 1MHz. Con 1MHz me permitía leerla en varios bloques sin problema. Con 6MHz (por ejemplo) me fallaba por cualquier parte del código de inicialización o de lectura.
Ahorita que estoy volviendo a usar el programa ya me volvió a dar lata. Siempre me falla la lectura con el comando 17 (leer single block), pero curiosamente siempre después de haber leído 7 bloques (512 por bloque). Me falla en la línea marcada abajo...
void SD_Card_Read(uint32_t loc, uint8_t* data)
{
uint16_t i;
uint8_t r;
SD_Card_Chip_Select(0);
r = SD_Card_Send_Command(17, loc, 0xFF); //read single-sector
if (r != 0)
{
SD_Card_Error(__LINE__);
}
// wait for not busy
do
{
r = SD_Card_Write_SPI(0xFF);
}while(r == 0xFF);
if(r != 0xFE)
{
SD_Card_Error(__LINE__); //------------> Aquí me devuelve una r = 0 (data token)
}
for (i = 0; i < SD_CARD_BLOCK_SIZE; i++)
{
data[i] = SD_Card_Write_SPI(0xFF);
}
SD_Card_Write_SPI(0xFF); //discard of CRC
SD_Card_Write_SPI(0xFF);
SD_Card_Chip_Select(1);
SD_Card_Write_SPI(0xFF);
}
Leyendo la especificación dice que siempre debe devolver un data token de 0xFE que indica que está listo para enviarme los 512 bytes del sector que pedí. El problema es que en vez de devolver un data token me devuelve un data token error en 0x00. Pero también leyendo la especificación dice que el error debe traer al menos un bit levantado, pero todos vienen en cero.
La librería SD que uso es una mezcla de muchas librerías que fui recolectando de internet. Tiene lo mejor de todas buscando que cuadre con la especificación. Mi mayor problema es la conexión volada que tenemos de SDI.
Adjunto mi librería. Me gustaría saber si hay algo que me puedan sugerir para corregir este problema. Ya bajé la velocidad a 125kHz e igualmente me falla la lectura con 0x00 en el data token.
A continuación detallo que hago en la inicialización...
Inicialización
+ Uso SPI a 125kHz
+ CS en alto
+ Envío 100 relojes SPI
+ CS en bajo
+ Envía CMD0 reset con CRC 0x95
+ Envía otros comandos que no son tan relevantes
+ Envía CMD16 para definir el tamaño de bloque en 512
+ CS en alto
+ Cambio velocidad SPI a 1MHz
La conexión de la SD es como adjunto. MISO y CS llevan pull-up a 3V3.
Cualquier sugerencia me ayudará.
Gracias.