Hola muy buenas un saludo a todos!
Como reza en el titulo del post, no me funciona el SCK en CCS, sin embargo el pin esta bien, he comprobado los diodos que llevan todos los pines y ninguno esta roto, he probado con dos micros de PIC16F722 y uno PIC18F2550, y nada. Solo consigo 0.00 voltios. Porque debería medir algo en continua si tengo una señal de reloj. Lo he probado como pin I/O convencional y funcionan bien.
El caso es que las instrucciones las hace porque si que saca bits por el SDO, ya que en este pin, si que mido dependiendo de que valores envíe. Quiero que trabaje como maestro sobre un transceptor, pero claro si no le envía señal de reloj no hay nada que hacer.
Os pregunto porque ya de verdad no se que hacer. Este es el código que hago en CCS versión 4.084
#include <esclavo_SPI_v1_0.h>
#include <MRF24J40.h>
#include <MIspi.c>
BYTE dato;
void main()
{
#use spi // esto lo he puesto por probar pero tampoco da ningun resultado, se supone que lo hace ya el setup_SPI
set_tris_a (0x00); // Configurado como salida el puerto A
set_tris_b (0xF1); // Configurado forma I/O el puerto B
set_tris_c (0xD0); // Configurado forma I/O el puerto C
setup_oscillator(OSC_500KHZ);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64|SPI_SAMPLE_AT_END);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_vref(FALSE);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
spi_write(0xFF); //he leído que hay que escribir algo en el registro SSPBUFF de ahí esa instrucción.
SPIconf(); // función de configuración del esclavo en cuestión.
while(TRUE)
{
dato=spi_read(0); //el cero lo pongo porque ley que si era el máster debía llevarlo.
dato=SPIgetcorto(TXMCR);
dato=SPIget(0x024c);
dato=SPIgetcorto(ORDER);
}
}
Mis fuses son estos.
#include <16F722.h>
#device *=16
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV19
#FUSES PLLEN
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOVCAP
#use delay(clock=500000)
#define SPI_CLK PIN_C3
#define SPI_DI PIN_C4
#define SPI_DO PIN_C5
#define CSn PIN_B3
#define wake PIN_B2
#define RSn PIN_B1
mis funciones para el SPI:
BYTE SPIgetcorto(BYTE direccion)
{
BYTE data;
BYTE parte;
parte=(direccion<<1)&(0b01111110);
//if (parte==0x20){print8bits1c(2,12,0x53);}
output_low(CSn);
spi_write(parte);
//data=spi_read(0);
if( spi_data_is_in() )
{data = spi_read(0);}
output_high(CSn);
return data;
}
void SPIputcorto(BYTE direccion, BYTE dato)
{
BYTE parte;
parte=((direccion<<1)&(0b01111110)|0x01);
output_low(CSn);
spi_write(parte);
spi_write(dato);
output_high(CSn);
}
BYTE SPIget(unsigned int16 direccion)
{
BYTE parteH;
BYTE parteL;
BYTE data; // (direccion>>3)&(0b01111111)|0x80 (direccion<<5)&(0b01110000)
parteL=direccion<<5;
parteH=direccion>>3|0x80;
//if (parteH==0xc9){print8bits1c(2,12,0x53);}
//if (parteL==0x80){print8bits1c(2,0,0x55);}
output_low(CSn);
spi_write(parteH);
spi_write(parteL);
data=spi_read();
output_high(CSn);
//if (data==0x00){print8bits1c(2,3,0x52);}
//else {print8bits1c(2,6,0x54);}
return data;
}
void SPIput(unsigned int16 direccion, BYTE dato)
{
BYTE parteH;
BYTE parteL;
parteL=direccion<<5|0x10;
parteH=direccion>>3|0x80;
output_low(CSn);
spi_write(parteH);
spi_write(parteL);
spi_write(dato);
output_high(CSn);
}
void SPIconf (void)
{
OUTPUT_LOW(RSn);
LCDdelay(254);
LCDdelay(254);
OUTPUT_HIGH(RSn);
LCDdelay(254);
LCDdelay(254);
}
He podido ver en este mismo foro algunos otros ejemplos de uso del SPI, pero combinan el lenguaje C con lenguaje ensamblador, usado para memorias y otros aparatos. Pero no me logro aclarar con nada.
En fin todo consejo o ayuda lo agradecería mucho, un saludo a todos