Autor Tema: Problema SPI esclavo pic18f4331 ccs  (Leído 1515 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado psicko275

  • PIC10
  • *
  • Mensajes: 1
Problema SPI esclavo pic18f4331 ccs
« en: 05 de Noviembre de 2012, 11:19:29 »
Hola miembros de todopic.com, antes que nada les envió un cordial saludo.

He tenidos serios problemas con la comunicación SPI en modo esclavo en CCS V4.120, les comento que en estos momentos estoy haciendo un proyecto modular comunicando una tarjeta Arduino Mega ADK como maestro y 32 PIC18F4431 como esclavos el problema radica en que el PIC no funciona la comunicación.

El código del micro es el siguiente:
Código: [Seleccionar]
#include <main.h>
//#use spi(SLAVE, FORCE_HW, SPI2, stream=DA_spi,MSB_FIRST,mode=0)
//#use spi(SLAVE, FORCE_SW,DO=PIN_C7, DI=PIN_C4, CLK=PIN_C5, ENABLE=PIN_C6, stream=DA_spi,MSB_FIRST)
// Use Charlie U's SPI mode definitions.
#define SPI_MODE_0_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H)    //SPI Mode 0
#define SPI_MODE_0_1  (SPI_L_TO_H)                      //SPI Mode 1
#define SPI_MODE_1_0  (SPI_H_TO_L)                      //SPI Mode 2
#define SPI_MODE_1_1  (SPI_H_TO_L | SPI_XMIT_L_TO_H)    //SPI Mode 3
//#byte SSPSTAT=0xFC7

#define lcd_type 2
#include <lcd.c>

int spi_in=0, result;
//#int_SSP
//void  SSP_isr(void)
//{
////spi_in=spi_read(0);
////spi_in=spi_read();
////spi_write(0x01);
////spi_write(50);
////spi_in=spi_xfer(DA_spi,0x05);
//}

void main()
{
int spi_out;
   lcd_init();
//   setup_adc_ports(sAN0);
//   setup_adc(ADC_CLOCK_INTERNAL);
//   setup_timer_5(T5_DISABLED | T5_DIV_BY_1);
   //setup_spi (SPI_Slave| SPI_H_TO_L);
   setup_spi(SPI_Slave);
   //setup_spi(spi_slave | spi_h_to_l | spi_ss_disabled);
//   clear_interrupt(INT_SSP);
//   enable_interrupts(INT_SSP);
//   enable_interrupts(GLOBAL);
//   bit_clear(SSPSTAT,7);
   while(TRUE){
   //TODO: User Code
   OUTPUT_HIGH(PIN_C0);
   DELAY_MS(20);
   OUTPUT_LOW(PIN_C0);
   DELAY_MS(20);
   spi_out=0;
   spi_in=spi_read(spi_out);
//   while(!spi_data_is_in());
//      spi_in = spi_read();

//   spi_in=spi_xfer(DA_spi,0);
//      if(input(PIN_C6)==0){ //Chip select
//         //spi_in=spi_xfer(DA_spi,0x50);
//         //spi_write(50);
//         //spi_in=spi_read();
//       //spi_in=spi_read(0);
//         //spi_in=spi_xfer(0x00);
//         //spi_write(0x45);
//         
//      }
   lcd_gotoxy(1,1);
   printf(lcd_putc,"\fin=%u out=%u",spi_in, spi_out);
   delay_ms(1);
   }

}
Los síntomas son los siguientes:
1) Arduino envia al micro un dato cualquiera, el micro lo recibe y lo repite (cosa que según yo no debería de hacer).
2) En la línea
Código: [Seleccionar]
spi_in=spi_read(spi_out); si cambio spi_out por cualquier otro valor diferente de 0 el micro se pasma.
3) La interrupción SSP no funciona.
4) Arduino si envia el dato por SPI, genera el reloj y CS (verificado en Proteus y físico con osciloscopio).

He intentado hacerlo por software pero no funciona no se que este fallando sera la versión del CCS? he probado con la V4.130 y hace lo mismo y con otros pics como el pic18f452 y el pic18f4450 ya no se que moverle, espero puedan ayudarme.

Gracias un saludo!