Que tal a todos, de nuevo dando lata, pues veran mi pregunta tiene que ver con la comunicacion SPI entre dos PIC's 18F4550, uno como maestro y el otro como esclavo (obvio jeje), se que hay mucha informacion y temas sobre esto en el foro, pero de verdad que lo he leido casi todo, y no logro hacer que el esclavo me envie datos, si me recibe datos, pero no me responde, entonces, concretando la pregunta:
¿Cual debe ser la secuencia correcta para que el esclavo envie un dato, por ejemplo un 0x02?
hasta ahora esto es lo que tengo:
Para el maestro:
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(MASTER,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,MODE=1,BITS=8,FORCE_HW)
#BYTE TRISB=0xF93
#BYTE PORTB=0xF81
void main(void)
{
bit_clear(TRISB,7);
bit_set(PORTB,7);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);
bit_clear(PORTB,7);
while(1)
{
spi_write(0x01);
delay_ms(1000);
}
}
Y para el esclavo:
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(SLAVE,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,ENABLE=PIN_A5,MODE=1,BITS=8,FORCE_HW)
#BYTE TRISB=0xF93
#BYTE PORTB=0xF81
int dato;
void main(void)
{
bit_clear(TRISB,7);
bit_clear(PORTB,7);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);
while(1)
{
if(spi_data_is_in())
{
dato=spi_read();
if(dato==0x01)
{
bit_set(PORTB,7);
delay_ms(400);
bit_clear(PORTB,7);
delay_ms(400);
}
}
}
}
Con esto solo le envio cada segundo un 0x01 desde el maestro hacia el esclavo, lo he simulado en proteus y funciona, he puesto un led en el RB7 del esclavo que parpadea cada ves que lee el dato.
Utilizo el RB7 del maestro para el chip select.
No soy experto en esto, de echo es la primera vez que lo uso, espero me puedan ayudar y claro corregir, que seguro la estoy regando en algo.
Gracias