Hola, como estan?
Estoy tratando de realizar una comunicacion SPI bidireccional entre varios pics (por el momento el maestro y un solo esclavo). La comunicacion funciona bien pero tengo un problema para responder con el esclavo.
Simulando con el proteus veo que el byte de respuesta del esclavo varia entre dos valores. El ultimo enviado por el maestro y el valor que tiene que enviar.
El codigo del maestro
#include "mother.h"
int in_data[4] ;
#int_RDA
void RDA_isr(void)
{
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
disable_interrupts(GLOBAL);
OUTPUT_LOW(PIN_B2); // slave select
while(1)
{
in_data[0] = spi_read(0xff);
delay_ms(100);
}
}
y el del escalvo
#include "driver.h"
int in_data[4] ,out_data[4] = {0xfa,0x06,0x07,0xfb} ;
#int_SSP //interrupcion SPI
void SSP_isr(void)
{
in_data[0] = spi_read(0xdd);
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SLAVE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
while(1)
{
}
}
en este programa la varable in_data del esclavo es siempre "0xff" pero la in_data del maestro varia entre "0xff" y "0xdd".
A alguien se le ocurre donde puede estar el problema?
Estoy utilizando dos 18F2550 y el ccs 4.104
Desde ya muchas gracias!
Saludos