Intento comunicarme entre dos microcontroladores LPC2129 , uno como transmisor y el otro como receptor. utilizando interrupciones para transmitir y recibir el mensaje.
Las interrupciones de transmisión y recepción se producen en la simulación, pero la misma no funciona en las MCU. Pero las otras interrupciones, como el error de bus y el error pasivo están ocurriendo.
Y si llamo a la función de recepción en este ISR, el mensaje se recibirá una vez, y luego ese dispositivo pasará al modo pasivo.
Problema: aunque tengo ISR separados para la transmisión y la recepción, no se ejecuta en la MCU, PERO la ISR de la otra interrupción CAN se está ejecutando.
El código es el siguiente, por favor, ayuda.
PUEDE inicializar:
PINSEL1 |= (DWORD) 0x00054000;
C2MOD = 1; // Enter Reset Mode
C2GSR = 0; // Clear status register
C2BTR = 0x001C001D; // Set bit timing
C2IER = 0x000007FF;
AFMR = 0x00000001; // Enable recieve acceptance filter
C2MOD = 0; // Enter normal operating mode
VICIntEnable |= 0x08280000; //Enable interrupts
VICVectCntl0 = 0x00000033; //Select a priority slot for a given interrupt
VICVectAddr0 = (unsigned)CAN2_ISR; //Pass the address of the IRQ
VICVectCntl1 = 0x0000003B; //Select a priority slot for a given interrupt
VICVectAddr1 = (unsigned)CAN2_Rx_ISR; //Pass the address of the IRQ
VICVectCntl2 = 0x00000035; //Select a priority slot for a given interrupt
VICVectAddr2 = (unsigned)CAN2_Tx_ISR; //Pass the address of the IRQ
AFMR = 0x00000001; //Disable the acceptance filters
Función de transmisión:
void Tx_Frame(unsigned int ID, unsigned long LSB_4, unsigned long MSB_4, unsigned char LEN, char RTR_FF)
{
while ( (C2SR & 0x00000004) != 0x00000004)
; // Checking that the TX buffer is empty
C2TFI1 |= (LEN << 16); // Frame information (RTR=0, 11 bit identifier. And length is setting)
C2TFI1 |= (RTR_FF << 30);
C2TDA1 = LSB_4; // Data A
C2TDB1 = MSB_4; // Data B
C2TID1 = ID; // 11 bit ID or 29 bit
C2CMR = 0x21; // Command: Transmit previously written message through TX buffer 1.
}
Función de recepción:
void Rx_Frame(void)
{
DWORD DATA_A,DATA_B,LEN,ID;
LEN = C2RFS;
ID = C2RID;
DATA_A = C2RDA;
DATA_B = C2RDB;
C2CMR = 0x04; // Release receive buffer command
}