Cómo Recibir un dato de 16bits por SPI? separar 8 y 8

#1
Buenas! Estoy armando un control R.F con analógicos y no entiendo mucho el tema de SPI.
El problema que me surgió es que no sé como recibir el dato, se que envío 8bits de eje X y 8bits de eje Y, pero al enviarlo supongo que se junta en un dato de 16 bits y a la hora de recibirlo no sé cómo separarlo sin perder información.

Para enviar hago esto:
PHP:
do{
PORTB = ADC_GET_SAMPLE(0); //leo el chanel 0
                delay_us(20);
                VRX = PORTB;
                SPI1_Write(VRX);   //envio el dato VRX
                while(SSPSTAT.BF==1);  //mientras el buffer esta en 1
                delay_ms(100);
                PORTD = ADC_GET_SAMPLE(1);
                delay_us(20);
                VRY = PORTD;
                SPI1_Write(VRY);
                while(SSPSTAT.BF==1);
                delay_ms(100);
             }while(1);
¿Cómo podría hacer para recibirlo?
Si me pueden dar una manito se los agradecería mucho. Saludos.

PD: uso mikroC. Es comunicación entre dos PIC (16F877A y 18F4550)
 
Última edición por un moderador:
#2
A menos de que el registro de entrada sea de 16bits (y lo dudo con esos PIC), deberías recibirlos como 8 bits y el microcontrolador tener una interrupción cuando eso pasa, entonces solo sacar los datos y listo, por que el buffer se borra al siguiente dato y el SPI es síncrono simultáneo, los datos entran y salen al mismo tiempo, y para esos PIC una ves que se transmite el dato recibido ocupa el mismo buffer.
 
#3
Hola, pues puedes declarar dos variables, una para X y otra para Y y en la misma rutina de recepción guardar ambos valores recibidos en cada variable respectiva. Como dice Nuyel auxíliate de las banderas de interrupción para saber cuando se ha terminado de recibir un dato.
 
#4
Puedes declarar una variable int de 16 bits y juntarlos:

Valor = alto*256+bajo

Alto y bajo son bytes de 8 bits

En la rutina de recepción harás algo así como

Alto=byte recibido;
Bajo=byte recibido;
 
#6
lo que yo haria seria recibir los 16 bits de 1 tajo y seprara X y Y

unsigned int dato
unsigned char X, y;

X=dato &0X0F ; // el char se carga con el primer byte y lo enmascaro para quitar basura

y=(dato >>8) & 0X0F; //roto 8 veces a la derecha y lo enmascaro para quitar basura

y asi obtengo 2 bytes rebanados como jamon

que es mas comodo trabajar asi que con un int de 16 o 32 bytes
 
Última edición:
#7
Me tira un corto en SCK, proteus dice "MSSP slave mode with no SS pin control and CKE==1 is ambiguous!"
Hasta donde se tengo todo configurado como corresponde, dejo ambos codigos, espero alguien pueda echarle un ojo y ayudarme con el tema! muchas gracias!
 

Adjuntos

#8
Pues eso, al esclavo hay que seleccionarlo con un pin. Parece que no lo has conectado o que está mal.
No tengo proteus, así que no lo puedo ver.
 
Arriba