Tengo un problema al hacer que el chip MCP795W10 RTCC funcione con una MCU PIC24F16KA102. Probé el chip RTCC con un Arduino y ahí funciona perfectamente. Aquí está mi código de inicialización SPI:
void configSpi() {
IFS0bits.SPI1IF = 0; //clear spif see datasheet
IEC0bits.SPI1IE = 1; //enable spi interru
IPC2bits.SPI1IP = 0b100;
SPI1CON1bits.DISSCK = 0;
SPI1CON1bits.DISSDO = 0;
SPI1CON1bits.MODE16 = 0;
SPI1CON1bits.SSEN = 0;
SPI1CON1bits.SMP = 0;
SPI1CON1bits.MSTEN = 1;
SPI1CON1bits.CKP = 0;
SPI1CON1bits.CKE = 0;
SPI1CON1bits.SPRE = 0b110;
SPI1CON1bits.PPRE = 0b11;
SPI1STATbits.SISEL=0b101;
SPI1STATbits.SPIROV = 0;
SPI1STATbits.SPIEN = 1;
LATBbits.LATB12 = 1;}
Para escribir en el chip RTCC, uso la siguiente función
void writeSPI1( unsigned char data )
{SPI1BUF = data; }
Cuando uso esta función, MCU pasa automáticamente a la interrupción SPI y en la interrupción hago esto:
void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void) {
IFS0bits.SPI1IF = 0; // clear this bit. This bit will be set when a new reading is recieved
LATBbits.LATB8=~ LATBbits.LATB8;
if (!SPI1STATbits.SPIROV)// no overflow, you may more than one byte,it will take last byte
{
//My_Slave_Array = My_Slave_Array[spiCount++] + 1; // loop with data + 1
while (!SPI1STATbits.SPIRBF);
spiBufR = SPI1BUF;
//SPI1BUF = spiBufT; // send back
}
}
El problema es que en el código principal cuando configuro el registro de configuración (por ejemplo) y quiero volver a leerlo, pero me sale algo mal.
Código principal:
int main(void) {
LATBbits.LATB2 = 0; //wake up xbee
__C30_UART = 2;
configOscillator();
pinsetup();
//enableINT0IE(); //interrupt reed switch
//enableINT1IE(); //interrupt rtc
//enableINT2IE(); //interrupt btn config
//uart2Set();
configSpi();
//configxbee();
//getpanid();
//LATBbits.LATB2 = 1; //xbee in sleep
//setAlarmsec(10);
while(1){
unsigned char i;
LATBbits.LATB12 = 0; //begin spi
writeSPI1(0x12);
writeSPI1(0x08);
writeSPI1(0x00);
LATBbits.LATB12 = 1;
__delay_ms(10);
LATBbits.LATB12 = 0; //begin spi
writeSPI1(0x13);
writeSPI1(0x08);
writeSPI1(0x00);
i=spiBufR;
LATBbits.LATB12 = 1;
__delay_ms(10);}
return 0;
Probé muchas cosas, pero ninguna me funcionó hasta ahora. Gracias de antemano.