TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: Renatox_ en 06 de Enero de 2012, 12:07:53
-
Hola amigos estoy teniendo problemas para configurar el SPI en modo master del dspic30f4011, no puedo ver que se ponga a 1 el bit SPITBF cuando escribo en el SPI1BUF, tampoco veo que el flag de interrupcion SPI1IF se ponga a 1; este es mi simple codigo parece que lo he hecho bien no se en que pueda estar fallando.
void configSPI();
void __attribute__((interrupt, no_auto_psv)) _SPI1Interrupt(void);
/**************************************************************/
void __attribute__((interrupt, no_auto_psv)) _SPI1Interrupt(void)
{
IFS0bits.SPI1IF = 0;
}
void configSPI()
{
IEC0bits.SPI1IE=1;
IFS0bits.SPI1IF=0;
IPC2bits.SPI1IP=1;
// config SPI1STAT
SPI1STATbits.SPIEN=0; // configura serial port pins SDI, SDO, SCK, SS
SPI1STATbits.SPISIDL=0; // continua operacion en IDLE module
SPI1STATbits.SPIROV=0; // flag bit de sobreflujo (1=no se leyo el dato previo)
//SPI1STATbits.SPITBF=0; // read, 0= SPI1TXB vacio
//SPI1STATbits.SPIRBF=0; // read, 0= SP1RXB leido y vacio
// config SPI1CON
SPI1CONbits.FRMEN=0;
SPI1CONbits.SPIFSD=0;
SPI1CONbits.DISSDO=0; // SDO controlado por el modulo
SPI1CONbits.MODE16=1; // comunicacion es word/byte (16 bits)
SPI1CONbits.SMP=0;
SPI1CONbits.CKE=0;
SPI1CONbits.SSEN=0; // SS controlado por el puerto
SPI1CONbits.CKP=0; // estado activo en high level
SPI1CONbits.MSTEN=1; // modo MASTER
SPI1CONbits.SPRE=7; // Prescaler secundario = 1
SPI1CONbits.PPRE=2; // Prescaler primario = 4
SPI1STATbits.SPIEN=1; // configura serial port pins SDI, SDO, SCK, SS
}
int main (void)
{
configSPI();
while (1)
{
SPI1BUF=10;
}
}
ayuda porfavor
gracias
-
el SPIBF unicamente esta 1Tcy a 1, es decir, tu escribes en spibuf, entonces el modulo escribe spibuf=1, carga el spibuf en el spisr y en el siguiente ciclo spibuf=0.
El que si se pone a 1 es SPIRBF al hacer una recepcion.
Prueba a poner la prioridad a mas de 1, no recuerdo si 1 era la prioridad de codigo normal.
-
Gracias por la ayuda, ya subi la prioridad y nada tambien he puesto el SPIBUF=10 arriba del while(1):
SPI1BUF=10;
while (1);
pero tampoco consigo que salte a la interrupcion siempre se queda en while (1), tambien no puedo ver que el bit SPITBF se ponga a 1 estoy simulando con el MPLAB SIM.
-
creo que el mplab sim y digo creo porque lo he usado un par de veces solo que no emula ningun modulo excepto el timer que creo que si, yo probando mi codigo que lleva CAN SPI y demas lo tuve que desactivar porque no hacia nada.
Para lo unico que he usado el mplab sim es para ver si los calculos los hace bien.
-
Pues si tienes razon hoy implemente mi codigo y si entra en la interrupcion y observo transmision por los pines SDO y SCK, tendre mas cuidado
con el MPLAB SIM. Ahora estoy tratando de comunicar el dspic con un DAC de 12 bits el MAX5312.
saludos
gracias