#define clockSPI() comunicaSpi3( 0xFF)
#define readSPI() comunicaSpi3( 0xFF)
#define disableSD() SDCS = 1
#define enableSD() SDCS = 0
#define SD_COMMAND_TIMEOUT 300
void sd_init(void){
unsigned long h;
unsigned long i;
unsigned long f;
unsigned char bk[40];
unsigned char respuesta1=0x00;
unsigned char respuesta2=0x00;
unsigned char respuesta3=0x00;
unsigned char respuesta4=0x00;
TRIS_SDCS=0; //CS salida
disableSD();
for(h=0;h<10000;h++);
SettingSpi3(200);
//envio 80 pulsos
for ( i=0; i<10; i++){
clockSPI();
}
enableSD();
cmd(0);
for( f=0; f<SD_COMMAND_TIMEOUT ; f++)
{
respuesta1 = comunicaSpi3( 0xFF );
if (respuesta1==0x01)
{
sprintf((char*)bk,"memoria reset: %02X",respuesta1);
escribe_lcd1602((char*)bk,1);
break;
}
}
clockSPI();
clockSPI();
//Comando 8
// envia paquete de comandos (6 bytes)
comunicaSpi3(8 |0x40 ); // envio el comando
comunicaSpi3( 0 );
comunicaSpi3( 0 );
comunicaSpi3( 0x01 ); // ocupo 3,3v
comunicaSpi3( 0xAA ); // chk
comunicaSpi3( 0x87 ); // crc
for( f=0; f<SD_COMMAND_TIMEOUT ; f++)
{
respuesta2 = comunicaSpi3( 0xFF );
if (respuesta2==0x01)
{
sprintf((char*)bk," es v2 : %02X",respuesta2);
escribe_lcd1602((char*)bk,2);
clockSPI();
clockSPI();
clockSPI();
clockSPI();
break;
}
}
hasta:
//Comando ACMD41
cmd(55);
for( i=0; i<SD_COMMAND_TIMEOUT ; i++)
{
respuesta3 = comunicaSpi3( 0xFF );
if (respuesta3==0x01)
{
clockSPI();
escribe_lcd1602("Responde cmd55 ",2);
break;
}
}
clockSPI();
clockSPI();
cmd(1);
for( i=0; i<SD_COMMAND_TIMEOUT ; i++)
{
respuesta3 = comunicaSpi3( 0xFF );
if (respuesta3==0x00)
{
escribe_lcd1602("SPI Inicializado ",1);
break;
}
}
if (respuesta3!=0x00)
{
escribe_lcd1602("Inicializando... ",1);
goto hasta;
}
clockSPI();
clockSPI();
//Comando 16
comunicaSpi3(16|0x40 );
comunicaSpi3( 0 );
comunicaSpi3( 0 );
comunicaSpi3( 0x02 ); //512 byte
comunicaSpi3( 0 );
comunicaSpi3( 0xFF ); // crc
for( i=0; i<SD_COMMAND_TIMEOUT ; i++)
{
respuesta4 = comunicaSpi3( 0xFF );
if (respuesta4==0x00)
{
escribe_lcd1602(" Formato 512 ",2);
break;
}
}
clockSPI();
clockSPI();
disableSD();
clockSPI();
clockSPI();
}//sd_init()