Ok, ahora mejor.
Bien, yo intenté utilizar también el SPI por hardware pero me ocurrió lo mismo que a ti. No recibía la respuesta por parte de la tarjeta en la inicialización. Pero con la ayuda de un osciloscopio descubrí que esto no era así. La tarjeta si que respondía con un 0x01 pero el pic no se porqué, siempre recibía 0x00.
Entonces decidí realizar el SPI por software. Y utilizando exactamente el mismo programa, pero con el SPI que yo generé, sí que me funcionó.
Codigo:
////////////////////////////////////////////////////////////////////////////////////////////////
//// ////
//// mi_SPI.c ////
//// ////
//// Librería para generar un bus SPI por software ////
//// ////
//// mi_SPI_WRITE( int valor ); Envía por SPI el byte que se le pasa ////
//// ////
//// int mi_SPI_READ(); Devuelve el byte leído por SPI ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////
void mi_SPI_WRITE( int valor )
{
int cont = 8;
do
{
output_low( _SCK );
delay_us(1);
if( valor & 0x80 ) // Si es un 1
output_high( _SDO );
else // Si es un 0
output_low( _SDO );
valor <<= 1;
output_high( _SCK );
delay_us(1);
} while ( --cont );
output_high( _SDO );
delay_us( 8 );
}
int mi_SPI_READ( void )
{
int cont = 8;
int valor = 0;
do
{
output_low( _SCK );
delay_us(1);
valor <<= 1;
output_high( _SCK );
if( !input( _SDI ) ) // Si es un 0
valor &= 0xFE;
else // Si es un 1
valor |= 0x01;
delay_us(1);
} while ( --cont );
delay_us( 8 );
return( valor );
}
Recuerda definir al principio del programa los pines _SCK, _SDI, _SDO y _CS, en los pines que vayas a utilizar.
Espero que te sirva 
Ya me cuentas... un saludo.
Hola!
Me alegra que lo hicieras funcionar por hardware!!
Mira, cuando haces:
Codigo:
variable = 0xA1EF;
a = HIGH( variable ); // En a tienes 0xA1
b = LOW( variable ); // Y en b tienes 0xEF
Con HIGH asignas la parte alta y con LOW la parte baja de un numero de 16bits.
Creo que tampoco me funcionó así que utilicé:
Codigo:
variable = 0xA1EF;
a = make8( variable , 1 ); // En a tienes 0xA1
b = make8( variable , 0 ); // Y en b tienes 0xEF
Con make8 creas un entero de 8 bits apartir de otro de más, como x ejemplo un int16. Se le pasa el nombre de la variable y el offset, 1 para la parte alta y 0 para la baja.
No se si habrá otra forma más sencilla, pero eso funcionaría.
Salu2