Hola
Yo cada vez que uso un tipo de pic siempre siempre tengo problemas con el SPI .... yo utilizo C30 para dsPICs y una vez configure el SPI en un 16F876 con niple ... siempre tuve este problema ... cuando envias un dato por SPI al mismo tiempo recibes un dato ... cuando le explique esto a mi asesor me dijo que era como una cadena de bicicleta .. jajaja!!
... bueno esa es la analogia ... como estas recibiendo un dato debes leerlo para que el buffer se limpie .. si volves a enviar se activa una bandera de error y el pic no hace nada de nada
... .. en el dsPIC esa bandera se llama SPIROV ... mira como hago para enviar ... la siguiente rutina me funciona bien con todo lo que sea SPI ..
IFS0bits.SPI1IF = 0; /* Borrar fin de TX/RX*/
SPI1STATbits.SPIROV = 0; /* Para reset del buffer */
SPI1BUF = dato; /* Comenzar transmision */
while( !IFS0bits.SPI1IF ); /* Esperar fin de transmision */
SPI1STATbits.SPIROV = 0; /* Leer dato */
dato_salida = SPI1BUF;
IFS0bits.SPI1IF = 0;
Observa que primero borro todas las banderas que puedan indicar que existe algun dato en el buffer ... luego envio el dato y espera a que se termine de enviar .. recuerdo muy bien que pase semanas tratando de que funcionara esa pendejada ... y solo haciendolo de esa manera me funciono!!!
Ademas, recuerdo que se puede elegir la forma del clock ... ejemplo si el estado de espera es en alto .. el activo en bajo .. el cambio en la salida es cuando la transicion del reloj es de bajo a alto .. alto a bajo .. etc ! LE PUSE DE TODAS LAS FORMAS POSIBLES ....
el unico
que me funciono fue poniendo los bits en de la configuracion en:
#define SPI1_CKE 1 /* Cambio de dato de salida,*/
/* 0: cambio de idle a active, */
/* 1: cambio de active a idle */
#define SPI1_CKP 0 /* Polaridad del reloj de salida,*/
/* 0: idle bajo y active alto, */
/* 1: idle alto y active bajo, */
Otra configuracion ... ni a p#t@s
!!! No creas .. una critica muy fuerte es que estos perifericos ( SPI, I2C, ADC, etc ) de microchip estan llenos llenos de errores y muchos modos no funcionan correctamente ... cuando tengas tiempo hechale un ojo a la hoja de silicon errata
Hace el intento variando la forma polaridad del reloj sino intentá leyendo el buffer antes de enviar cualquier dato ... SUERTE!!!