Autor Tema: Instrucciones SPI bloqueadas en PIC18F2550  (Leído 3683 veces)

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

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Instrucciones SPI bloqueadas en PIC18F2550
« en: 16 de Octubre de 2009, 07:14:37 »
Hola picmaniacos!!

Tengo un problema con el micro PIC18F2550 y su SPI. Las instrucciones spi_write y spi_read, hacen que el micro se quede completamente bloqueado. Esas mismas instrucciones funcionan correctamente en el PIC16F722, y hacen que su periférico MRF24J40, funcione a las mil maravillas. Hasta donde yo se, el spi no depende de los fuses, solo de un setup y de estas instrucciones que he mencionado anteriormente. No se si sera relevante pero lo añado que el micro también se comunica con el PC mediante USB y si no se bloquea en esa instrucción funciona bien. Uso el CCS 4.084 y paso el código al micro con el MPLAB 8.30 con el PICkit2. Bueno ahí va el código:
Código: [Seleccionar]
#include <18F2550.h>

#device adc=8



#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HSPLL                    //High Speed Crystal/Resonator with PLL enabled
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV28                   //Brownout reset at 2.8V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLPT1OSC                //Timer1 configured for higher power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES PLL3                     //Divide By 3(12MHz oscillator input)
#FUSES CPUDIV1                  //No System Clock Postscaler
#FUSES VREGEN                   //USB voltage regulator enabled

#use delay(clock=12000000)

/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <maestroSPI_v1_0.h>  //Configuración del USB y los descriptores para este dispositivo 
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#include <string.h>
#include <MRF24J40.h>
#include <MIspi.c>
#include <MIMenu.c>
#include <MISinterrupciones.c>

/////////////////////////////////////////////////////////////////////////////
//
// Al conectar el PicUSB al PC encendemos el Led Rojo hasta que el dispositivo
// halla sido configurado por el PC, en ese momento encederemos el Led Verde.
// Esperaremos hasta que se reciba un paquete proveniente del PC. Comprobaremos
// el primer byte del paquete recibido para comprobar si queremos entrar en el
// modo Suma, donde se realizará una suma de dos operandos, que corresponderan
// con los dos bytes restantes del paquete recibido; una vez realizada la suma
// enviaremos el paquete con el resultado de vuelta al PC. Si entramos en el
// modo Led comprobaremos el segundo byte del paquete recibido para comprobar
// si deberemos apagar los leds, encender el verder o el rojo.
//
/////////////////////////////////////////////////////////////////////////////



#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado envia[0]

 //#locate SSPBUF  =  0XFC9
 //#locate SSPCON  =  0XFC6
 //#locate SSPSTAT =  0XFC7

int8 recibe[3];                  //declaramos variables
int8 envia[1];
int8 data;

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   //setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   //SSPCON=0b00100010;
   //SSPSTAT=0b01000000; //esta es la configuracion definitiva para cumplir
   //con las exigencias del cronograma del fabricante del MRF24J40
   //SSPBUF=0XFF;
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64); //configuracion del SPI para que funcione el MRF24J40
   LCDdelay (0x03);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   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);
   DISABLE_INTERRUPTS(INT_EXT);
   DISABLE_INTERRUPTS(INT_EXT1);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_EXT2);
   EXT_INT_EDGE(L_TO_H);
   enable_interrupts(GLOBAL);
   set_tris_a (0xE0);          // Configurado como salida el puerto A
   set_tris_b (0xE6);          // Configurado forma   I/O el puerto B
   set_tris_c (0xB8);          // Configurado forma   I/O el puerto C
   
   output_high(CSn);
   output_high(RSn);

SET_TIMER0(0xFFE2);
//SPIconf();
   
   //SPIputcorto(SOFTRST,0x07);

spi_write(0x2A); //se queda bloqueado aquí, no pasa de esta instruccion, tanto en modo programar o en debuguer.
   
   LED_OFF(LEDR);
   LED_OFF(LEDV1);
   LED_OFF(LEDV2);
   LED_OFF(LEDV3);
   LED_OFF(LEDV4);..........................

Hay mas código, pero no he puesto mas por que se queda completamente bloqueado en esa instrucción, y no es problema del periferico, porque lo desconecto y sigue pasando igual.
He mirado primero en este foro y se comenta lo ocurrido con la combinación del I2C y el USB, como van a las mismas patillas pueden tener relación, pero mirando en el datasheet en realidad son módulos distintos, usando partes distintas de registros.
Por favor si alguien le ha pasado lo mismo o algo parecido si puede ayudarme se lo agradecería mucho.
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Instrucciones SPI bloqueadas en PIC18F2550
« Respuesta #1 en: 16 de Octubre de 2009, 12:17:12 »
Hola.

El SPI en el 2550 esta en los pines RB0, RB1 y RC7, y funcionan normalmente.
El papel lo aguanta todo

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: Instrucciones SPI bloqueadas en PIC18F2550
« Respuesta #2 en: 16 de Octubre de 2009, 13:20:19 »
He ahí el error, muchas gracias MLO, a veces mirando los arboles uno no ve el bosque....

Antes estaba mal:
Código: [Seleccionar]
set_tris_a (0xE0);          // Configurado como salida el puerto A
   set_tris_b (0xE6);          // Configurado forma   I/O el puerto B
   set_tris_c (0xB8);          // Configurado forma   I/O el puerto C
ahora esta bien y funciona  :-/
Código: [Seleccionar]
set_tris_a (0x20);          // Configurado como salida el puerto A
   set_tris_b (0xE5);          // Configurado forma   I/O el puerto B
   set_tris_c (0x07);          // Configurado forma   I/O el puerto C

Mira que le di vueltas al asunto y no me percate, en fin muchas gracias :)
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Instrucciones SPI bloqueadas en PIC18F2550
« Respuesta #3 en: 16 de Octubre de 2009, 15:17:56 »
Ok.  ;-)
El papel lo aguanta todo