comunicación CAN entre dos MCU de ARM (LPC2129)

2

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
}
    
pregunta Raghu T C

1 respuesta

1

CAN requiere que las dos resistencias de terminación, 120 \ $ \ Omega \ $ cada una, estén presentes. De lo contrario, el bus no dejará el estado de error y solo obtendrá interrupciones de error.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas