Anoche, despues de horas de depuración, me di cuenta de que el problema es que al tener el micro corriendo a 40mips (FCY=40Mhz, Fosc=80mhz), cuando inicialmente tengo el clock del SPI en 625Khz, al escribir:
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64); //asi inicializo SPI para que el clock del SPI sea de 625khz
OUTPUT_LOW(PIN_B9); //para activar el trigger
for(i=0;i<256;i++)
{
SPI_WRITE(i); //escribo el valor de i al SPI (modo 8bits)
}
el procesador va tan rapido que escribe datos en el buffer de salida SPI1BUF aun cuando no se han terminado de enviar los primeros datos, entonces a esa velocidad, lo solucioné colocando un delay de 2us y ahora se comportade manera normal...
ahora el resultado de este código:
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64); //asi inicializo SPI para que el clock del SPI sea de 625khz
OUTPUT_LOW(PIN_B9); //para activar el trigger
for(i=0;i<256;i++)
{
SPI_WRITE(i); //escribo el valor de i al SPI (modo 8bits)
[b]delay_us(2);[/b]
}
es el siguiente:
luego, cuando coloco el clock del SPI a 10Mhz (setup_spi(SPI_MASTER | SPI_L_TO_H |
SPI_CLK_DIV_4);
no hace falta colocarle ningun delay al bucle de escritura del SPI y el resultado con este código:
void EnviaSD (char data) //Función para enviar los datos a la SD
{
char buffer;
SPI1BUF = data;
while (SPITBF);
buffer = SPI1BUF;//para que no quede ativada la bandera de buffer de recepcion full
}
//////////en una funcion para enviar el CMD0 ///////////
// envia 80 clocks
for (i = 0; i < 10; i++) SD8pulsos (); //ya aca no tengo necesidad de delays porque estoy corriendo el SPI a 10Mhz
// envia CMD0 -> Idle state
SeleccionaSD (TRUE);
EnviaSD (0x40); // CMD0
EnviaSD (0x00);
EnviaSD (0x00);
EnviaSD (0x00);
EnviaSD (0x00);
EnviaSD (0x95); // CRC - OK
SD8pulsos ();
//// ... ////
el resultado es este:
antes del 0x40 hay 80 bytes con 0xFF y luego sale el comando que colocamos en el código finalizando en 0x95, sin necesidad de colocar ningun tipo de delay
EL analizador lógico que utilizo no lo considero para nada costoso, para lo completo que es el modelo es "Zeroplus Logic Cube LAPC-16032" y con las puntas de pruebas adicionales me costo como 160USD en una tienda por internet de MIAMI.