Comunicación CAN entre dos MCU ARM (LPC2129)

Estoy tratando de comunicarme entre dos microcontroladores LPC2129 , uno como transmisor y otro como receptor, usando interrupciones para transmitir y recibir el mensaje.

Las interrupciones de transmisión y recepción están ocurriendo en la simulación, pero lo mismo no funciona en las MCU. Pero las otras interrupciones, como error de bus y 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 transmisión y recepción, no se ejecuta en la MCU, PERO se ejecuta el ISR de la otra interrupción CAN.

El código es el siguiente por favor ayuda.

CAN inicialización:

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.
}

Recibir funció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
}
Huele a error de hardware del bus CAN. ¿Cómo está cableado el bus CAN, qué transceptores usa?
usando el transceptor MCP2551 y conectado de la siguiente manera MCU RD2 a MCP2551 Rx, MCU TD2 a MCP2551 Tx. Y para la conexión de bus: CANH de un MCP2551 está conectado a CANH en Otro MCP 2551 directamente a través de un cable y de la misma manera para CANL también.
¿Puedes conectar CANalyzer en el autobús y ver qué está pasando? ¡Espero que la tasa de baudios de ambos nodos sea la misma!

Respuestas (1)

CAN requiere las dos resistencias de terminación, 120 Ω cada uno, estar presente. De lo contrario, el bus no dejará el estado de error y solo obtendrá interrupciones de error.

Estoy usando una resistencia de 120 ohmios en cada lado, pero recibo un error de ranura ACK continuamente del transmisor. He conectado directamente dos módulos MCp2551 como CANH-CANH y CANL-CANL. sugiera cómo eliminar este error de ranura ACK