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:
#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.