TODOPIC
Microcontroladores PIC => Pic32 => Mensaje iniciado por: Slalen en 10 de Junio de 2014, 07:33:59
-
Buenas!!
tengo un problema que me está empezando a desesperar.
Tengo un programa para un pic32MX575f512h en el cual controlo el bus CAN y el SPI.
Cuando llevo un rato ejecutando el programa (el rato depende de la cantidad de paquetes que se envíen por el CAN) se me va a excepción tipo DBE (bus error (load/store)) y alguna que otra vez a IBE (bus error (ifetch))
He incrementado el tamaño del SP y del Heap por si era el tema, he revisado todas las variables de las funciones y no he encontrado ningún puntero no inicializado.
He comprobado esto "- When both prefetch and instruction cache are enabled, a Data Bus Exception (DBE) may occur if an interrupt is encountered by the CPU while it is accessing constant data (not instructions) from Flash memory." que viene en la erratas.
Y nada....
siempre me salta al salir de una rutina en la que compruebo los flags de envío y envío los datos.
Pero si comento la recepción o el envío del CAN no pasa nada.
El pic tiene alguna limitación por tiempo entre lectura y escritura del CAN? no me suena, pero es que ya no sé qué pasa....
-
he conseguido localizar el puntero que se va, pero no sé porqué.
Este es el código
BOOL CAN1RxMsgProcess( void){
if (isCAN1MsgReceived == FALSE) {
return FALSE;
}
isCAN1MsgReceived = FALSE;
messageRX = (CANRxMessageBuffer *)CANGetRxMessage(CAN1,CAN_CHANNEL1);
CANUpdateChannel(CAN1, CAN_CHANNEL1);
CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);
return TRUE;
}
la variable isCAN1MsgReceived se activa en la interrupción del can, si recibo algo y el puntero messageRX está definido en la librería
el código va perfectamente salvo si recibo datos rápido, con 1s ya se va a la excepción
-
viendo el desensamblado, parece que no es lo que decía...
al parecer es al volver de una función en la que compruebo unos flags y si están activos envío por el CAN el dato correspondiente.
El problema es que salta la excepción independientemente si hay algún flag activo o no...
parece cosa del stack pointer, pero lo he incrementado y nada
-
creo que al fin lo he solucionado
definiendo la interrupción del can con prioridad 4 y el vector de la interrupción como 7 :shock: :shock: :shock: