SPI entre dos PICs utilizando el compilador MikroC pro for PIC

hola todos los investigadores.
pues bueno he sido seguidor de el foro por algun tiempo y me parece muy efectivo para resolver problemas que con sus comentarios se hace mas facil solucionarlos.
me atrevo a realizar el primer foro ya que estoy haciendo mi tesis y una parte consta de la comunicacion SPI entre un PIC maestro y varios Escalvos.y es en esta parte donde llevo rato queriendo solucionar un proble......

pues bien lo primero que realice fue establecer la comunicacion entre un esclavo y un maestro: el maestro envia un dato y el esclavo devuelve el mismo para que el master lo presente en un puerto, y me funciono. con la unica diferencia que uitilice el compilador de CCs. ahora lo mismo ago pero con el MikroC pro for PIC y no funciona. debo utilizar el Mickro C pro de ley. como veran la prueba que realizo es muy sencilla. pero nada de nada.

por favor algun comentario de alguien que haya trabajado con MIkroC pro. les agradeceria mucho.

aui les pongo el codigo del CCs y de MIkroC pro:

$$$$$$$$$$$$$$$$$$$$$$$$$$$$------MASTER--------$$$$$$$$$$$$$$$$$$$$$$$$$$

#include <C:\Program Files (x86)\PICC\Devices\18F452.H>
#fuses HS,NOWDT,NOPROTECT
#use delay (clock=20M)
char dat;

void main(){

set_tris_b(0b00000000);
set_tris_c(0b00010000);

output_high(PIN_c0);

setup_spi(SPI_MASTER|spi_l_to_h |spi_clk_div_64);

output_low(PIN_c0);

output_b(0x00);
delay_us(5);
output_b(0xff);
delay_us(5);

spi_write(0x0f); //dato a enviar
while(spi_data_is_in()==0);
dat=spi_read();

output_b(dat);
spi_write(0xff);// ciclos de reloj para que el esclavo me devuelva el dato
//inicialmete enviado por el maestro(0f).
while(spi_data_is_in()==0);
dat=spi_read();

output_b(dat);// presentacion del dato.

//spi_write(0xaa);


}

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


$$$$$$$$$$$$$$$$$$$$------------ESCLAVO---------------$$$$$$$$$$$$$$$$$$$$$

#include <C:\Program Files (x86)\PICC\Devices\18F2553.H>
#fuses HS,NOWDT,NOPROTECT
#use delay (clock=20M)

char dat;
void main(){

set_tris_c(0b00000000);


setup_spi(SPI_SLAVE|spi_l_to_h |spi_clk_div_16);

while(spi_data_is_in()==0)output_low(PIN_c0);

dat=spi_read();


spi_write(dat);

output_high(PIN_c0);



}

ahora el problema:

codigo maestro.

char dat;

void main(){
trisb=0x00;
trisc=0b00010000;
trisc.f0=1;// pin utilizado para activar el chip escalvo.

SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
trisc.f0=0;
portb=0x00;
delay_us(5);
trisb=0xff;
delay_us(5);

SPI1_Write(0x0f);// dato a enviar.
while(sspstat.f0==0);// espero hasta que el escl me responda, logicamente este dato que recivo lo descarto porque no es el correcto.
dat=SPI1_Read(sspbuf);
portb=dat;
SPI1_Write(0xff);
while(sspstat.f0==0);
dat=SPI1_Read(sspbuf);// con este dato se qauedara el puerto B que deberia
// ser en teoriA 0x0f;


portb=dat;

}

codigo esclavo:

char dat;
void main() {

trisc=0x00;
SPI1_Init_Advanced(_SPI_SLAVE_SS_ENABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
while(SSPSTAT.f0==0)trisc.f0=0; //senal de que estoy esperando el dato.
dat=SPI1_Read(sspbuf);
SPI1_Write(dat); //dejo cargando el registro SSPBUF para que en el
//segundo dato enviado por el maestro el esclavo devuelva el primer datoque envio.
trisc.f0=1; // el dato esta listo en el PIC maestro



}

la unica diferencia respecto del CCs es que ahi tengo un comando que me indica cuando un dato esta presente en el registro SSPBUF(spi_data_is_in()), el cueal lo utilizo para ver cuando
debo leer o escribir. pero entiendo que leyendo el bit BF sel SsPSTAT ago lo mismmo?

no se cual puede ser el error.........................
 
Última edición:
hola todos ! gracias por sus comentarios me fueron de mucha utilidad.
pero ya estoy comunicaNDO A LOS DOS ESCLAVOS CON UNO MAESTRO VIA SPI, SI ALGUIEN LE INTERESA EL CODIGO. AQUI MI MAIL leo28_chin@hotmail.com me communican gustoso en ayudarles.

ola que tal estoy aciendo lo mismo con el mikroc pero me gustaria saber que utilizaste para saber si el buffer esta lleno lo hice con interrupcion del puerto pero no funciona
 
hola todos ! gracias por sus comentarios me fueron de mucha utilidad.
pero ya estoy comunicaNDO A LOS DOS ESCLAVOS CON UNO MAESTRO VIA SPI, SI ALGUIEN LE INTERESA EL CODIGO. AQUI MI MAIL leo28_chin@hotmail.com me communican gustoso en ayudarles.



Hola Leonardp, estamos trabajando en la tesis y necesitamos establecer una comunicación SPI entre 2 pic's (16f887- master y 18f2550-slave), pero hemos tenido muchos problemas, utilizamos comunicación HID_USB entre la PC y el 18f2550 pero la counicación SPI se nos queda colgada, y no envía los datos correctamente, ademas aparecen unos datos filtrados y no sabemos d donde.

Tu me podrías facilitar tu código, que aunq no sea el mismo pic, nos podría ser d gran utilidad para nuestro problema.

Te agradezco, espero tu respuesta.
 
Atrás
Arriba