Buenas chicos,
Cómo ya sabeis estoy un poco pillado al querer desarrollar el CAN con interrupciones. Quiero que cuando mi placa reciba un mensaje de otro SID, salte a una interrupción y procesar la trama dentro de la interrupción.
Estoy usando un PIC32 en C.
Viendo los registros, ando un poco liado, ya se cual es el registro para la prioridad, subprioridad, bandera de interrupción, y para activar el bit de interrupción del CAN1.
Pero no se muy bien que bit del registro de interrupciones del CAN1 tengo que activar para lo descrito anteriormente.
Todo me lleva a pensar en el bit RBIE del registro de nterrupciones del CAN1. Pero no estoy seguro si sólo tengo que activar éste o alguno más.
En la página 18 se puede ver el registro de interrupciones:
http://ww1.microchip.com/downloads/en/DeviceDoc/61154C.pdfLes pongo aquí parte del código (del tema de la interrupción por si así lo veis más claro):
C1CONbits.ON = 1; /*Activo el módulo CAN1*/
C1INTbits.RBIE = 1; /*Activo Interrupción de Recepción en el Buffer*/
IPC11bits.CAN1IP = 1; /*Prioridad 1*/
IPC11bits.CAN1IS = 0; /*Subprioridad 0*/
IFS1bits.CAN1IF = 0; /*Limpio la bandera de interrupción*/
/*Tengo que borrar tambien RBIF??????????????????*/
INTEnableSystemSingleVectoredInt(); /*Activa el modo Single Vector*/
IEC1bits.CAN1IE = 1; /*Activa la interrupción de CAN1*/
while(1);
return 0;
}
//Rutina de Interrupción
void __ISR(0, ipl1) InterruptHandler(void){
/*Código*/
/*Tengo que borrar tambien RBIF??????????????????*/
/******************/
CANRxMessageBuffer *buffer;
buffer = (CANRxMessageBuffer*)(PA_TO_KVA1(C1FIFOUA1));
/*Comprobar si hay algún mensaje para leer*/
if (buffer->CMSGEID.DLC == 4)
{
/*if(message->data[0] == FALSE)
{
}
else
{
}*/
}
/******************/
IFS1bits.CAN1IF = 0; /*Limpio la bandera de interrupción*/
}
Espero que me podais ayudar.
Muchas gracias.
Un saludo.