PIC24F16KA102 Problema SPI con el chip RTC MCP795W10

0

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.

    
pregunta Zinedine

2 respuestas

1

Hola, solucioné el problema. Eliminé la interrupción y espero una respuesta cuando lo escucho para que vea mi código a continuación. Gracias por su tiempo.

void configSpi() {
SPI1STATbits.SPIEN      = 0;
SPI1BUF                 = 0;
IFS0bits.SPI1IF = 0; //clear spif see datasheet
IEC0bits.SPI1IE = 0; //enable spi interrupt
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 = 1;
SPI1CON1bits.SPRE = 0b110;
SPI1CON1bits.PPRE = 0b11;
//SPI1STATbits.SISEL=0b101;
SPI1STATbits.SPIROV = 0;
SPI1CON2bits.FRMEN = 0; // desactivation du mode framed
SPI1CON2bits.SPIBEN = 0;    // desactivation du buffer
SPI1STATbits.SPIEN = 1;     
LATBbits.LATB12 = 1;

}

y esto es para escribir y leer

unsigned short writeSPI1( unsigned short data ){
SPI1BUF = data;                 // write to buffer for TX
while(!SPI1STATbits.SPIRBF);    // wait for transfer to complete
return SPI1BUF;                 // read the received value
}//writeSPI1
    
respondido por el Zinedine
0

Debería leer el SPI1BUF en la entrada de writeSPI1 () y luego sondear el bit SPIRBF antes de salir de writeSPI1 ().

Su rutina de interrupción actual no se ejecuta hasta DESPUÉS de que se complete la transmisión SPI completa, lo que significa que se pueden rellenar varios bytes en el registro de transmisión antes de que se ejecute la ISR de interrupción, y para entonces ya se ha producido un error de sobrescritura.

Además, está eliminando la selección del esclavo SS demasiado pronto, inmediatamente después de cargar el registro de transmisión, y antes de que el esclavo pueda recibir completamente el byte transmitido o devolver el byte de retorno.

    
respondido por el Entrepreneur

Lea otras preguntas en las etiquetas